新聞中心

乳山ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
當(dāng)向列表中添加元素值時(shí),首先需要給這個(gè)列表指定一個(gè) key 鍵,然后使用相應(yīng)的命令,從列表的左側(cè)(頭部)或者右側(cè)(尾部)來(lái)添加元素,這些元素會(huì)以添加時(shí)的順序排列。一個(gè)列表最多可以包含 2^32 - 1 個(gè)元素(約 40 億個(gè)元素),當(dāng)列表彈出最后一個(gè)元素時(shí),該結(jié)構(gòu)會(huì)被自動(dòng)刪除。
認(rèn)識(shí)Redis列表
Redis 列表的底層存儲(chǔ)結(jié)構(gòu),其實(shí)是一個(gè)被稱為快速鏈表(quicklist)的結(jié)構(gòu)。當(dāng)列表中存儲(chǔ)的元素較少時(shí),Redis 會(huì)使用一塊連續(xù)的內(nèi)存來(lái)存儲(chǔ)這些元素,這個(gè)連續(xù)的結(jié)構(gòu)被稱為 ziplist(壓縮列表),它將所有的元素緊挨著一起存儲(chǔ)。
壓縮列表是 Redis 為節(jié)省內(nèi)存而開(kāi)發(fā)的,它是由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),一個(gè)壓縮列表了可以包含任意多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都可以保存一個(gè)字符數(shù)組或者整數(shù)值。
而當(dāng)數(shù)據(jù)量較大時(shí),Redis 列表就會(huì)是用 quicklist(快速鏈表)存儲(chǔ)元素。Redis 之所以采用兩種方法相結(jié)合的方式來(lái)存儲(chǔ)元素。這是因?yàn)閱为?dú)使用普通鏈表存儲(chǔ)元素時(shí),所需的空間較大,會(huì)造成存儲(chǔ)空間的浪費(fèi)。因此采用了鏈表和壓縮列表相結(jié)合的方式,也就是 quicklist + ziplist,結(jié)構(gòu)如下圖:
圖1:快速鏈表
如上圖 1 所示,將多個(gè) ziplist 使用雙向指針串聯(lián)起來(lái),這樣既能滿足快速插入、刪除的特性,又節(jié)省了一部分存儲(chǔ)空間。
基本命令演示
下面學(xué)習(xí)如何使用命令操作 Redis 列表。以下示例演示了如何從列表的左側(cè)、右側(cè)添加和彈出元素。
#從左側(cè)頭部插入元素 127.0.0.1:6379> LPUSH www.biancheng.net python (integer) 1 127.0.0.1:6379> LPUSH www.biancheng.net java c c# (integer) 4 #查看插入的元素 127.0.0.1:6379> LRANGE www.biancheng.net 0 4 1) "c#" 2) "c" 3) "java" 4) "python" #從右側(cè)尾部插入元素 127.0.0.1:6379> RPUSH www.biancheng.net "Math" (integer) 5 127.0.0.1:6379> RPUSH www.biancheng.net "Computer Language" (integer) 6 #查看元素 127.0.0.1:6379> LRANGE www.biancheng.net 0 6 1) "c#" 2) "c" 3) "java" 4) "python" 5) "Math" 6) "Computer Language" #在python前面插入元素 127.0.0.1:6379> LINSERT www.biancheng.net BEFORE python Python (integer) 7 #從左側(cè)彈出元素 127.0.0.1:6379> LPOP www.biancheng.net "c#" #從右側(cè)彈出元素 127.0.0.1:6379> RPOP www.biancheng.net "Computer Language"
隊(duì)列和棧實(shí)現(xiàn)
Redis 列表可以被當(dāng)做棧、隊(duì)列來(lái)使用,如果列表的元素是“左進(jìn)右出”那就是隊(duì)列模型;如果元素是“右進(jìn)右出”那就是棧模型,示例如下:
1) 右進(jìn)左出
127.0.0.1:6379> Rpush book c python java (integer) 3 127.0.0.1:6379> lpop book "c" 127.0.0.1:6379> lpop book "python" 127.0.0.1:6379> lpop book "java" 127.0.0.1:6379> lpop book (nil)
2) 右進(jìn)右出
127.0.0.1:6379> RPUSH book c python java (integer) 3 127.0.0.1:6379> rpop book "java" 127.0.0.1:6379> rpop book "python" 127.0.0.1:6379> rpop book "c" 127.0.0.1:6379> rpop book (nil)
除上述模型外,Redis 的列表也常被用作異步隊(duì)列。使用流程大致如下:一個(gè)線程將需要延時(shí)處理的任務(wù)序列化成字符串,并“塞”進(jìn) Redis 列表中,而另外一個(gè)線程則以輪詢的方式從該列表中讀取“任務(wù)”。
常用命令
| 命令 | 說(shuō)明 |
|---|---|
| LPUSH key value1 [value2] | 在列表頭部插入一個(gè)或者多個(gè)值。 |
| LRANGE key start stop | 獲取列表指定范圍內(nèi)的元素。 |
| RPUSH key value1 [value2] | 在列表尾部添加一個(gè)或多個(gè)值。 |
| LPUSHX key value | 當(dāng)儲(chǔ)存列表的 key 存在時(shí),用于將值插入到列表頭部。 |
| RPUSHX key value | 當(dāng)存儲(chǔ)列表的 key 存在時(shí),用于將值插入到列表的尾部。 |
| LINDEX key index | 通過(guò)索引獲取列表中的元素。 |
| LINSERT key before|after pivot value | 指定列表中一個(gè)元素在它之前或之后插入另外一個(gè)元素。 |
| LREM key count value | 表示從列表中刪除元素與 value 相等的元素。count 表示刪除的數(shù)量,為 0 表示全部移除。 |
| LSET key index value | 表示通過(guò)其索引設(shè)置列表中元素的值。 |
| LTRIM key start stop | 保留列表中指定范圍內(nèi)的元素值。 |
| LPOP key | 從列表的頭部彈出元素,默認(rèn)為第一個(gè)元素。 |
| RPOP key | 從列表的尾部彈出元素,默認(rèn)為最后一個(gè)元素。 |
| LLEN key | 用于獲取列表的長(zhǎng)度。 |
| RPOPLPUSH source destination | 用于刪除列表中的最后一個(gè)元素,然后將該元素添加到另一個(gè)列表的頭部,并返回該元素值。 |
| BLPOP key1 [key2 ] timeout | 用于刪除并返回列表中的第一個(gè)元素(頭部操作),如果列表中沒(méi)有元素,就會(huì)發(fā)生阻塞, 直到列表等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。 |
| BRPOP key1 [key2 ] timeout | 用于刪除并返回列表中的最后一個(gè)元素(尾部操作),如果列表中沒(méi)有元素,就會(huì)發(fā)生阻塞, 直到列表等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。 |
| BRPOPLPUSH source destination timeout | 從列表中取出最后一個(gè)元素,并插入到另一個(gè)列表的頭部。如果列表中沒(méi)有元素,就會(huì)發(fā)生 阻塞,直到等待超時(shí)或發(fā)現(xiàn)可彈出元素時(shí)為止。 |
在線練習(xí)工具:https://try.redis.io/
查看更多命令:https://redis.io/commands
文章名稱:Redislist列表
分享路徑:http://m.fisionsoft.com.cn/article/cccpdsc.html


咨詢
建站咨詢
