1

我想知道这样的事情是否可能。我正在使用 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"

谢谢您的帮助!

4

2 回答 2

4

Redis 列表是使用链表实现的,链表不适合这种用途(即随机访问和高效索引)。

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

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

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

于 2013-10-04T08:26:35.983 回答
0

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

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

正如自述文件所示,排序集可能是更好的选择,我没有在生产中使用它,因此请谨慎使用。

于 2014-02-03T16:48:53.837 回答