如何“终止”中的Redis的“HSET”子键?(How to “EXPIRE” the “HSET”

2019-09-03 03:36发布

我需要在到期哈希redis的所有按键,这是旧的,然后1个月。

Answer 1:

这是不可能的 ,为求保持Redis的简单 。

答曰Antirez,Redis的创造者:

嗨,这是不可能的,要么使用该特定领域的不同的顶级键,或随着提起另一场与存储到期时间,取两者,并且让应用程序了解是否仍然有效或不基于当前时间。



Answer 2:

有一个Redisson它实现哈希Java框架Map物体进入TTL支持。 它采用hmapzset Redis的引擎盖下的对象。 用法示例:

RMapCache<Integer, String> map = redisson.getMapCache('map');
map.put(1, 30, TimeUnit.DAYS); // this entry expires in 30 days

这种做法是非常有用的。



Answer 3:

关于实施的NodeJS,我添加了一个自定义的expiryTime的对象我保存在HASH领域。 然后一个特定时期的时间后,我通过清除使用下面的代码过期HASH条目:

client.hgetall(HASH_NAME, function(err, reply) {
    if (reply) {
        Object.keys(reply).forEach(key => {
            if (reply[key] && JSON.parse(reply[key]).expiryTime < (new Date).getTime()) {
                client.hdel(HASH_NAME, key);
            }
        })
    }
});


Answer 4:

您可以到期 Redis的哈希在易用性,如使用python

import redis
conn = redis.Redis('localhost')
conn.hmset("hashed_user", {'name': 'robert', 'age': 32})
conn.expire("hashed_user", 10)

这将在10秒后到期哈希 hashed_user所有子项

从Redis的-CLI相同,

127.0.0.1:6379> HMSET testt username wlc password P1pp0 age 34
OK
127.0.0.1:6379> hgetall testt
1) "username"
2) "wlc"
3) "password"
4) "P1pp0"
5) "age"
6) "34"
127.0.0.1:6379> expire testt 10
(integer) 1
127.0.0.1:6379> hgetall testt
1) "username"
2) "wlc"
3) "password"
4) "P1pp0"
5) "age"
6) "34"

10秒后

127.0.0.1:6379> hgetall testt
(empty list or set)


Answer 5:

你可以存储在不同的Redis键/值来实现这一点,只需添加一个前缀或命名空间到你的钥匙,当你存储它们,如“hset_”

  • 获取一个键/值GET hset_key等于HGET hset key

  • 添加一个键/值SET hset_key value等于HSET hset key

  • 获取所有的密钥KEYS hset_*等于HGETALL hset

  • 获取所有丘壑应2个OPS来完成,首先获得所有按键KEYS hset_*然后获得价值为每个键

  • 添加一个键/值与TTL或过期这是问题的话题:

 SET hset_key value
 EXPIRE hset_key

KEYS将查找了匹配整个数据库的关键,特别是如果你有大的数据库,这可能对性能的影响。

注意:

  • KEYS将查找了匹配整个数据库的关键,特别是如果你有大的数据库,这可能对性能的影响。 而SCAN 0 MATCH hset_*可能会更好,只要它不阻塞服务器,但仍然表现为大型数据库的情况下的问题。

  • 您可以用于分别存储要到期,特别是如果他们是小组键这些键创建一个新的数据库。

由于@DanFarrell谁强调相关的性能问题KEYS



Answer 6:

Redis的不支持具有TTL上比顶端的按键,这将到期整个哈希散列等。 如果您使用的是分片集群,还有你可以使用另一种方法。 这种做法不能在所有的情况下非常有用,性能特点可能因所预计的不同。 不过值得一提的是:

有散的时候,结构基本上是这样的:

hash_top_key
  - child_key_1 -> some_value
  - child_key_2 -> some_value
  ...
  - child_key_n -> some_value

