亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

Redis教程(三):List數據類型

2020-03-17 12:37:49
字體:
來源:轉載
供稿:網友

一、概述:

      在Redis中,List類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵并不存在,Redis將為該鍵創建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那么該鍵也將會被從數據庫中刪除。List中可以包含的最大元素數量是4294967295。
      從元素插入和刪除的效率視角來看,如果我們是在鏈表的兩頭插入或刪除元素,這將會是非常高效的操作,即使鏈表中已經存儲了百萬條記錄,該操作也可以在常量時間內完成。然而需要說明的是,如果元素插入或刪除操作是作用于鏈表中間,那將會是非常低效的。相信對于有良好數據結構基礎的開發者而言,這一點并不難理解。

二、相關命令列表:

 

命令原型 時間復雜度 命令描述 返回值
LPUSHkey value [value ...]  O(1) 在指定Key所關聯的List Value的頭部插入參數中給出的所有Values。如果該Key不存在,該命令將在插入之前創建一個與該Key關聯的空鏈表,之后再將數據從鏈表的頭部插入。如果該鍵的Value不是鏈表類型,該命令將返回相關的錯誤信息。  插入后鏈表中元素的數量。
LPUSHX key value  O(1)   僅有當參數中指定的Key存在時,該命令才會在其所關聯的List Value的頭部插入參數中給出的Value,否則將不會有任何操作發生。 插入后鏈表中元素的數量。 
LRANGE key start stop  O(S+N) 時間復雜度中的S為start參數表示的偏移量,N表示元素的數量。該命令的參數start和end都是0-based。即0表示鏈表頭部(leftmost)的第一個元素。其中start的值也可以為負值,-1將表示鏈表中的最后一個元素,即尾部元素,-2表示倒數第二個并以此類推。該命令在獲取元素時,start和end位置上的元素也會被取出。如果start的值大于鏈表中元素的數量,空鏈表將會被返回。如果end的值大于元素的數量,該命令則獲取從start(包括start)開始,鏈表中剩余的所有元素。 返回指定范圍內元素的列表。
LPOPkey  O(1)  返回并彈出指定Key關聯的鏈表中的第一個元素,即頭部元素,。如果該Key不存,返回nil。 鏈表頭部的元素。
LLENkey O(1)  返回指定Key關聯的鏈表中元素的數量,如果該Key不存在,則返回0。如果與該Key關聯的Value的類型不是鏈表,則返回相關的錯誤信息。 鏈表中元素的數量。
LREMkey count value  O(N)  時間復雜度中N表示鏈表中元素的數量。在指定Key關聯的鏈表中,刪除前count個值等于value的元素。如果count大于0,從頭向尾遍歷并刪除,如果count小于0,則從尾向頭遍歷并刪除。如果count等于0,則刪除鏈表中所有等于value的元素。如果指定的Key不存在,則直接返回0。 返回被刪除的元素數量。
LSETkey index value  O(N)  時間復雜度中N表示鏈表中元素的數量。但是設定頭部或尾部的元素時,其時間復雜度為O(1)。設定鏈表中指定位置的值為新值,其中0表示第一個元素,即頭部元素,-1表示尾部元素。如果索引值Index超出了鏈表中元素的數量范圍,該命令將返回相關的錯誤信息。  
LINDEX key index  O(N)  時間復雜度中N表示在找到該元素時需要遍歷的元素數量。對于頭部或尾部元素,其時間復雜度為O(1)。該命令將返回鏈表中指定位置(index)的元素,index是0-based,表示頭部元素,如果index為-1,表示尾部元素。如果與該Key關聯的不是鏈表,該命令將返回相關的錯誤信息。 返回請求的元素,如果index超出范圍,則返回nil。
LTRIMkey start stop  O(N)  N表示被刪除的元素數量。該命令將僅保留指定范圍內的元素,從而保證鏈接中的元素數量相對恒定。start和stop參數都是0-based,0表示頭部元素。和其他命令一樣,start和stop也可以為負值,-1表示尾部元素。如果start大于鏈表的尾部,或start大于stop,該命令不錯報錯,而是返回一個空的鏈表,與此同時該Key也將被刪除。如果stop大于元素的數量,則保留從start開始剩余的所有元素。  
LINSERT key BEFORE|AFTER pivot value  O(N)  時間復雜度中N表示在找到該元素pivot之前需要遍歷的元素數量。這樣意味著如果pivot位于鏈表的頭部或尾部時,該命令的時間復雜度為O(1)。該命令的功能是在pivot元素的前面或后面插入參數中的元素value。如果Key不存在,該命令將不執行任何操作。如果與Key關聯的Value類型不是鏈表,相關的錯誤信息將被返回。 成功插入后鏈表中元素的數量,如果沒有找到pivot,返回-1,如果key不存在,返回0。
RPUSH key value [value ...]  O(1)  在指定Key所關聯的List Value的尾部插入參數中給出的所有Values。如果該Key不存在,該命令將在插入之前創建一個與該Key關聯的空鏈表,之后再將數據從鏈表的尾部插入。如果該鍵的Value不是鏈表類型,該命令將返回相關的錯誤信息。  插入后鏈表中元素的數量。 
RPUSHX key value  O(1)  僅有當參數中指定的Key存在時,該命令才會在其所關聯的List Value的尾部插入參數中給出的Value,否則將不會有任何操作發生。  插入后鏈表中元素的數量。 
RPOPkey  O(1)  返回并彈出指定Key關聯的鏈表中的最后一個元素,即尾部元素,。如果該Key不存,返回nil。  鏈表尾部的元素。 
RPOPLPUSHsource destination  O(1)  原子性的從與source鍵關聯的鏈表尾部彈出一個元素,同時再將彈出的元素插入到與destination鍵關聯的鏈表的頭部。如果source鍵不存在,該命令將返回nil,同時不再做任何其它的操作了。如果source和destination是同一個鍵,則相當于原子性的將其關聯鏈表中的尾部元素移到該鏈表的頭部。 返回彈出和插入的元素。

 

三、命令示例:

    1. LPUSH/LPUSHX/LRANGE:
 

復制代碼 代碼如下:

    /> redis-cli    #在Shell提示符下啟動redis客戶端工具。
    redis 127.0.0.1:6379> del mykey
    (integer) 1
    #mykey鍵并不存在,該命令會創建該鍵及與其關聯的List,之后在將參數中的values從左到右依次插入。
    redis 127.0.0.1:6379> lpush mykey a b c d
    (integer) 4
    #取從位置0開始到位置2結束的3個元素。
    redis 127.0.0.1:6379> lrange mykey 0 2
    1) "d"
    2) "c"
    3) "b"
    #取鏈表中的全部元素,其中0表示第一個元素,-1表示最后一個元素。
    redis 127.0.0.1:6379> lrange mykey 0 -1
    1) "d"
    2) "c"
    3) "b"
    4) "a"
    #mykey2鍵此時并不存在,因此該命令將不會進行任何操作,其返回值為0。
    redis 127.0.0.1:6379> lpushx mykey2 e
    (integer) 0
    #可以看到mykey2沒有關聯任何List Value。
    redis 127.0.0.1:6379> lrange mykey2 0 -1
    (empty list or set)
    #mykey鍵此時已經存在,所以該命令插入成功,并返回鏈表中當前元素的數量。
    redis 127.0.0.1:6379> lpushx mykey e
    (integer) 5
    #獲取該鍵的List Value的頭部元素。
    redis 127.0.0.1:6379> lrange mykey 0 0
    1) "e"

    2. LPOP/LLEN:
 
復制代碼 代碼如下:

    redis 127.0.0.1:6379> lpush mykey a b c d
    (integer) 4
    redis 127.0.0.1:6379> lpop mykey
    "d"
    redis 127.0.0.1:6379> lpop mykey
    "c"
    #在執行lpop命令兩次后,鏈表頭部的兩個元素已經被彈出,此時鏈表中元素的數量是2
    redis 127.0.0.1:6379> llen mykey
    (integer) 2

   3. LREM/LSET/LINDEX/LTRIM:
  
