有没有人在Redis中实现任何类型的上限数据结构?我正在努力构建像新闻源这样的东西。饲料将被非常频繁地操纵和读取,并且将它保存在Redis中的分类集中对于我的用例来说是便宜且完美的。唯一的问题是我每次只需要n个项目,而且我担心内存溢出,所以我想确保每个Feed都不会超过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数据结构的一个选项实现吗?
答案 0 :(得分:17)
如果是列表,您可以使用LTRIM。
摘自文档。
LPUSH mylist someelement
LTRIM mylist 0 99
这对命令将在列表中推送一个新元素,同时确保列表不会超过100个元素。例如,当使用Redis存储日志时,这非常有用。重要的是要注意,当以这种方式使用时,LTRIM是一个O(1)操作,因为在一般情况下,只从列表的尾部删除一个元素。
答案 1 :(得分:2)
我自己使用排序集。我也考虑过使用列表,但后来我发现操作列表的INSIDE是相当昂贵的 - O(n) - 而操作有序集合的内部是O(log n)。
这对我来说是什么密封 - 你会不会操纵集合的内部?如果是这样的话,坚持使用有序的套装,只要你必须的话就冲洗最旧的套装,就像你在想的那样。