当前位置: 首页 > 面试题库 >

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

梁宏才
2023-03-14
问题内容

是否有人在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中也没有此结构我描述的脚本,似乎应该足够典型,可以作为Redis数据结构的一种选择来实现?


问题答案:

如果是列表,则可以使用LTRIM。

文档摘录。

LPUSH mylist someelement
LTRIM mylist 0 99

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



 类似资料:
  • 问题内容: 我通过以下方式使用Redis缓存扇出新闻提要: 每个供稿活动都是键/值,例如activity:id,其中值是数据的JSON字符串。 当前每个新闻提要都是一个列表,键是feed:user:user_id,该列表包含相关活动的键。 检索我使用的新闻提要,例如:’sort feed:user:user_id by nosort get * limit 0 40’ 我正在考虑将提要更改为排序集

  • 问题内容: 我目前正在使用“设置”结构使用Redis。 我想知道是否有可能自动清理空的“ set”吗? 否则找到一个cron /进程来定期清理空的“ set” 更新: 更笼统的问题是,“(nil)”和“(空列表或集合)”之间存在差异(内存使用情况) 例: 要么 问题答案: 这已经是自动的。如果集合为空,则将其从名称空间中删除。 您不必执行任何特定操作即可从此行为中受益。 要回答第二个问题,(nil

  • 我知道对无限列表进行排序是不可能的,但我正试图为n个数的倍数的无限递增列表写一个定义。 我已经有这个功能了 它返回n的无限倍数列表。但现在我想构建一个函数,给定一个返回列表中所有数字的倍数的无限递增列表。所以函数

  • 对于使用c实现的链表队列,我的入队列和出队列有点问题。我的老师说模板是禁止使用的,我不能改变他给我们的公共和私人功能。我总是遇到一个分割错误。我真的不明白我做错了什么。我还包括了header、enqueue和dequeue函数。

  • 问题内容: 请查看下面的代码: 有人可以解释一下为什么输出是 代替 ? 因为在API中它表示优先级队列的元素是根据其自然顺序进行排序的。 问题答案: PriorityQueue基于优先级堆。尽管未对元素进行排序,但此数据结构允许非常快地检索最小元素。将元素添加到PriorityQueue的速度比向基于树的TreeSet快。由于未对元素进行排序,因此如API所述,迭代器“不会以任何特定顺序返回元素”

  • 问题内容: Python的复杂性是什么?Python是否检查给定的iterable是否已排序,还是我必须自己做?我在文档中的任何地方都找不到它。 问题答案: 这 完全 取决于实现。python保证的是内置排序算法是 稳定的 (比较相等的元素保留其相对顺序)。如果要实现,甚至可以使用稳定的冒泡排序。 Cpython使用TimSort(插入排序的合并排序合并),如果输入已经排序,我相信它具有O(N)的