復制代碼 代碼如下:

    #為后面的示例準備測試數據。
    redis 127.0.0.1:6379> lpush mykey a b c d a c
    (integer) 6
    #從頭部(left)向尾部(right)變量鏈表,刪除2個值等于a的元素,返回值為實際刪除的數量。
    redis 127.0.0.1:6379> lrem mykey 2 a
    (integer) 2
    #看出刪除后鏈表中的全部元素。
    redis 127.0.0.1:6379> lrange mykey 0 -1
    1) "c"
    2) "d"
    3) "c"
    4) "b"
    #獲取索引值為1(頭部的第二個元素)的元素值。
    redis 127.0.0.1:6379> lindex mykey 1
    "d"
    #將索引值為1(頭部的第二個元素)的元素值設置為新值e。
    redis 127.0.0.1:6379> lset mykey 1 e
    OK
    #查看是否設置成功。
    redis 127.0.0.1:6379> lindex mykey 1
    "e"
    #索引值6超過了鏈表中元素的數量,該命令返回nil。
    redis 127.0.0.1:6379> lindex mykey 6
    (nil)
    #設置的索引值6超過了鏈表中元素的數量,設置失敗,該命令返回錯誤信息。
    redis 127.0.0.1:6379> lset mykey 6 hh
    (error) ERR index out of range
    #僅保留索引值0到2之間的3個元素,注意第0個和第2個元素均被保留。
    redis 127.0.0.1:6379> ltrim mykey 0 2
    OK
    #查看trim后的結果。
    redis 127.0.0.1:6379> lrange mykey 0 -1
    1) "c"
    2) "e"
    3) "c"

    4. LINSERT:
 
復制代碼 代碼如下:

    #刪除該鍵便于后面的測試。
    redis 127.0.0.1:6379> del mykey
    (integer) 1
    #為后面的示例準備測試數據。
    redis 127.0.0.1:6379> lpush mykey a b c d e
    (integer) 5
    #在a的前面插入新元素a1。
    redis 127.0.0.1:6379> linsert mykey before a a1
    (integer) 6
    #查看是否插入成功,從結果看已經插入。注意lindex的index值是0-based。
    redis 127.0.0.1:6379> lindex mykey 0
    "e"
    #在e的后面插入新元素e2,從返回結果看已經插入成功。
    redis 127.0.0.1:6379> linsert mykey after e e2
    (integer) 7
    #再次查看是否插入成功。
    redis 127.0.0.1:6379> lindex mykey 1
    "e2"
    #在不存在的元素之前或之后插入新元素,該命令操作失敗,并返回-1。
    redis 127.0.0.1:6379> linsert mykey after k a
    (integer) -1
    #為不存在的Key插入新元素,該命令操作失敗,返回0。
    redis 127.0.0.1:6379> linsert mykey1 after a a2
    (integer) 0

    5. RPUSH/RPUSHX/RPOP/RPOPLPUSH:
 
