golang redis使用

Golang · Fecmall · 于 5年前 发布 · 4549 次阅读

redisRepository.go

package repository

import (
	"time"

	"github.com/gomodule/redigo/redis"
)

var Redis redisconection

type redisconection struct {
	Main *redis.Pool
}

//InitRedis initialize connection for redis and store it into redis pool
func InitRedis(redisAddr string) {
	clientRedisMain := connectRedis(redisAddr)

	Redis = redisconection{
		Main: clientRedisMain,
	}
}

func connectRedis(connStr string) *redis.Pool {
	return &redis.Pool{
		MaxIdle:     3,
		IdleTimeout: 10 * time.Second,
		Dial:        func() (redis.Conn, error) { return redis.Dial("tcp", connStr) },
	}
}

func (r redisconection) getIntAndDelete(key string) (int, error) {
	mainRedis := r.Main.Get()
	defer mainRedis.Close()

	dataInt, err := redis.Int(mainRedis.Do("GET", key))
	if err != nil && err != redis.ErrNil {
		log.Errorf("[redis][getInt] error in retrieving redis data [key: %s] %s", key, err.Error())
		return dataInt, err
	}
	_, err = mainRedis.Do("DEL", key)
	if err != nil {
		log.Errorf("[redis][getInt] error in del redis data [key: %s] %s", key, err.Error())
		return dataInt, err
	}
	return dataInt, nil
}

func (r redisconection) increaseAuto(key string) error {
	mainRedis := r.Main.Get()
	defer mainRedis.Close()

	//storing to redis
	_, err := mainRedis.Do("INCRBY", key, 1)
	if err != nil {
		log.Errorf("[redis][increaseAuto] error storing data to redis [key: %s]: %s", key, err.Error())
	}
	log.Println("updating redis", key)

	return nil
}

func (r redisconection) getBytes(key string) ([]byte, error) {
	mainRedis := r.Main.Get()
	defer mainRedis.Close()

	dataInBytes, err := redis.Bytes(mainRedis.Do("GET", key))
	if err != nil && err != redis.ErrNil {
		log.Errorf("[redis][getBytes] error in retrieving redis data [key: %s] %s", key, err.Error())
		return dataInBytes, err
	}

	return dataInBytes, nil
}

func (r redisconection) setBytes(key string, data []byte, ttl int) error {
	mainRedis := r.Main.Get()
	defer mainRedis.Close()

	//storing to redis
	_, err := redis.String(mainRedis.Do("SETEX", key, ttl, data))
	if err != nil {
		log.Errorf("[redis][setBytes] error storing data to redis [key: %s]: %s", key, err.Error())
	}
	log.Println("updating redis", key)

	return nil
}

func (r redisconection) delCache(key string) error {
	mainRedis := r.Main.Get()
	defer mainRedis.Close()

	_, err := mainRedis.Do("DEL", key)
	if err != nil {
		log.Errorf("[redis][getBytes] error in deleting keys : %s, %s", key, err.Error())
	}
	return nil
}

使用

1.set

analysisData := []model.DashboardViewsAnalysis{}

//set data in redis
	viewDataBytes, errRedis := json.Marshal(analysisData)
	if errRedis != nil {
		log.Errorf("[repository][GetAll] error marshaling data %s", errRedis.Error())
		return analysisData, nil
	}

	_ = dashboardRepo.redis.setBytes(redisKeyName, viewDataBytes, flags.REDIS_CACHE_ONE_DAY)

	return analysisData, nil

2.get

//get data from redis
	redisKeyName := "dashboard_views_type_analysis_" + strconv.Itoa(countType)
	viewDataBytes, _ := dashboardRepo.redis.getBytes(redisKeyName)
	if len(viewDataBytes) > 0 {
		if err := json.Unmarshal(viewDataBytes, &analysisData); err != nil {
			log.Errorf("[repository][GetAll] error unmarshalling: %s", string(viewDataBytes))
			return analysisData, err
		}
		log.Info("returning result obtained from redis")
		return analysisData, nil
	}

共收到 0 条回复
没有找到数据。
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics