有没有人在Redis中实现了任何类型的封顶数据结构?我正在致力于构建一个类似于新闻提要的东西。提要最终将被频繁地操作和读取,并且在Redis中将其保存在一个排序的集合中,这对于我的用例来说是非常便宜和完美的。唯一的问题是我每次提要只需要n个项目,而且我担心内存溢出,所以我希望确保每个提要永远不会超过n个项目。在Redis中使用Lua创建一个有上限的排序集合似乎相当简单:
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数据结构的一个选项来实现?
发布于 2013-05-20 12:41:46
如果它是一个列表,你可以使用LTRIM。
摘录自文档。
LPUSH mylist someelement
LTRIM mylist 0 99这两个命令将推送列表中的一个新元素,同时确保列表不会超过100个元素。例如,当使用Redis存储日志时,这是非常有用的。重要的是要注意,当以这种方式使用时,LTRIM是一个O(1)操作,因为在平均情况下,只从列表的尾部删除一个元素。
发布于 2014-09-06 22:59:49
为此,我自己使用了排序集。我也考虑过使用列表,但是后来我发现操作列表的内部是相当昂贵的-- O(n) --而操作一个有序集的内部是O(log )。
这就是为我敲定交易的原因--你会操纵片场的内部吗?如果是这样,请坚持使用已排序的集合,并在必要时刷新最旧的集合,就像您想的那样。
https://stackoverflow.com/questions/16641011
复制相似问题