復制代碼 代碼如下:

    #刪除該鍵,以便于后面的測試。
    redis 127.0.0.1:6379> del mykey
    (integer) 1
    #從鏈表的尾部插入參數中給出的values,插入順序是從左到右依次插入。
    redis 127.0.0.1:6379> rpush mykey a b c d
    (integer) 4
    #通過lrange的可以獲悉rpush在插入多值時的插入順序。
    redis 127.0.0.1:6379> lrange mykey 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    #該鍵已經存在并且包含4個元素,rpushx命令將執行成功,并將元素e插入到鏈表的尾部。
    redis 127.0.0.1:6379> rpushx mykey e
    (integer) 5
    #通過lindex命令可以看出之前的rpushx命令確實執行成功,因為索引值為4的元素已經是新元素了。
    redis 127.0.0.1:6379> lindex mykey 4
    "e"
    #由于mykey2鍵并不存在,因此該命令不會插入數據,其返回值為0。
    redis 127.0.0.1:6379> rpushx mykey2 e
    (integer) 0
    #在執行rpoplpush命令前,先看一下mykey中鏈表的元素有哪些,注意他們的位置關系。
    redis 127.0.0.1:6379> lrange mykey 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    5) "e"
    #將mykey的尾部元素e彈出,同時再插入到mykey2的頭部(原子性的完成這兩步操作)。
    redis 127.0.0.1:6379> rpoplpush mykey mykey2
    "e"
    #通過lrange命令查看mykey在彈出尾部元素后的結果。
    redis 127.0.0.1:6379> lrange mykey 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    #通過lrange命令查看mykey2在插入元素后的結果。
    redis 127.0.0.1:6379> lrange mykey2 0 -1
    1) "e"
    #將source和destination設為同一鍵,將mykey中的尾部元素移到其頭部。
    redis 127.0.0.1:6379> rpoplpush mykey mykey
    "d"
    #查看移動結果。
    redis 127.0.0.1:6379> lrange mykey 0 -1
    1) "d"
    2) "a"
    3) "b"
    4) "c"

四、鏈表結構的小技巧:

 

      針對鏈表結構的Value,Redis在其官方文檔中給出了一些實用技巧,如RPOPLPUSH命令,下面給出具體的解釋。
      Redis鏈表經常會被用于消息隊列的服務,以完成多程序之間的消息交換。假設一個應用程序正在執行LPUSH操作向鏈表中添加新的元素,我們通常將這樣的程序稱之為"生產者(Producer)",而另外一個應用程序正在執行RPOP操作從鏈表中取出元素,我們稱這樣的程序為"消費者(Consumer)"。如果此時,消費者程序在取出消息元素后立刻崩潰,由于該消息已經被取出且沒有被正常處理,那么我們就可以認為該消息已經丟失,由此可能會導致業務數據丟失,或業務狀態的不一致等現象的發生。然而通過使用RPOPLPUSH命令,消費者程序在從主消息隊列中取出消息之后再將其插入到備份隊列中,直到消費者程序完成正常的處理邏輯后再將該消息從備份隊列中刪除。同時我們還可以提供一個守護進程,當發現備份隊列中的消息過期時,可以重新將其再放回到主消息隊列中,以便其它的消費者程序繼續處理。


