> **Redis-常用類型操作命令2(Hash/string)**
[TOC]
## 說明 ##
**記錄以下Redis常用類型的操作命令。**
----------
## 哈希介紹 ##
Redis 哈希(Hash)
Redis hash 是一個 string 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用于存儲對象。
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
## Hash ##
<h5>HSET(增加鍵值)</h5>
> HSETNX:當且僅當域 field 尚未存在于哈希表的情況下, 將它的值設置為 value 。
> HMSET:同時將多個 field-value (域-值)對設置到哈希表 key 中。
HSET hash field value 將哈希表 hash 中域 field 的值設置為 value 。
將哈希表 hash 中域 field 的值設置為 value 。
如果給定的哈希表并不存在, 那么一個新的哈希表將被創建并執行 HSET 操作。
如果域 field 已經存在于哈希表中, 那么它的舊值將被新值 value 覆蓋。
----------
127.0.0.1:6379> hset user1 name zhangsan
(integer) 1
127.0.0.1:6379> hset user1 age 19
(integer) 1
127.0.0.1:6379> hset user1 sex boy
(integer) 1
127.0.0.1:6379> hgetall user1
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "sex"
6) "boy"
<h5>HGET(得到鍵值)</h5>
> HGETAL:返回哈希表 key 中,所有的域和值。
> HMGET:返回哈希表 key 中,一個或多個給定域的值。
返回哈希表中給定域的值。
HGET 命令在默認情況下返回給定域的值。
如果給定域不存在于哈希表中, 又或者給定的哈希表并不存在, 那么命令返回 nil 。
----------
127.0.0.1:6379> hgetall user1
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "sex"
6) "boy"
127.0.0.1:6379> hget user name
(nil)
127.0.0.1:6379> hget user1 name
"zhangsan"
127.0.0.1:6379> hgetall user
(empty list or set)
127.0.0.1:6379>
<h5>HEXISTS(檢驗鍵是否存在)</h5>
HEXISTS hash field檢查給定域 field 是否存在于哈希表 hash 當中。
返回值 HEXISTS 命令在給定域存在時返回 1 , 在給定域不存在時返回 0 。
----------
127.0.0.1:6379> hexists user1 name
(integer) 1
127.0.0.1:6379> hexists user1 phone
(integer) 0
<h5>HDEL(刪除鍵值)</h5>
HDEL key field [field …] 刪除哈希表 key 中的一個或多個指定域,不存在的域將被忽略。
在Redis2.4以下的版本里, HDEL 每次只能刪除單個域,如果你需要在一個原子時間內刪除多個域,請將命令包含在 MULTI / EXEC 塊內。
返回值:被成功移除的域的數量,不包括被忽略的域。
----------
127.0.0.1:6379> hgetall user1
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "sex"
6) "boy"
127.0.0.1:6379> hdel user1 name
(integer) 1
<h5>HLEN(得到hash長度)</h5>
HLEN key:返回哈希表 key 中域的數量。
返回值:哈希表中域的數量。
當 key 不存在時,返回 0 。
----------
127.0.0.1:6379> hset user1 name zhangsan
(integer) 1
127.0.0.1:6379> hset user1 age 19
(integer) 1
127.0.0.1:6379> hset user1 sex girl
(integer) 1
127.0.0.1:6379> hgetall
(error) ERR wrong number of arguments for 'hgetall' command
127.0.0.1:6379> hgetall user1
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "sex"
6) "girl"
127.0.0.1:6379> hlen user1
(integer) 3
127.0.0.1:6379>
<h5>HSTRLEN(返回指定鍵值的長度)</h5>
> 可用版本:>= 3.2.0
HSTRLEN key field 返回哈希表 key 中, 與給定域 field 相關聯的值的字符串長度(string length)。
如果給定的鍵或者域不存在, 那么命令返回 0 。
返回值:一個整數。
----------
redis> HMSET myhash f1 "HelloWorld" f2 "99" f3 "-256"
OK
redis> HSTRLEN myhash f1
(integer) 10
redis> HSTRLEN myhash f2
(integer) 2
redis> HSTRLEN myhash f3
(integer) 4
<h5>HSTRLEN(為指定鍵增加值)</h5>
> HINCRBYFLOAT:為哈希表 key 中的域 field 加上浮點數增量 increment 。
為哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以為負數,相當于對給定域進行減法操作。
如果 key 不存在,一個新的哈希表被創建并執行 HINCRBY 命令。
如果域 field 不存在,那么在執行命令前,域的值被初始化為 0 。
對一個儲存字符串值的域 field 執行 HINCRBY 命令將造成一個錯誤。
----------
127.0.0.1:6379> hincrby user1 age 1
(integer) 22
127.0.0.1:6379> hincrby user1 age -1
(integer) 21
<h5>HKEYS(返回所有鍵)</h5>
HKEYS key:返回哈希表 key 中的所有域。
返回值:一個包含哈希表中所有域的表。
當 key 不存在時,返回一個空表。
----------
127.0.0.1:6379> hkeys user1
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hkeys user2
(empty list or set)
<h5>HVALS(返回所有值)</h5>
HVALS key:返回哈希表 key 中所有域的值。
返回值:一個包含哈希表中所有值的表。
當 key 不存在時,返回一個空表。
----------
127.0.0.1:6379> hvals user2
(empty list or set)
127.0.0.1:6379> hvals user1
1) "zhangsan"
2) "21"
3) "girl"
##列表介紹##
Redis 列表(List)
Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)。
##List##
<h5>LPUSH(增加元素)</h5>
> RPUSH: 將一個或多個值 value 插入到列表 key 的表尾(最右邊)。
> RPUSHX:將值 value 插入到列表 key 的表尾,當且僅當 key 存在并且是一個列表。
LPUSH 將一個或多個值 value 插入到列表 key 的表頭
如果有多個 value 值,那么各個 value 值按從左到右的順序依次插入到表頭: 比如說,對空列表 mylist 執行命令 LPUSH mylist a b c ,列表的值將是 c b a ,這等同于原子性地執行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三個命令。
如果 key 不存在,一個空列表會被創建并執行 LPUSH 操作。
當 key 存在但不是列表類型時,返回一個錯誤。
返回值:執行 LPUSH 命令后,列表的長度。
----------
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> rpush list 3
(integer) 3
127.0.0.1:6379> lrange list -0 -1
1) "2"
2) "1"
3) "3"
127.0.0.1:6379> lpush list 3
(integer) 4
127.0.0.1:6379> lrange list -0 -1
1) "3"
2) "2"
3) "1"
4) "3"
<h5>LPOP(移除元素)</h5>
> RPOP:移除并返回列表 key 的尾元素。
LPOP key:移除并返回列表 key 的頭元素。
返回值:列表的頭元素。 當 key 不存在時,返回 nil 。
----------
127.0.0.1:6379> lpop list
"3"
127.0.0.1:6379> lrange list -0 -1
1) "2"
2) "1"
3) "3"
<h5>RPOPLPUSH(左刪除右增加)</h5>
RPOPLPUSH source destination 命令 RPOPLPUSH 在一個原子時間內,執行以下兩個動作:
將列表 source 中的最后一個元素(尾元素)彈出,并返回給客戶端。
將 source 彈出的元素插入到列表 destination ,作為 destination 列表的的頭元素。
舉個例子,你有兩個列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,執行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 會被返回給客戶端。
如果 source 不存在,值 nil 被返回,并且不執行其他動作。
如果 source 和 destination 相同,則列表中的表尾元素被移動到表頭,并返回該元素,可以把這種特殊情況視作列表的旋轉(rotation)操作。
----------
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "1"
3) "3"
127.0.0.1:6379> keys *
1) "list"
2) "user1"
127.0.0.1:6379> RPOPLPUSH list newlist
"3"
127.0.0.1:6379> RPOPLPUSH list newlist
"1"
127.0.0.1:6379> RPOPLPUSH list newlist
"2"
127.0.0.1:6379> RPOPLPUSH list newlist
(nil)
127.0.0.1:6379> lrange newlist 0 -1
1) "2"
2) "1"
3) "3"
127.0.0.1:6379>
<h5>LREM(刪除幾個固定元素)</h5>
LREM key count value:根據參數 count 的值,移除列表中與參數 value 相等的元素。
count 的值可以是以下幾種:
count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量為 count 。
count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量為 count 的絕對值。
count = 0 : 移除表中所有與 value 相等的值。
----------
127.0.0.1:6379> lpush list zhangsan
(integer) 1
127.0.0.1:6379> lpush list lisi
(integer) 2
127.0.0.1:6379> lpush list wangwu
(integer) 3
127.0.0.1:6379> lpush list lisi
(integer) 4
127.0.0.1:6379> lpush list wangwu
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "wangwu"
2) "lisi"
3) "wangwu"
4) "lisi"
5) "zhangsan"
127.0.0.1:6379> lrem list 1 lisi
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "wangwu"
2) "wangwu"
3) "lisi"
4) "zhangsan"
127.0.0.1:6379> lrem list 2 wangwu
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "zhangsan"
返回值
被移除元素的數量。 因為不存在的 key 被視作空表(empty list),所以當 key 不存在時, LREM 命令總是返回 0 。
<h5>LLEN(返回長度)</h5>
LLEN key 返回列表 key 的長度。
如果 key 不存在,則 key 被解釋為一個空列表,返回 0 .
如果 key 不是列表類型,返回一個錯誤。
----------
127.0.0.1:6379> llen list
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
<h5>LINDEX(返回指定下標元素)</h5>
LINDEX key index:返回列表 key 中,下標為 index 的元素。
下標(index)參數 start 和 stop 都以 0 為底,也就是說,以 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。
你也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。
如果 key 不是列表類型,返回一個錯誤。
返回值:列表中下標為 index 的元素。 如果 index 參數的值不在列表的區間范圍內(out of range),返回 nil 。
----------
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "zhangsan"
127.0.0.1:6379> lindex list 0
"lisi"
127.0.0.1:6379> lindex list 1
"zhangsan"
127.0.0.1:6379> lindex list 2
(nil)
<h5>LINSERT(插入元素)</h5>
LINSERT key BEFORE|AFTER pivot value
將值 value 插入到列表 key 當中,位于值 pivot 之前或之后。
當 pivot 不存在于列表 key 時,不執行任何操作。
當 key 不存在時, key 被視為空列表,不執行任何操作。
如果 key 不是列表類型,返回一個錯誤。
返回值:如果命令執行成功,返回插入操作完成之后,列表的長度。 如果沒有找到 pivot ,返回 -1 。 如果 key 不存在或為空列表,返回 0 。
----------
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "zhangsan"
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"
127.0.0.1:6379> linsert list before lisi zhaoliu
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "zhaoliu"
2) "lisi"
3) "wangwu"
4) "zhangsan"
<h5>LSET(更改下標元素)</h5>
LSET key index value 將列表 key 下標為 index 的元素的值設置為 value 。
當 index 參數超出范圍,或對一個空列表( key 不存在)進行 LSET 時,返回一個錯誤。
----------
127.0.0.1:6379> lset list 0 zhangxiaoliu
OK
127.0.0.1:6379> lindex list 0
"zhangxiaoliu"
<h5>LRANGE(返回范圍元素)</h5>
LRANGE key start stop:返回列表 key 中指定區間內的元素,區間以偏移量 start 和 stop 指定。
下標(index)參數 start 和 stop 都以 0 為底,也就是說,以 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。
你也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。
注意LRANGE命令和編程語言區間函數的區別
假如你有一個包含一百個元素的列表,對該列表執行 LRANGE list 0 10 ,結果是一個包含11個元素的列表,這表明 stop 下標也在 LRANGE 命令的取值范圍之內(閉區間),這和某些語言的區間函數可能不一致,比如Ruby的 Range.new 、 Array#slice 和Python的 range() 函數。
超出范圍的下標
超出范圍的下標值不會引起錯誤。
如果 start 下標比列表的最大下標 end ( LLEN list 減去 1 )還要大,那么 LRANGE 返回一個空列表。
如果 stop 下標比 end 下標還要大,Redis將 stop 的值設置為 end 。
返回值:一個列表,包含指定區間內的元素。
----------
127.0.0.1:6379> lrange list 0 1
1) "zhangxiaoliu"
2) "lisi"
127.0.0.1:6379> lrange list 0 4
1) "zhangxiaoliu"
2) "lisi"
3) "wangwu"
4) "zhangsan"
127.0.0.1:6379> lrange list 0 -1
1) "zhangxiaoliu"
2) "lisi"
3) "wangwu"
4) "zhangsan"
<h5>LTRIM(刪除范圍的的元素)</h5>
LTRIM key start stop:對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
舉個例子,執行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三個元素,其余元素全部刪除。
下標(index)參數 start 和 stop 都以 0 為底,也就是說,以 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。
你也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。
當 key 不是列表類型時,返回一個錯誤。
LTRIM 命令通常和 LPUSH key value [value …] 命令或 RPUSH key value [value …] 命令配合使用,舉個例子:
LPUSH log newest_log
LTRIM log 0 99
這個例子模擬了一個日志程序,每次將最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 項。注意當這樣使用 LTRIM 命令時,時間復雜度是O(1),因為平均情況下,每次只有一個元素被移除。
返回值:命令執行成功時,返回 ok 。
----------
127.0.0.1:6379> ltrim list 1 2
OK
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "wangwu"
<h5>BLPOP</h5>
> 詳解: http://redisdoc.com/list/blpop.html
BLPOP 是列表的阻塞式(blocking)彈出原語。
它是 LPOP key 命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被 BLPOP 命令阻塞,直到等待超時或發現可彈出元素為止。
## 結尾 ##
<p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;">
腹有詩書氣自華,最是書香能致遠。
</p>