下面展示一個實驗,把K是string,V是[]string,存入redis中
如果V在redis中存在,則要追加資料
func saveUserDisLike(userDisLikeMap map[string][]string, redisName string) {
countScope := countstat.GetCountGlobal().NewCountScope("saveUserDisLike")
countScope.SetErr()
defer countScope.End()
rdsClient, ok := client.Clientmanager.GetRedisClient(redisName)
if !ok {
log.Errorf("[%s] get redis client err, key:%s", redisName)
return
}
for k, v := range userDisLikeMap {
//檢視k在redis中是否存在
data, err := rdsClient.Get(k)
if err != nil || data == nil {//data==nil表示這個k在redis中不存在
log.Warnf("get nil or rds get err: %v", err)
continue
}
//走到這裡,表示redis中存在k,則要取出K的v,追加資料
//這裡要注意,從redis取出v後,一定要反序列化到它真實的結構上
resultList := make([]string, 0)
if err := json.Unmarshal(data.([]byte), &resultList); err != nil {
log.Warnf("unmarshal err: %v", err)
continue
}
//追加資料
v = append(v, resultList...)
if len(v) > DISLIKE_MAX_NUM {
v = v[:DISLIKE_MAX_NUM]
}
userDisLikeMap[k] = v
}
saveDatas := make([]interface{}, 0, 2*len(userDisLikeMap))
for key, disLikeReason := range userDisLikeMap {
//為了執行Mset,一個key一個value放好
//先放key
saveDatas = append(saveDatas, key) //key
//對value進行序列化
value, err := json.Marshal(disLikeReason)
if err != nil || value == nil {
log.Warnf("Marshal err: %v", err)
continue
}
//再放value
saveDatas = append(saveDatas, value) //value
}
//MSet批量更新
if e := rdsClient.MSet(saveDatas); e != nil {
log.Warnf("mset[%v] error %s", saveDatas, e.Error())
}
countScope.SetOk()
}