注:相關教程知識閱讀請移步到Redis頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久91| 国产亚洲欧洲高清一区| 成人免费视频a| 成人激情视频小说免费下载| 国产精品久久网| 国产精品免费久久久久影院| 亚洲福利在线视频| 成人国产精品久久久久久亚洲| 久久伊人免费视频| 欧美精品在线观看| 欧美老肥婆性猛交视频| 久久久免费观看| 亚洲最大成人网色| 亚洲精品美女视频| 久久人人爽人人| 人九九综合九九宗合| 91精品久久久久久久久中文字幕| 成人黄在线观看| 亚洲综合在线做性| 国产精品青青在线观看爽香蕉| 国产精品一区二区久久久| 久久精品久久久久电影| 日本精品久久久| 欧美大胆a视频| 清纯唯美亚洲综合| 亚洲欧美国产精品专区久久| 亚洲女人天堂色在线7777| 久久久久久一区二区三区| 国产一区二区香蕉| 日韩欧美国产黄色| 国产精品免费久久久久影院| 国产成人精品在线播放| 国产一区二区三区毛片| 久久久精品免费视频| 国产精品久久久久久久久久久久久久| 中文字幕久热精品视频在线| 日韩大片在线观看视频| 久色乳综合思思在线视频| 精品人伦一区二区三区蜜桃免费| 久久国产精品久久久久久| 91老司机精品视频| 九色91av视频| 欧美日韩在线观看视频小说| 国产精品r级在线| 久久国产精品久久精品| 亚洲奶大毛多的老太婆| 日韩电影在线观看免费| 国产日韩换脸av一区在线观看| 中文字幕亚洲一区在线观看| 欧美黑人xxx| 亚洲欧洲午夜一线一品| 日韩美女写真福利在线观看| 精品国产一区二区三区在线观看| 福利二区91精品bt7086| 欧美成人免费在线观看| 欧美性videos高清精品| 91国产美女在线观看| 国产精品一区二区av影院萌芽| 国产精品一区二区3区| 色偷偷av亚洲男人的天堂| 国产视频亚洲视频| 91久久久亚洲精品| 国产欧美日韩中文字幕| 亚洲精品电影网站| 91久久精品国产91久久性色| 亚洲人成77777在线观看网| 国产高清视频一区三区| 亚洲桃花岛网站| 欧美在线一级va免费观看| 高潮白浆女日韩av免费看| 国产精品中文字幕久久久| 国产精品v日韩精品| 亚洲人成绝费网站色www| 亚洲美女精品成人在线视频| 亚洲摸下面视频| 97久久精品国产| 91最新国产视频| 亚洲自拍小视频免费观看| 久久综合88中文色鬼| 精品国产91久久久| 亚洲免费人成在线视频观看| 亚洲视频在线免费观看| 久久69精品久久久久久国产越南| 97久久精品人人澡人人爽缅北| 热99精品只有里视频精品| 中文字幕亚洲国产| 麻豆乱码国产一区二区三区| 91理论片午午论夜理片久久| 亚洲999一在线观看www| 亚洲v日韩v综合v精品v| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美在线x视频| 久久亚洲精品中文字幕冲田杏梨| 精品国产1区2区| 国产91精品青草社区| 中文字幕日韩欧美精品在线观看| 国产欧美精品一区二区三区介绍| 在线播放日韩欧美| 91精品啪在线观看麻豆免费| 国产精品精品久久久| 欧美专区福利在线| 欧美高跟鞋交xxxxhd| 亚洲国产97在线精品一区| 国产精品亚洲激情| 亚洲精品国精品久久99热| 日韩在线不卡视频| 欧美成人免费在线视频| 欧美xxxx做受欧美| 亚洲欧洲国产伦综合| 国产精品视频久久久久| 亚洲人成亚洲人成在线观看| 日韩免费高清在线观看| 欧美日本在线视频中文字字幕| 国产成人aa精品一区在线播放| 亚洲图片欧美日产| 欧美精品成人在线| 国产日韩中文字幕在线| 亚洲综合中文字幕68页| 91深夜福利视频| 色综合天天综合网国产成人网| 国产91在线播放精品91| 欧美在线视频在线播放完整版免费观看| 欧美精品生活片| 久久网福利资源网站| 91国产美女在线观看| 日韩在线视频免费观看高清中文| 2019国产精品自在线拍国产不卡| 搡老女人一区二区三区视频tv| 最近2019中文字幕mv免费看| 日韩精品极品在线观看播放免费视频| 亚洲国产精品久久久久秋霞蜜臀| 亚洲第一天堂无码专区| 亚洲精品日韩丝袜精品| 国产视频丨精品|在线观看| 国产69精品久久久久久| 91av在线播放视频| 日本韩国在线不卡| 青青久久av北条麻妃黑人| 91精品国产综合久久久久久久久| 日韩av手机在线观看| 国产精品极品美女在线观看免费| 国产成人短视频| 欧美国产日韩视频| 丝袜一区二区三区| 国产精品激情av电影在线观看| 亚洲最大成人免费视频| 国产成人福利网站| 国产视频一区在线| 国产成人免费91av在线| 欧美在线一区二区视频| 欧美日韩国产精品| 日本一区二区在线免费播放| 欧美亚洲视频在线看网址| 国产精品久久久久久久9999| 最新日韩中文字幕| 亚洲精品一区二三区不卡| 欧美成人午夜影院| 久久久91精品国产一区不卡| 亚洲成人在线视频播放| 亚洲午夜未满十八勿入免费观看全集| 免费91麻豆精品国产自产在线观看| 亚洲va男人天堂| 欧美一级高清免费播放| 国产一区二区三区中文|