因为我们要添加TTL的子键,我们可以将它们移动到顶部按键。 主要的一点是,现在的关键应该是一个组合hash_top_key和子键:

{hash_top_key}child_key_1 -> some_value
{hash_top_key}child_key_2 -> some_value
...
{hash_top_key}child_key_n -> some_value

我们使用{}故意的符号。 这让所有的键落在同一hash slot 。 你可以阅读更多关于它在这里: https://redis.io/topics/cluster-tutorial

现在,如果我们想要做的哈希,相同的操作,我们可以这样做:

HDEL hash_top_key child_key_1 => DEL {hash_top_key}child_key_1

HGET hash_top_key child_key_1 => GET {hash_top_key}child_key_1

HSET hash_top_key child_key_1 some_value => SET {hash_top_key}child_key_1 some_value [some_TTL]

HGETALL hash_top_key => 
  keyslot = CLUSTER KEYSLOT {hash_top_key}
  keys = CLUSTER GETKEYSINSLOT keyslot n
  MGET keys

这里有趣的是HGETALL 。 首先我们得到的hash slot为我们所有的孩子键。 然后,我们得到那个特定的键hash slot ,最后我们检索值。 我们必须要小心,因为这里可能有超过n该键hash slot ,也有可能是我们不感兴趣的密钥,但它们具有相同的hash slot 。 我们其实可以写一个Lua脚本,通过执行一个做服务器的步骤EVALEVALSHA命令。 同样,你需要考虑到这种做法的性能为您的特定情况。

一些更多的参考资料:

  • https://redis.io/commands/cluster-keyslot
  • https://redis.io/commands/cluster-getkeysinslot
  • https://redis.io/commands/eval


Answer 7:

您可以。 下面是一个例子。

redis 127.0.0.1:6379> hset key f1 1
(integer) 1
redis 127.0.0.1:6379> hset key f2 2
(integer) 1
redis 127.0.0.1:6379> hvals key
1) "1"
2) "1"
3) "2"
redis 127.0.0.1:6379> expire key 10
(integer) 1
redis 127.0.0.1:6379> hvals key
1) "1"
2) "1"
3) "2"
redis 127.0.0.1:6379> hvals key
1) "1"
2) "1"
3) "2"
redis 127.0.0.1:6379> hvals key

使用EXPIRE或EXPIREAT命令。

如果你想在到期哈希旧的然后1个月特定按键。 这是不可能的。 Redis的到期命令是在哈希的所有键。 如果您设置的每日哈希键,你可以设置一个按键的生存时间。

hset key-20140325 f1 1
expire key-20140325 100
hset key-20140325 f1 2


Answer 8:

你可以通过使用Redis的KEYSPACE通知psubscribe"__keyevent@<DB-INDEX>__:expired"

就这样,每一个键将到期的时候,你会得到你的Redis连接上发布的消息。

关于你的问题基本上你创建一个临时的“正常”键使用set在S / MS的到期时间。 它应与您希望在你设定的删除键的名称。

当你的临时密钥将被发布到您的Redis连接抱着"__keyevent@0__:expired" ,当它过期,您可以轻松地从你的原设定删除键的消息将有关键的名称。

在该网页上实践一个简单的例子: https://medium.com/@micah1powell/using-redis-keyspace-notifications-for-a-reminder-service-with-node-c05047befec3

DOC: https://redis.io/topics/notifications (寻找标志XE)



Answer 9:

您可以使用有序集合中的Redis获得TTL容器时间戳得分。 例如,当你插入一个事件串入组可以设置其得分以事件时间。 因此,你可以通过调用得到任何时间的数据zrangebyscore "your set name" min-time max-time

此外,我们可以通过做到期zremrangebyscore "your set name" min-time max-time删除旧的事件。

这里唯一的缺点是你必须从一个局外人的过程做家政维持设定的大小。



文章来源: How to “EXPIRE” the “HSET” child key in redis?
标签: hash redis