如何在Redis(Jedis)的hset中添加一个键的TTL值
how to add TTL value of a key in hset in Redis(Jedis)
我已经使用过期计时器设置了一个密钥:
SETEX mykey 200 "Hello"
我想将TTL mykey的值添加到hset中:
hset myhash f1 TTL mykey
但是,它显示以下错误:
ERR wrong number of arguments for HMSET
我正在尝试使用 Jedis 实现此功能,是否有特定于 jedis 的解决方案?
您想获取某个键的 TTL 值并将其放入散列中吗?然后试试这个:
EVAL 'local ttl=redis.call("ttl",KEYS[1]) redis.call("hset","myhash",KEYS[2],ttl)' 2 mykey f1
此脚本获取 mykey
(第一个参数)的 TTL 值并将其放入 myhash
字段 f1
(第二个参数)。
127.0.0.1:6370> SETEX mykey 2000 "Hello"
OK
127.0.0.1:6370> eval 'local ttl=redis.call("ttl",KEYS[1]) redis.call("hset","myhash",KEYS[2],ttl)' 2 mykey f1
(nil)
127.0.0.1:6370> hget myhash f1
"1861"
更新
你在评论中描述的是另一回事。这是我建议的设计:
连同您的数据密钥 x 在需要时创建一个锁定密钥 x:lock。仅通过检查密钥的自定义 LUA 执行写入操作。
- 锁定
eval 'local l=redis.call("get",KEYS[1]..":lock") if (l==false) then redis.call("setex",KEYS[1]..":lock",10,"t") return 1 end return 0' 1 mykey
- 解锁
del mykey:lock
- SETEX(锁定感知)
eval 'local l=redis.call("get",KEYS[1]..":lock") if (l==false) then return redis.call("setex",KEYS[1],KEYS[2],KEYS[3]) end return nil' 3 mykey 2000 Hello
。如果成功,它将 return OK
,如果不成功,它将 (nil)
。
我已经使用过期计时器设置了一个密钥:
SETEX mykey 200 "Hello"
我想将TTL mykey的值添加到hset中:
hset myhash f1 TTL mykey
但是,它显示以下错误:
ERR wrong number of arguments for HMSET
我正在尝试使用 Jedis 实现此功能,是否有特定于 jedis 的解决方案?
您想获取某个键的 TTL 值并将其放入散列中吗?然后试试这个:
EVAL 'local ttl=redis.call("ttl",KEYS[1]) redis.call("hset","myhash",KEYS[2],ttl)' 2 mykey f1
此脚本获取 mykey
(第一个参数)的 TTL 值并将其放入 myhash
字段 f1
(第二个参数)。
127.0.0.1:6370> SETEX mykey 2000 "Hello"
OK
127.0.0.1:6370> eval 'local ttl=redis.call("ttl",KEYS[1]) redis.call("hset","myhash",KEYS[2],ttl)' 2 mykey f1
(nil)
127.0.0.1:6370> hget myhash f1
"1861"
更新
你在评论中描述的是另一回事。这是我建议的设计: 连同您的数据密钥 x 在需要时创建一个锁定密钥 x:lock。仅通过检查密钥的自定义 LUA 执行写入操作。
- 锁定
eval 'local l=redis.call("get",KEYS[1]..":lock") if (l==false) then redis.call("setex",KEYS[1]..":lock",10,"t") return 1 end return 0' 1 mykey
- 解锁
del mykey:lock
- SETEX(锁定感知)
eval 'local l=redis.call("get",KEYS[1]..":lock") if (l==false) then return redis.call("setex",KEYS[1],KEYS[2],KEYS[3]) end return nil' 3 mykey 2000 Hello
。如果成功,它将 returnOK
,如果不成功,它将(nil)
。