一尘不染

Redis上限排序集,列表或队列?

redis

是否有人在Redis中实现了任何形式的有上限的数据结构?我正在构建类似新闻提要的东西。提要将非常频繁地被操纵和读取,并且将其保存在Redis的分类集中对于我的用例来说是便宜又完美的。唯一的问题是,每个提要仅需要n个项,并且我担心内存溢出,因此我想确保每个提要都不会超过n个项。用Lua在Redis中创建一个有上限的排序集合似乎很简单:

redis-cli EVAL "$(cat update_feed.lua)" 1 feeds:some_feed "thing_to_add", n

update_feed.lua看起来像(未经测试):

redis.call('ZADD', KEYS[1], os.time(), ARGV[1])
local num = redis.call('ZCARD', KEYS[1])
if num > ARGV[2]:
    redis.call('ZREMRANGEBYRANK', KEYS[1], -n, -inf)

这一点也不差,而且很便宜,但是看起来像这样的基本事情,可以通过仅以n个存储桶实例化排序后的集合来便宜得多。我找不到在Redis中执行此操作的方法,所以我想我的问题是:我是否错过了某些内容,如果没有,为什么即使在Redis中运行基本的Lua,Redis中也没有此结构我描述的脚本,似乎应该足够典型,可以作为Redis数据结构的一种选择来实现?


阅读 373

收藏
2020-06-20

共1个答案

一尘不染

如果是列表,则可以使用LTRIM

文档摘录。

LPUSH mylist someelement
LTRIM mylist 0 99

这对命令将在列表中推送一个新元素,同时确保列表的长度不会超过100个元素。例如,当使用Redis存储日志时,这非常有用。重要的是要注意,当以这种方式使用LTRIM时,它是O(1)运算,因为在通常情况下,仅从列表的尾部删除一个元素。

2020-06-20