我想知道這樣的事情是否可行。我有一個Redis的清單工作,並想知道如果我可以從列表中移動項目列表的這樣的頂部:Redis將項目從列表中間移到頂部
LPUSH MYLIST「這」
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的清單工作,並想知道如果我可以從列表中移動項目列表的這樣的頂部:Redis將項目從列表中間移到頂部
LPUSH MYLIST「這」
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列表使用Linked lists實現,並且鏈接列表不適合這種用途(即隨機訪問和高效索引)。
你將不得不存儲所有的元素,直到「一」(含)的地方,然後從列表中使用LTRIM
刪除它們,然後在你想要的順序(再次把他們即後RPOP
荷蘭國際集團的最後一個元素和LPUSH
它)。從Redis supports開箱即用,您可以使用嵌入式Lua腳本執行此操作。
但是,如果您希望每個單詞只在您的列表中出現一次,則可以使用Sorted Set高效完成此操作。您必須將特定元素的分數更新爲比所有其他分數更高的分數(ZADD
)。然後你會做一個ZRANGEBYSCORE
來檢索重新排序的集合。
但是,使用排序集有其折衷,主要是元素的插入/刪除比從列表中推入/彈出值(即在常量時間內發生)要慢(即發生在對數時間內)。這一切都取決於你的問題,你應該權衡不同的方法(Redis文檔提供了每個操作的時間複雜度)並選擇適合你的問題的方法。
我寫了一個Lua腳本,將在列表中向前或向後移動一個項目:
https://github.com/stereosteve/redis-moveby
隨着自述表明,有序集合可能是一個更好的選擇,我沒有用過這個在生產中,請小心使用。