redisjson.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package redisjson
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "bp.365521.xyz/BP/redis_v2/redis"
  7. "github.com/nitishm/go-rejson"
  8. //"github.com/nitishm/go-rejson/v4/rjs"
  9. )
  10. type RedisJsonUtil struct {
  11. Rh *rejson.Handler
  12. GoRedis *redis.GoRedis
  13. }
  14. func NewRedisJsonUtil(opt interface{}) (r *RedisJsonUtil) {
  15. r = &RedisJsonUtil{}
  16. r.GoRedis = &redis.GoRedis{}
  17. r.GoRedis.Init(opt)
  18. r.Rh = rejson.NewReJSONHandler()
  19. r.Rh.SetGoRedisClient(r.GoRedis.CMap[r.GoRedis.DB]) //暂不考虑集群
  20. return
  21. }
  22. //保存对象
  23. func (r *RedisJsonUtil) Save(coll string, obj interface{}) {
  24. id := r.GetId(coll)
  25. if m, ok := obj.(map[string]interface{}); ok { //map时增加id元素
  26. m["_id"] = id
  27. obj = m
  28. }
  29. res, err := r.Rh.JSONSet(fmt.Sprintf("%s:%d", coll, id), ".", obj)
  30. log.Println(id, res, err)
  31. }
  32. //保存对象
  33. func (r *RedisJsonUtil) SaveByKey(key string, obj interface{}) {
  34. res, err := r.Rh.JSONSet(key, ".", obj)
  35. log.Println(key, res, err)
  36. }
  37. //根据Id获取对象
  38. /*
  39. 注:使用JSONGet获取汉字的byte数据缺失,中文乱码,改用原生的方法获取
  40. 又修改为克隆到本地进行修改复制、替换
  41. */
  42. func (r *RedisJsonUtil) FindById(coll string, id int64, val interface{}) {
  43. res, err := r.Rh.JSONGet(fmt.Sprintf("%s:%d", coll, id), ".")
  44. if err == nil {
  45. bs, ok := res.([]byte)
  46. if ok {
  47. json.Unmarshal(bs, val)
  48. }
  49. } else {
  50. log.Println(res, err)
  51. }
  52. return
  53. // aa := r.GoRedis.CMap[r.GoRedis.DB].Do(r.GoRedis.Ctx, "JSON.GET", "user:4", ".").String()
  54. // json.Unmarshal(res.([]byte), &v)
  55. // b := res.([]byte)
  56. // for len(b) > 0 {
  57. // r, n := utf8.DecodeRune(b) // 解码 b 中的第一个字符
  58. // fmt.Printf("%c\n", r) // 显示读出的字符
  59. // b = b[n:] // 丢弃已读取的字符
  60. // }
  61. }
  62. func (r *RedisJsonUtil) Find(key string) interface{} {
  63. // tg := rjs.GETOptionNOESCAPE
  64. // tg.SetValue("TRUE")
  65. res, err := r.Rh.JSONGet(key, ".") //, tg)
  66. if err != nil {
  67. log.Println(res, err) //<nil> redis: nil
  68. }
  69. return res
  70. }
  71. func (r *RedisJsonUtil) DelByKey(key string) {
  72. res, err := r.Rh.JSONDel(key, ".")
  73. log.Println(res, err)
  74. }
  75. func (r *RedisJsonUtil) Update(key, path string, val interface{}) {
  76. res, err := r.Rh.JSONSet(key, path, val)
  77. log.Println(res, err)
  78. }
  79. func (r *RedisJsonUtil) GetId(coll string) int64 {
  80. id, _ := r.GoRedis.Incr("coll:" + coll)
  81. return id
  82. }