使用Redis排序集合成员管理TTL

时间:2019-02-02 18:10:04

标签: redis

我正在设置自动完成功能,并且正在考虑使用Redis排序集。关于这一点,有很多文档,但是要点是添加前缀,例如abcZADD mySet-0 a0 ab0 abc,{{ 1}}。

然后,当查询在查询中使用0 abc*时,然后基于该查询,使用ZRANK获得匹配的结果。

无论如何,我都不希望在集合上实现TTL,而是在集合的特定成员上实现TTL。我知道这在Redis中是不可能的,所以我正在考虑实现替代解决方案。一种选择是使用时间戳作为排名,但这在排名重要的情况下无法自动完成,他们需要具有相同的得分才能按字典顺序进行排序。

我正在考虑的解决方案是将已排序的集合有效地复制到未排序的集合中。这将存储诸如ZRANGE之类的值。然后按计划可以在这里安排成员,检查时间,如果过期则从排序集中删除。显然,这会增加内存使用量,但这是合适的。

我的问题是还有更好的方法吗?在规模和/或简单性方面。谢谢!

2 个答案:

答案 0 :(得分:2)

使用另一个排序集来跟踪类似TTL的时间戳记作为得分,定期查询或在每次调用时查找并删除“过期”前缀。

答案 1 :(得分:2)

@Itamar Haber的答案很好,但是还需要一个额外的排序集。为了降低存储器使用,则可以进行编码期满时间到所述构件。以lexicographical indexes解决方案为例:

索引

假设要编制索引的 ABC ,并在1549161254(Unix时间戳)到期它。您可以将术语和时间戳编码为成员名称,并用\xFE隔开,即abc\xFE1549161254

ZADD set 0 "abc\xFE1549161254"

查询

当用户键入 ab 时,您可以进行查询:

ZRANGEBYLEX set "[ab" "[ab\xFF"

这将返回的 ABC \ xFE1549161254 ,那么可以拆分与串\xFE。第一部分是匹配成员,第二部分是到期时间。如果已过期,请将其从排序集中删除,否则,将其返回给用户。

使用此解决方案,您不需要额外的设置即可保存TTL,它应该可以提高内存效率。