Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua Redis限制排序集、列表或队列?_Lua_Redis - Fatal编程技术网

Lua Redis限制排序集、列表或队列?

Lua Redis限制排序集、列表或队列?,lua,redis,Lua,Redis,有人在Redis中实现过任何类型的封顶数据结构吗?我正在制作一个类似新闻提要的东西。feed最终会被频繁地操作和读取,在Redis中将其保存在一个排序集中对于我的用例来说是非常便宜和完美的。唯一的问题是每个提要只需要n个条目,我担心内存溢出,所以我想确保每个提要永远不会超过n个条目。使用Lua在Redis中创建一个封顶排序集合似乎非常简单: redis-cli EVAL "$(cat update_feed.lua)" 1 feeds:some_feed "thing_to_add", n 其

有人在Redis中实现过任何类型的封顶数据结构吗?我正在制作一个类似新闻提要的东西。feed最终会被频繁地操作和读取,在Redis中将其保存在一个排序集中对于我的用例来说是非常便宜和完美的。唯一的问题是每个提要只需要n个条目,我担心内存溢出,所以我想确保每个提要永远不会超过n个条目。使用Lua在Redis中创建一个封顶排序集合似乎非常简单:

redis-cli EVAL "$(cat update_feed.lua)" 1 feeds:some_feed "thing_to_add", n
其中update_feed.lua看起来像(未经测试):

这一点也不坏,而且相当便宜,但这似乎是一个基本的事情,通过实例化一个只包含n个bucket的排序集,可以更便宜地完成。我在redis中找不到这样做的方法,所以我想我的问题是:我错过了什么,如果没有,为什么redis中没有这样的结构,即使它只是运行我描述的基本Lua脚本,它似乎是一个足够典型的用例,应该作为redis数据结构的一个选项来实现?

如果它是一个列表,您可以使用它

文件摘录

LPUSH mylist someelement
LTRIM mylist 0 99

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

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


这就是我达成协议的原因——你会操纵片场的内部吗?如果是这样,请坚持使用已排序的集合,并在必要时刷新最旧的集合,就像您所想的那样。

您应该使用Lua脚本或MULTI/EXEC块添加项并修剪数据结构。没有特定的选项可以自动执行。@DidierSpezia您可以添加这个作为答案,这样我就可以接受了吗?您应该接受gkamal的答案。我觉得这很好。整个部分摘自redis官方文档:-)
LPUSH mylist someelement
LTRIM mylist 0 99