Go语言 为什么不能在Redis中从Lua获取值

zzlelutf  于 2024-01-04  发布在  Go
关注(0)|答案(1)|浏览(99)

我使用lua来保存数据到redis。
第一个月
ARGV 1是go结构。
The go code to pass the struct to redis lua
这是我的结构看起来像

type InviteInfo struct {
...
MaxPeers     int32                `json:"maxPeers"`
RouteVersion int32                `json:"routeVersion"`
...
}

字符串
并使用下面的lua查询数据。

local data = redis.call('GET', KEYS[1])

    -- Parse JSON
    local inviteInfo = cjson.decode(data)

    -- Compare routeVersion
    if tonumber(inviteInfo['routeVersion']) ~= tonumber(ARGV[1]) then
        return "route version mismatch"
    end


inviteInfo ['routeVersion']始终为nil
我希望inviteInfo ['routeVersion']应该是数值而不是nil。
我试过lua在本地redis和作品,奇怪的是为什么不工作在分期.. enter image description here

更新,问题已修复

先前的流程是
1.将go结构传递到lua -> cjson.encode ->保存
1.从Redis获取数据-> cjson.decode -> invite.routeVersion(这不起作用)->保存
改为
1.执行struct -> json.marshal -> passstring to lua ->保存
1.从Redis获取数据-> cjson.decode -> invite.routeVersion(这个可以)->保存

区别

我在redis里查询了保存的数据。
以前保存的数据看起来像{\“routeVersion":1}。
更改后,保存的数据类似于{“routeVersion”}

3okqufwl

3okqufwl1#

最好的办法,肯定会奏效的-
当你在redis中保存数据时,首先初始化struct并在保存之前填充数据字段,使用json.Marshal获取字节并保存,在redis中使用SET命令和fetch使用GET命令你将获得bytes中的数据,然后使用json.Unmarshal检索数据。

local data = redis.call('GET', KEYS[1])
// data returned here in bytes
inviteInfo := &InviteInfo {}
err = json.Unmarshal(data, inviteInfo)
    if err != nil {
    // log err 
        return  err
}

// now you can access data fields of inviteInfo if no err

字符串
编辑1

when saving  - 

type InviteInfo struct {
...
MaxPeers     int32                `json:"maxPeers"`
RouteVersion int32                `json:"routeVersion"`
...
}

inviteInfo := &InviteInfo{
  MaxPeers: 5,
  RouteVersion: 1,
}

inviteInfoBytes, err := json.Marshall(inviteInfo)
if err != nil {
  // log err
}

// method can defer as per library 
func (c *Cache) saveInRedis(key string, inviteInfoBytes []byte) error {
   conn, err := c.getConnFromPool()
    if err != nil {
        return err
    }
    defer conn.Close()
    var luaScript = redis.NewScript(1, `
         redis.call('SET', KEYS[1], ARGV[1])
    `)

    _, err = luaScript.Do(conn, key, string(inviteInfoBytes))

    return err
}

// atomic modification 
func ModifyInviteInfoAtomic(key string, updatedRouteVersion int32) error {
conn, err := c.getConnFromPool()
    if err != nil {
        return err
    }
    defer conn.Close()
 var luaScript = redis.NewScript(1, `
        local inviteInfo = redis.call('GET', KEYS[1])
         if inviteInfo then:
           local metaData = cjson.decode(inviteInfo)
            if metaData['RouteVersion'] then
               metaData.RouterVersion = ARGV[1]
               local updatedMetaData = cjon.encode(metaData)
               redis.call('SET', KEYS[1], updatedMetaData)
             end
          end
               
    `)
_, err = luaScript.Do(conn, key, updatedRouteVersion)
   return err
}

相关问题