【问题标题】:Redis Capped Sorted Set, List, or Queue?Redis Capped 排序集、列表或队列?
【发布时间】:2013-05-14 12:12:44
【问题描述】:

有没有人在 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 数据结构的一个选项来实现?

【问题讨论】:

  • 添加项目并使用 Lua 脚本或 MULTI/EXEC 块修剪数据结构是您应该做的。没有自动执行此操作的特定选项。
  • @DidierSpezia 你能把它添加为答案,所以我可以接受吗?
  • 你应该接受 gkamal 的回答,我觉得很好。

标签: lua redis


【解决方案1】:

如果是列表,可以使用LTRIM

文档摘录。

LPUSH mylist someelement
LTRIM mylist 0 99

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

【讨论】:

  • 整节摘自redis官方文档:-)
【解决方案2】:

为此,我自己使用排序集。我也考虑过使用列表,但后来我发现操作列表的 INSIDE 相当昂贵——O(n)——而操作排序集的内部是 O(log n)。

这就是我达成交易的原因——你会操纵布景的内部吗?如果是这样,请坚持使用已排序的集合,并在必要时刷新最旧的集合,就像您的想法一样。

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 2014-04-18
    • 2013-05-16
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2020-03-25
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多