四、清單類型
清單類型也是一個我們很長要用到的一個類型。比如我們發部落格,要用到部落格列表。如果沒有列表我們就只能遍曆鍵來擷取所有文章或一部分文章了,這個文法是keys,但是這個命令需要遍曆資料庫中的所有鍵,處於效能方面的考慮,在生產環境是不推薦使用的。
清單類型可以儲存一個有序的字串列表,常用的操作是向列表兩端添加、刪除、擷取元素,或者某個片段。在redis中,實際上是使用雙向列表的方式實現的,所以在列表兩端添加刪除元素的時間複雜度是O(1),擷取的元素越接近兩端,速度越快。但是通過索引訪問元素就會很慢,尤其是列表很長的時候。但是如果只是獲得隊列開頭或結尾的前多少個元素,這個就和隊列長度無關了。所以這裡隊列非常適合我們的評論功能,以及一些新鮮事等功能的開發,記錄日誌也很好用。
1、增加元素命令
向列表兩端添加元素: Shell redis>lpush key value [value ...] redis>rpush key value [value ...]
1 2 |
redis & gt ; lpush key value [ value . . . ] redis & gt ; rpush key value [ value . . . ] |
這裡也很容易明白,lpush的l是left,向列表左邊添加元素,r自然就是right右邊的意思了。 Shell redis>lpush numbers 0 (integer) 1 redis>rpush numbers 1 (integer) 2 redis>lpush numbers -1 -2 (integer) 4
1 2 3 4 5 6 |
redis & gt ; lpush numbers 0 ( integer ) 1 redis & gt ; rpush numbers 1 ( integer ) 2 redis & gt ; lpush numbers - 1 - 2 ( integer ) 4 |
傳回值是列表的長度。這裡push的值可以是多個,但是有一點要說明一下。像是相面這樣左邊push了兩個值-1、-2,實際上現在列表的值是這樣排序的,-2、-1、0、1,所以就算是同時push多個,實際上也是一個一個插入列表的,只不過這些操作都會是原子的。
2、彈出元素命令 Shell redis>lpop key redis>rpop key
1 2 |
redis & gt ; lpop key redis & gt ; rpop key |
這裡就很好理解了,分別是從左彈出,從右彈出,傳回值是彈出的值。(彈出的意思就是把值移除並傳回值)
綜合上面四條命令,可以實現棧和隊列了。
棧:lpush和lpop或者使用rpush和rpop。
隊列:lpush和rpop或者使用rpush和lpop。
3、擷取列表中元素的個數 Shell redis>llen key
當鍵不存在是返回0,這個如果一路學下來都可以猜到了。這裡redis執行這條命令的時間複雜度是O(1),不像關係型資料庫中的O(N)。
4、擷取列表片段 Shell redis>lrange key start stop
1 |
redis & gt ; lrange key start stop |
lrange命令比較常用,返回從start到stop的所有元素的列表,start和stop都是從0開始。 Shell redis>lrange numbers 0 2 1) "-2" 2) "-1" 3) "0"
1 2 3 4 |
redis & gt ; lrange numbers 0 2 1 ) "-2" 2 ) "-1" 3 ) "0" |
lrange還支援負值索引,這裡是負值大家可以把負號加值直接理解成從從右數第多少個。
例如現在numbers的值是-2、-1、0、1,我們要是執行lrange numbers -2 -1,就會得到最後兩個值。還有lrange numbers 0 -1是我們常用的用來擷取全部列表的命令。
這裡有兩點要注意一下:
(1)如果start索引比stop索引位置靠後(這裡說的是位置,不是索引值的大小),則會返回空列表(empty list or set)。
(2)如果stop大於實際的索引範圍,則會返回列表最後變的元素。
5、刪除列表中指定值 Shell redis>lrem key count value
1 |
redis & gt ; lrem key count value |
lrem命令會刪除列表中前count個值為value的元素,返回實際刪除的元素個數。實際count大小不同,執行方式不同。
(1)count > 0:從列表左邊開始刪除前count個值為value的元素
(2)count < 0:從右邊開始刪除
(3)count = 0:刪除所有
傳回值是刪除值的個數。
6、獲得/設定指定索引的元素值 Shell redis>lindex key index redis>lset key index value
1 2 |
redis & gt ; lindex key index redis & gt ; lset key index value |
這裡應該很好理解了,特殊說明一下index如果是負值的話就是從右邊開始計算索引,和lrange的負值是一個意思。
7、只保留列表中指定的片段 Shell redis>ltrim key start end
1 |
redis & gt ; ltrim key start end |
這裡也不做特殊說明了。
8、向列表中插入元素
現在我們列表中的值是-2、-1、0、1 Shell