首頁 後端開發 C#.Net教程 Redis教學(三):List資料類型

Redis教學(三):List資料類型

Dec 28, 2016 pm 02:28 PM
redis

一、概述:

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

二、相關指令列表:


O(1)O(S+N)O(1) O(1)O(N)O(N)
指令原型 時間複雜度 指令描述 回傳值
LPUSHkey value [value ...Key 製作插入參數中給出的所有Values。如果該Key不存在,則該指令將在插入之前建立一個與該Key關聯的空鍊錶,之後再將資料從鍊錶的頭部插入。如果該鍵的Value不是鍊錶類型,則該指令將傳回相關的錯誤訊息。  插入後鍊錶中元素的數量。 LPUSHX key value 
僅有當參數中指定的Key存在時,該指令才會在其所關聯的List Value的頭部插入參數中給出的Value,否則將存在時,該指令才會在其所關聯的List Value的頭部插入參數中給出的Value,否則將存在不會有任何操作發生。 插入後鍊錶中元素的數量。  LRANGE key start stop 
時間複雜度中的S為start參數表示的偏移量,N表示元素的數量。此指令的參數start和end都是0-based。即0表示鍊錶頭部(leftmost)的第一個元素。其中start的值也可以為負值,-1將表示鍊錶中的最後一個元素,即尾部元素,-2表示倒數第二個並以此類推。指令在取得元素時,start和end位置上的元素也會被取出。如果start的值大於鍊錶中元素的數量,空鍊錶將會被傳回。如果end的值大於元素的數量,則指令則取得從start(包括start)開始,鍊錶中剩餘的所有元素。 傳回指定範圍內元素的清單。 LPOPkey
回傳並彈出指定Key關聯的鍊錶中的第一個元素,即頭部元素,。如果該Key不存,回傳nil。 鍊錶頭部的元素。 LLENkey
傳回指定Key關聯的鍊錶中元素的數量,如果該Key不存在,則傳回0。如果與該Key關聯的Value的類型不是鍊錶,則傳回相關的錯誤訊息。 鍊錶中元素的數量 LREMkey count value 
時間複雜度中N表示鍊錶中元素的數量。在指定Key關聯的鍊錶中,刪除前count個值等於value的元素。如果count大於0,從頭到尾遍歷並刪除,如果count小於0,則從尾向頭遍歷並刪除。如果count等於0,則刪除鍊錶中所有等於value的元素。如果指定的Key不存在,則直接傳回0。 傳回被刪除的元素數量。 LSETkey index value 
時間複雜度中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中給出的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
登入後複製

#为后面的示例准备测试数据。
    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"
登入後複製


    5. RPUSH/RPUSHX/RPOP/RPOPLPUSH:

#删除该键便于后面的测试。
    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
登入後複製


四、鍊錶結構的小技巧:


. RPOPLPUSH指令,以下給出具體的解釋。

      Redis鍊錶經常用於訊息佇列的服務,以完成多程式之間的訊息交換。假設一個應用程式正在執行LPUSH操作向鍊錶中添加新的元素,我們通常將這樣的程式稱之為"生產者(Producer)",而另外一個應用程式正在執行RPOP操作從鍊錶中取出元素,我們稱這樣的程式為"消費者(Consumer)"。如果此時,消費者程式在取出訊息元素後立刻崩潰,由於該訊息已經被取出且沒有被正常處理,那麼我們就可以認為該訊息已經遺失,由此可能會導致業務資料遺失,或是業務狀態的不一致等現象的發生。然而透過使用RPOPLPUSH命令,消費者程式在從主訊息佇列中取出訊息之後再將其插入備份佇列中,直到消費者程式完成正常的處理邏輯後再將該訊息從備份佇列中刪除。同時我們也可以提供一個守護進程,當發現備份佇列中的訊息過期時,可以重新將其再放回主訊息佇列中,以便其它的消費者程式繼續處理。


 以上就是Redis教學(三):List資料類型的內容,更多相關內容請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis計數器怎麼實現 redis計數器怎麼實現 Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

如何優化debian readdir的性能 如何優化debian readdir的性能 Apr 13, 2025 am 08:48 AM

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

See all articles