redis基礎之資料型別 列表型別

2021-06-26 21:41:48 字數 4183 閱讀 4467

列表型別(list)可以儲存乙個有序的字串列表,常用的操作室向列表兩端新增元素,或者獲得列表的某乙個片段。列表型別內部是使用雙向鍊錶(double linked list)實現的,所有向列表兩端新增元素時間複雜度為o(1),獲取越接近兩端的元素速度就越快。這意味著即使是乙個有幾千萬個元素的列表,獲取頭部和尾部的記錄也是極快的。不過使用鍊錶的代價是通過索引訪問元素比較慢,必須從頭或者尾開始索引。這種特性使得列表型別能夠非常快速地完成關聯式資料庫難以應對的場合:如社交網路的新鮮事,我們只是關心最新的內容,使用類表型別儲存,即使新鮮事有幾萬個,獲得最新的前100個也是很快的。同樣因為在兩端插入記錄的時間複雜度為o(1),列表型別適合用來記錄日誌,可以保證加入新日誌的速度不會受到已有日誌數量的影響。與雜湊型別鍵最多容量的字段數量相同,乙個列表型別鍵最多能容納2^32-1個元素。

lpush key value [value ...]

rpush key value [value ...]

lpush命令用來向類表左邊(left)增加元素,rpush命令向列表右邊(right)增加元素,返回值表示增加元素後列表的長度。

127.0.0.1:6379> lpush numbers 1

(integer) 1

127.0.0.1:6379> lpush numbers 2 3

(integer) 3

127.0.0.1:6379> rpush numbers 0 -1

(integer) 5

redis中numbers此時應該為【3 2 1 0 -1】

lpop key

rpop key

lpop和rpop分別從左邊和右邊彈出元素,返回彈出的元素。彈出分為兩步:第一步是將列表左邊的元素從列表中刪除,第二步是返回被移除的元素。例如,從numbers左邊和右邊分別彈出乙個元素:

127.0.0.1:6379> lpop numbers

"3"127.0.0.1:6379> rpop numbers

"-1"

此時numbers鍵中的資料應該為:【2 1 0】。結合push和pop命令,可以使用列表來模擬棧和佇列的操作。

llen key

127.0.0.1:6379> llen numbers

(integer) 3

llen命令的功能類似於sql語句select count(*) from table_name,但llen的時間複雜度為o(1),使用時redis會直接讀取現成的值,而不需要像部分關係型資料庫那樣需要遍歷一遍資料表來統計條目數量。

lrange key start stop

lrange命令是列表型別最常用的命令之一,它能夠獲得列表中的某一片段。lrange命令將返回索引從start到stop之間的所有元素(包括兩端的元素),redis的列表起始索引為0:

127.0.0.1:6379> lrange numbers 0 2

1) "2"

2) "1"

3) "0"

lrange命令在獲取元素的同時不會像pop那樣刪除元素,同時lrange命令也支援負索引,表示從右邊開始計算序數,如「-1」表示最右邊第乙個元素,「-2」表示最右邊第二個元素,依次類推:

127.0.0.1:6379> lrange numbers -2 -1

1) "1"

2) "0"

顯然,lrange numbers 0 -1可以獲得列表中的所有元素。另外一些特殊情況下:

lrem key count value

lrem命令會刪除類表當前count個值為value的元素,返回值是實際刪除的元素個數。根據count值得不同,lrem命令的執行方式會略有差異:

lindex key  index

lset key index value

lindex命令用來返回指定索引的元素,索引從0開始,index也可以為負數,表示從右數第幾個:

127.0.0.1:6379> lrange numbers 0 -1

1) "2"

2) "1"

3) "0"

127.0.0.1:6379> lindex numbers 1

"1"127.0.0.1:6379> lindex numbers -1

"0"127.0.0.1:6379> lindex numbers -3

"2"

lset會將索引為index的元素賦值為value,例如:

127.0.0.1:6379> lset numbers 1 7

ok127.0.0.1:6379> lindex numbers 1

"7"

ltrim key start end

ltrim命令可以刪除指定索引範圍之外的所有元素,其指定範圍的方法和lrange命令相似

127.0.0.1:6379> lrange numbers 0 -1

1) "5"

2) "4"

3) "3"

4) "2"

5) "7"

6) "0"

127.0.0.1:6379> ltrim numbers 2 4

ok127.0.0.1:6379> lrange numbers 0 -1

1) "3"

2) "2"

3) "7"

127.0.0.1:6379>

ltrim命令常和lpush命令一起使用來限制列表中元素的數量,比如記錄日誌時,我們常希望保留最新的100條日誌,每次新加入元素時呼叫一次ltrim命令即可:

127.0.0.1:6379> lpush logs $newlog

127.0.0.1:6379> ltrim logs 0 99

linsert key before | after p_value value

linsert 命令首先會在列表中從左到右查詢值為p_value的元素,然後根據第二個引數是befor還是after來決定將value插入到該元素的前面還是後面。linsert的返回值是插入後列表的元素的個數。

127.0.0.1:6379> lrange numbers 0 -1

1) "3"

2) "2"

3) "7"

127.0.0.1:6379> linsert numbers after 2 3

(integer) 4

127.0.0.1:6379> lrange numbers 0 -1

1) "3"

2) "2"

3) "3"

4) "7"

127.0.0.1:6379> linsert numbers before 2 4

(integer) 5

127.0.0.1:6379> lrange numbers 0 -1

1) "3"

2) "4"

3) "2"

4) "3"

5) "7"

rpoplpush source destination

rpoplpush從字面上就可以看出它的功能,先執行rpop命令再執行lpush命令。rpoplpush命令先從source列表型別鍵的右邊彈出乙個元素,然後將其加入到destination列表型別鍵的左邊,並返回這個元素的值,整個過程是原子操作的。

當把列表當做佇列使用時,rpoplpush命令可以很直觀地在多個佇列中傳遞資料。當source和destination相同時,rpoplpush命令會不斷地將隊尾的元素移動到隊首,借助這個命令,可以實現乙個**監控系統:使用乙個佇列儲存需要監控的**,然後監控程式不斷地使用rpoplpush命令迴圈取出乙個**來測試可用性。這裡使用rpoplpush命令的好處在於:在程式執行過程中扔可以不斷地向**列表中增加新的**,而且整個系統容易擴充套件,允許多個客戶端同時處理佇列。

redis 列表 資料型別

列表 rpush dname 技術部 後勤部 售後部 lpush dname 秘書部 lset dname 2 銷售部 修改 lrange dname 0 1 列印所有列表 llen dname 獲取長度 lindex dname 0 獲取列表某個元素 linsert 在某個位置插入元素 linse...

redis基礎之資料型別 雜湊型別

redis是採用字典結構以鍵值對的形式儲存資料的,而雜湊型別 hash 的鍵值也是一種字典結構,其儲存了字段和字段值的對映,但字段值只能是字串,不支援其他資料型別,也就是說,雜湊型別不能巢狀其他的資料型別。乙個雜湊型別鍵可以包含至多2 32 1個字段。除了雜湊型別,redis的其他資料型別同樣不支援...

Redis資料型別 List列表型別

介紹 列表型別 list 可以儲存乙個有序的字串列表,常用的操作時向列表兩端新增元素,或者或者列表的某乙個片段。列表型別內部是使用雙向鍊錶實現的。所以向列表兩端新增元素的時間複雜度為o 1 獲取越接近兩端的元素速度就越快。不過使用鍊錶的代價是通過索引訪問元素比較慢,列表也適合用來記錄日誌,可以保證加...