Redis學習與實戰之列表

列表是一種可以記錄重復字符串值、有序排列的數據存儲結構。主要適用于無需次序調整的業務數據記錄和讀取的場景。如記錄用戶在網頁瀏覽過程中的網頁信息、記錄商品評論信息、記錄任務隊列等。

1.基本列表操作命令

命令名稱 功能描述 執行時間復雜度
LPush 從列表左邊插入一個或多個元素值 O(1)
LRange 獲取指定范圍內列表的元素值 O(S+N)
RPush 從列表右邊插入一個或多個元素值 O(1)
LPop 從列表左邊讀出并移除一個元素值 O(1)
RPop 從列表右邊讀出并移除一個元素值 O(N)
LRem 從列表中刪除指定元素 O(N)
LIndex 通過指定列表下標,獲取一個元素值 O(1)
LLen 獲取指定列表的元素個數 O(1)
LSet 設置列表指定位置的元素值 O(N)
LTrim 對指定列表范圍的元素進行修改 O(N)

①LPush命令
語法:LPush key value [value ...]
參數說明:key是指定的列表名;value是要插入列表左邊的元素,一個可以插入多個。如果key不存在,則在插入之前會先創建一個空列表。
返回值:返回插入操作后的列表的長度。如果key對應的不是列表,則返回錯誤信息。
例:

>LPush newlist  "one"    //先創建一個空列表,再從左邊插入第一個元素"one"
>(integer) 1
>LPush newlist "two" "three"
>(integer) 3

②LRange命令
語法:LRange key start stop
參數說明:key是指定的列表名;start是列表元素的讀取開始位置;end是列表元素的讀取結束位置。如果stop大于列表范圍時,默認為列表最大下標的那個元素位置。列表的第一個元素下標是0,以此類推。允許以負數形式倒著對列表下表進行標注。例如start=-1,表示從最后一個元素開始。
返回值:返回指定范圍內的元素值。如果start大于列表范圍,則返回空列表。
例:

>LRange newlist 0 -1   //0表示列表的第一個元素位置,-1表示列表最后一個元素位置
1)"three"
2)"two"
3)"one"
>LRange newlist -1 -2  //獲取列表右邊第一個、第二個元素值
1)"one"
2)"two"
>LRange newlist 0 0  //獲取列表左邊第一個元素值
1)"three"
>LRange newlist 3 5    //開始值大于newlist最大范圍
(empty list or set)      //返回空列表提示

③RPush命令
語法:RPush key value [value ...]
參數說明:key指定的列表名;value是需要從右邊插入的值,可以插入多個。如果key不存在,則先創建空列表,然后再從列表右邊插入。
返回值:返回插入列表后的列表長度。如果key對應的不是列表,則返回錯誤信息。
例:

>RPush newrank 1 2 3   
>(integer) 3
>LRange 0 -1
1)"1"
2)"2"
3)"3"

④LPop命令
語法:LPop key
參數說明:key是列表名
返回值:返回列表左邊第一個元素值,并從列表中移除該元素值;當key不存在時,返回nil
例:

>LPOP newrank
"1"
>LPOP newrank 0 -1
1)"2"
2)"3"
>LRange newrank 0 -1
(empty list or set)

⑤RPop命令
語法:RPop key
返回值:返回列表右邊第一個元素值,并從列表中移除該元素值;當key不存在時,返回nil
例:

>RPUSH test a b c
(integer)3
>RPOP test
"c"
>LRange test 0 -1
1)"a"
2)"b"

⑥LRem命令
語法:LRem key count value
參數說明:count為指定列表元素的下表位置,可以用正數,從左往右從0開始數下標;可以為負數,從右往左從-1開始數下標。value是需要刪除的值。

  • count>0 從頭往尾刪除值為value的元素;
  • count<0 從尾往頭刪除值為value的元素;
  • count=0 刪除所有值為value的元素
    返回值:返回被刪除元素的個數;當key不存在,返回0
    例:
>RPush testlist1 q q b c a
(integer)5
>LRem testlist1 1 "q"
(integer) 2
>LRange testlist1 0 -1
1)"b"
2)"c"
3)"a"
>RPush testlist2 q q b c a
(integer)5
>LRem testlist2 -1 "a"
(integer)1
>LRange testlist2 0 -1
1)"q"
2)"q"
3)"b"
4)"c"

⑦LIndex命令
語法:LIndex key index
參數說明:index為列表指定的下標,可以從開始,也可以從-1開始
返回值:返回Index下標對應的列表元素值。當index超出列表范圍時,返回nil
例:

>RPush indextest q w e r
(integer)4
>LIndex indextest 0
"q"
>LIndex indetest -1
"r"
>LIndex indetest 1
"w"
>LIndex indextest 4
(nil)

⑧LLen命令
語法:LLen key
返回值:返回指定列表的長度(元素個數)。當key不存在時,返回0
例:

>RPush name "Lee"
(integer)1
>LLen name
(integer)1

⑨LSet命令
語法:LSet key index value
參數說明:key是指定的列表名;index是下標;value是需要設置的值。
返回值:設置成功,返回OK;index超出范圍時,返回錯誤信息。
例:

>RPush age 23 25 27
(integer)3
>LSet age -1 28
OK
>LRange 0 -1
1)"23"
2)"25"
3)"28"

⑩LTrim命令
語法:LTrim key start stop
參數說明:start是列表指定的開始位置下標;stop是列表指定的結束位置下標。改該命令會保留start和stop范圍內列表的元素,而移除其他元素。如果start超過列表尾部或者start>stop,修剪的列表為空列表。stop超過列表尾部時,當作列表的最后一個元素的位置看待。
返回值:修剪成功返回OK。
例:

