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

Eli*_*Eli 6 lua redis

有没有人在Redis中实现任何类型的上限数据结构?我正在努力构建像新闻源这样的东西.饲料将被非常频繁地操纵和读取,并且将它保存在Redis中的分类集中对于我的用例来说将是便宜且完美的.唯一的问题是我每次只需要n个项目,而且我担心内存溢出,所以我想确保每个Feed都不会超过n个项目.使用Lua在Redis中制作带帽的已排序集合似乎很简单:

redis-cli EVAL "$(cat update_feed.lua)" 1 feeds:some_feed "thing_to_add", n
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这一点都不差,而且非常便宜,但是通过实例化只有n个桶开始的排序集,看起来像是一个基本的东西可以更便宜.我在redis中找不到办法做到这一点,所以我想我的问题是:我错过了什么,如果我没有,为什么redis中没有这个结构,即使它只是运行了基本的Lua我描述的脚本,似乎它应该是一个典型的用例,它应该作为redis数据结构的一个选项实现吗?

gka*_*mal 17

如果它是列表,您可以使用LTRIM.

摘自文档.

LPUSH mylist someelement
LTRIM mylist 0 99
Run Code Online (Sandbox Code Playgroud)

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