我想知道这样的事情是否可能。我正在使用 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"
谢谢您的帮助!
我想知道这样的事情是否可能。我正在使用 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"
谢谢您的帮助!
Redis 列表是使用链表实现的,链表不适合这种用途(即随机访问和高效索引)。
您必须将所有元素存储到“a”(包括)某处,然后使用将它们从列表中删除LTRIM
,然后按您想要的顺序再次推送它们(即RPOP
在最后一个元素和LPUSH
ing 之后)。您可以使用嵌入式 Lua 脚本来执行此操作,因为 Redis开箱即用地支持此功能。
但是,如果您希望每个单词在列表中只出现一次,您可以使用Sorted Set有效地做到这一点。您只需将特定元素的分数更新为高于所有其他元素的分数 ( ZADD
)。然后你会做一个ZRANGEBYSCORE
检索重新排序的集合。
但是,使用排序集有其权衡,主要是元素的插入/删除比从列表中推送/弹出值(即在恒定时间内发生)要慢(即以对数时间发生)。这完全取决于您的问题,您应该权衡不同的方法(Redis 文档提供了每个操作的时间复杂度)并选择适合您问题的方法。
我写了一个 lua 脚本,它将在列表中向前或向后移动一个项目:
https://github.com/stereosteve/redis-moveby
正如自述文件所示,排序集可能是更好的选择,我没有在生产中使用它,因此请谨慎使用。