package redisjson import ( "encoding/json" "fmt" "log" "bp.365521.xyz/BP/redis_v2/redis" "github.com/nitishm/go-rejson" //"github.com/nitishm/go-rejson/v4/rjs" ) type RedisJsonUtil struct { Rh *rejson.Handler GoRedis *redis.GoRedis } func NewRedisJsonUtil(opt interface{}) (r *RedisJsonUtil) { r = &RedisJsonUtil{} r.GoRedis = &redis.GoRedis{} r.GoRedis.Init(opt) r.Rh = rejson.NewReJSONHandler() r.Rh.SetGoRedisClient(r.GoRedis.CMap[r.GoRedis.DB]) //暂不考虑集群 return } //保存对象 func (r *RedisJsonUtil) Save(coll string, obj interface{}) { id := r.GetId(coll) if m, ok := obj.(map[string]interface{}); ok { //map时增加id元素 m["_id"] = id obj = m } res, err := r.Rh.JSONSet(fmt.Sprintf("%s:%d", coll, id), ".", obj) log.Println(id, res, err) } //保存对象 func (r *RedisJsonUtil) SaveByKey(key string, obj interface{}) { res, err := r.Rh.JSONSet(key, ".", obj) log.Println(key, res, err) } //根据Id获取对象 /* 注:使用JSONGet获取汉字的byte数据缺失,中文乱码,改用原生的方法获取 又修改为克隆到本地进行修改复制、替换 */ func (r *RedisJsonUtil) FindById(coll string, id int64, val interface{}) { res, err := r.Rh.JSONGet(fmt.Sprintf("%s:%d", coll, id), ".") if err == nil { bs, ok := res.([]byte) if ok { json.Unmarshal(bs, val) } } else { log.Println(res, err) } return // aa := r.GoRedis.CMap[r.GoRedis.DB].Do(r.GoRedis.Ctx, "JSON.GET", "user:4", ".").String() // json.Unmarshal(res.([]byte), &v) // b := res.([]byte) // for len(b) > 0 { // r, n := utf8.DecodeRune(b) // 解码 b 中的第一个字符 // fmt.Printf("%c\n", r) // 显示读出的字符 // b = b[n:] // 丢弃已读取的字符 // } } func (r *RedisJsonUtil) Find(key string) interface{} { // tg := rjs.GETOptionNOESCAPE // tg.SetValue("TRUE") res, err := r.Rh.JSONGet(key, ".") //, tg) if err != nil { log.Println(res, err) // redis: nil } return res } func (r *RedisJsonUtil) DelByKey(key string) { res, err := r.Rh.JSONDel(key, ".") log.Println(res, err) } func (r *RedisJsonUtil) Update(key, path string, val interface{}) { res, err := r.Rh.JSONSet(key, path, val) log.Println(res, err) } func (r *RedisJsonUtil) GetId(coll string) int64 { id, _ := r.GoRedis.Incr("coll:" + coll) return id }