Redis将项目从列表中间移动到顶部

时间:2013-10-04 05:11:36

标签: redis

我想知道这样的事情是否可行。我正在使用redis列表,并且想知道我是否可以将项目从列表中间移动到列表顶部,如下所示:

LPUSH mylist "This"
LPUSH mylist "is"
LPUSH mylist "a"
LPUSH mylist "Test"

Somehow Move "a" to top

LRANGE mylist
    1. "a"
    2. "This"
    3. "Is"
    4."Test"

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

Redis列表使用Linked lists实现,链接列表不适合此类用途(即随机访问和高效索引)。

您必须将所有元素存储到某个地方的“a”(包括),然后使用LTRIM将其从列表中删除,然后按照您想要的顺序再次推送它们(即在{{1}之后最后一个元素和RPOP它。您可以使用嵌入式Lua脚本执行此操作,因为Redis supports开箱即用。

但是,如果您希望每个单词在列表中只出现一次,则可以使用Sorted Set有效地执行此操作。您只需将特定元素的分数更新为比其他元素更高的分数(LPUSH)。然后你会做ZADD来检索重新排序的集合。

然而,使用有序集合有其权衡,主要是元素的插入/删除比从列表中推送/弹出值更慢(即以对数时间发生)(即,在恒定时间内发生)。这一切都取决于您的问题,您应权衡不同的方法(Redis文档提供每个操作的时间复杂性)并选择适合您的问题的方法。

答案 1 :(得分:0)

我写了一个lua脚本,它会在列表中向前或向后移动项目:

https://github.com/stereosteve/redis-moveby

正如自述文件所示,排序集可能是更好的选择,我没有在生产中使用它,所以要小心使用。