>RPush trimtest a q w x z
(integer)5
>LTrim trimtest 1 3
OK
>LRange 0 -1
1)"q"
2)"w"
3)"x"

2.其他列表操作命令

命令名稱 功能描述 執行時間復雜度
LInsert 在指定位置插入一個新元素 O(N)
LPushX 只有在列表存在時,從左邊插入一個元素 O(1)
RPopLPush 刪除右邊第一個元素,并將其追加到另一個列表頭部 O(1)
RPushX 只有在列表存在時,從右邊插入一個新元素 O(1)
BLPop 帶阻塞功能的LPop命令 O(1)
BRPop 帶阻塞功能的RPop命令 O(1)
BRPopLPush 帶阻塞功能的RPopLPush命令 O(1)

①LInsert命令
語法:LInsert key before|after pivot value
參數說明:before|after二選一,before是在指定元素前面插入value,after是在指定元素后面插入value,pivot是列表里存在的指定的一個元素。key不存在時,該命令不執行任何操作。
返回值:插入成功,返回操作后的列表長度。如果pivot不存在,返回-1;key不存在,則返回錯誤信息。
例:

>RPush testinsert "one" "go" "two"
(integer)3
>LInsert testinsert before one zero
(integer)4
>LRange testinsert 0 -1
1)"zero"
2)"one"
3)"go"
4)"two"

②LPushX命令
語法:LPushX key value
參數說明:key是指定的列表名;value是需要插入列表左邊的值;key不存在時,不執行。這是和LPush命令唯一的區別。
返回值:執行成功,返回操作后列表的長度。key不存在,則返回0
例:

>LPushX testPushX 12  //testPushX 之前是不存在的
(integer)0
>LPush testPushX  12
(integer)1
>LPushX testPushX 13
(integer)2
>LRange testPushX 0 -1
1)"13"
2)"12"

③RPopLPush命令
語法:RPopLPush source destination
參數說明:source destination都是是列表名。該命令是從source列表獲取并刪除左邊最后一個元素,把獲取的元素插入destination列表左邊第一個位置。
返回值:返回移動的那個元素。如果source列表不存在,返回nil,而且不會執行操作。
例:

>LPush test1 12 13 14
(integer)2
>RPopLPush test1 dest 
"12"
>LRange test1 0 -1
1)"14"
2)"13"
>LRange dest 0 -1
1)"12"

使用場景說明:(1)可以使用RPopLPush命令,實現對消息隊列的輪詢。(2)在source和destination列表存儲相同內容的情況下,通過該命令可以實現客戶端一個接一個的訪問,而不用像LRange需要把列表中所有元素都傳遞到客戶端,再進行值獲取操作。
④RPushX命令
語法:RPushX key value
參數說明:value是要從右邊插入的值。
返回值:返回執行命令后列表的長度。
例:

>RPushX newR 1 2 3   //newR列表之前不存在
(integer)0
>LRange newR 0 -1
(empty list or set)

⑤BLPop命令
語法:BLPop key[key ...] timeout
參數說明:key是指定的列表名,可以是多個,。timeout是指定阻塞的最大秒數(整型值);當timeout為0,表示阻塞時間無限制。
阻塞模式:當BLPop指定的列表沒有元素時,則客戶端進入阻塞模式,一直到有新的元素值通過LPush或RPush被插入列表時,阻塞解除,然后成對讀取列表名和左邊第一個元素到客戶端,并把該元素從列表中移除。
返回值:當讀取列表沒有值時,返回nil,并且timeout過期;反之則返回成對的值(列表名和該列表左邊第一個元素值)。
例:

>del t1 t2  //確保t1 t2列表為空
(integer)0
>RPush t1 a b c
(integer)3
>BLPop t1 t2   1   //1是過期時間
1)”t1"
2)"a"
>LRange t1 0 -1
1)"b"
2)"c"

說明:(1)利用NLPop讀取列表元素到客戶端時,當客戶端發生故障,該元素將丟失。(2)BLPop配合Push類命令,可以實現類似即時聊天消息傳遞的效果。當服務器端列表插入新值時,BLPop具有客戶端自動獲取最新消息數據的能力。

⑥BRPop命令
語法:BRPop key [key ...] timeout
參數說明:使用方法和BLpop命令一樣
返回值:返回值和BLPop命令,唯一區別是返回的元素是列表右邊的最后一個。
⑦BRPopLPush命令
語法:BRPopLPush source destination timeout
參數說明:source和destination使用同RPopLPush命令一樣。timeout使用方法和BLPop一樣。
返回值:移動的元素值。timeout超時,則返回多批量的nil。

說明:(1)BRPopLPush在把讀取的值返回給客戶端的同時,會把該值插入destination指定的列表,所以不受客戶端操作影響,而產生元素丟失的問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 官網 中文版本 好的網站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,424評論 0 5
  • 《Redis 入門指南》(第二版) 第一章 Redis 是什么 Redis (REmote Dictionary ...
    EdenPP閱讀 67,322評論 3 10
  • Redis從入門到精通:中級篇 本文目錄 上一篇文章以認識Redis為主,寫了Redis系列的第一篇,現在開啟第二...
    叨唧唧的閱讀 695評論 0 0
  • 我十年后帶你穿越時空隧道! You not。my 女兒!鄭楠同學
    Icey2o閱讀 121評論 1 1
  • 剛才看了被嫌棄的松子的一生,不是每個人都值得你為他做事,特別是有損已的事:
    IM安安閱讀 122評論 0 0