如何在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)