Redis封顶排序集,列表,或队列?

vfh0ocws  于 2023-03-17  发布在  Redis
关注(0)|答案(2)|浏览(148)

有没有人在Redis中实现过一个有上限的数据结构?我正在构建一个类似于新闻提要的东西。提要最终会被频繁地操作和读取,在Redis中将其保存在一个排序集中将是廉价的,而且非常适合我的用例。唯一的问题是我只需要每个提要有n个条目,而且我担心内存溢出。所以我想确保每个feed都不会超过n个条目。在Redis中用Lua创建一个capped sorted集合似乎很简单:

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个bucket的有序集合可以更便宜地完成,我在redis中找不到这样做的方法,所以我想我的问题是:我错过了什么吗?如果我没有错过,为什么在redis中没有关于这个的结构,即使它只是运行我描述的基本Lua脚本,它似乎是一个足够典型的用例,应该作为redis数据结构的一个选项来实现?

nsc4cvqm

nsc4cvqm1#

如果是列表,则可以使用LTRIM
摘自文档。

LPUSH mylist someelement
LTRIM mylist 0 99

这两个命令将把一个新元素推送到列表中,同时确保列表不会超过100个元素,这在使用Redis存储日志时非常有用。需要注意的是,当以这种方式使用LTRIM时,它是一个O(1)操作,因为在一般情况下,只会从列表的尾部删除一个元素。

zazmityj

zazmityj2#

我自己也用过排序集,我也想过用列表,但后来我发现操作列表内部是相当昂贵的-- O(n)--而操作排序集内部是O(logn)。
这就是我的想法--你会操纵集合的内部吗?如果是这样,坚持使用已排序的集合,只要有必要就刷新最旧的集合,就像你想的那样。

相关问题