高并发的瓶颈就是数据库 笔记记录
下面是redis 的client 端操作,一般还可以和上篇map+lock 联合使用。都是帮助数据库减压的好手段.
//redis.go
var redisClient *redis.Client
func redisInit() {
if redisClient == nil {
redisClient = redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "xxx",
DB: 0,
})
}
}
//设置缓存如果是对象那转换成字符串
func Put(key string, obj interface{}) error {
redisInit()
value := obj
val, err := json.Marshal(obj)
if err == nil {
value = string(val)
} else {
logs.Debug(err)
}
err = redisClient.Set(key, value, 0).Err()
if err != nil {
logs.Error("PutCache", key, err)
}
return nil
}
func PutStr(key string, data string) error {
redisInit()
err := redisClient.Set(key, data, 0).Err()
if err != nil {
logs.Error("PutCache", key, err)
}
return nil
}
//取键列表.
func KeyList(cursor uint64, pattern string, count int64) []string {
redisInit()
keys, cur, err := redisClient.Scan(cursor, pattern, count).Result()
logs.Info(len(keys), cur, err)
return keys
}
//租约机制
func PutbyTime(key string, obj interface{}, timeout time.Duration) {
redisInit()
value := obj
val, err := json.Marshal(obj)
if err == nil {
value = string(val)
} else {
return
}
err = redisClient.Set(key, value, timeout).Err()
if err != nil {
logs.Error("PutCache", key, err)
}
}
//取字符串
func Get(key string) string {
redisInit()
val, err := redisClient.Get(key).Result()
if err != nil {
logs.Error("GetCache", key, err)
}
return val
}
//取结构对象
func GetObj(key string, retobj interface{}) error {
redisInit()
val, err := redisClient.Get(key).Result()
if err != nil {
logs.Error("GetCache", key, err)
return err
}
json.Unmarshal([]byte(val), &retobj)
return err
}
//清除all
func Clear() {
redisInit()
redisClient.FlushAll()
}
//删除
func Delete(key string) {
redisInit()
redisClient.Del(key)
}