標籤:
Redis hash是一個string類型的field和value的映射表.它的添加、刪除操作都是O(1)(平均)。hash特別適合用於儲存物件。相較於將對象的每個欄位存成單個string類型。將一個Object Storage Service在hash類型中會佔用更少的記憶體,並且可以更方便的存取整個對象。省記憶體的原因是建立一個hash對象時開始是用zipmap(又稱為small hash)來儲存的。這個zipmap其實並不是hash table,但是zipmap相比正常的hash實現可以節省不少hash本身需要的一些中繼資料存放區開銷。儘管zipmap的添加,刪除,尋找都是O(n),但是由於一般對象的field數量都不太多。所以使用zipmap也是很快的,也就是說添加刪除平均還是O(1)。如果field或者value的大小超出一定限制後,Redis會在內部自動將zipmap替換成正常的hash實現. 這個限制可以在設定檔中指定
hash-max-zipmap-entries 64 #配置欄位最多64個。
hash-max-zipmap-value 512 #配置value最大為512位元組。
1、hset
設定hash field為指定值,如果key不存在,則先建立。
redis 127.0.0.1:6379> hset myhash field1 Hello
(integer) 1
redis 127.0.0.1:6379>
2、hsetnx
設定hash field為指定值,如果key不存在,則先建立。如果field已經存在,返回0,nx是not exist的意思。
redis 127.0.0.1:6379> hsetnx myhash field "Hello"
(integer) 1
redis 127.0.0.1:6379> hsetnx myhash field "Hello"
(integer) 0
redis 127.0.0.1:6379>
第一次執行是成功的,但第二次執行相同的命令失敗,原因是field已經存在了。
3、hmset
同時設定hash的多個field。
redis 127.0.0.1:6379> hmset myhash field1 Hello field2 World
OK
redis 127.0.0.1:6379>
4、hget
擷取指定的hash field。
redis 127.0.0.1:6379> hget myhash field1
"Hello"
redis 127.0.0.1:6379> hget myhash field2
"World"
redis 127.0.0.1:6379> hget myhash field3
(nil)
redis 127.0.0.1:6379>
由於資料庫沒有field3,所以取到的是一個空值nil。
5、hmget
擷取全部指定的hash filed。
redis 127.0.0.1:6379> hmget myhash field1 field2 field3
1) "Hello"
2) "World"
3) (nil)
redis 127.0.0.1:6379>
由於資料庫沒有field3,所以取到的是一個空值nil。
6、hincrby
指定的hash filed 加上給定值。
redis 127.0.0.1:6379> hset myhash field3 20
(integer) 1
redis 127.0.0.1:6379> hget myhash field3
"20"
redis 127.0.0.1:6379> hincrby myhash field3 -8
(integer) 12
redis 127.0.0.1:6379> hget myhash field3
"12"
redis 127.0.0.1:6379>
在本例中我們將field3的值從20降到了12,即做了一個減8的操作。
7、hexists
測試指定field是否存在。
redis 127.0.0.1:6379> hexists myhash field1
(integer) 1
redis 127.0.0.1:6379> hexists myhash field9
(integer) 0
redis 127.0.0.1:6379>
通過上例可以說明field1存在,但field9是不存在的。
8、hlen
返回指定hash的field數量。
redis 127.0.0.1:6379> hlen myhash
(integer) 4
redis 127.0.0.1:6379>
通過上例可以看到myhash中有4個field。
9、hdel
返回指定hash的field數量。
redis 127.0.0.1:6379> hlen myhash
(integer) 4
redis 127.0.0.1:6379> hdel myhash field1
(integer) 1
redis 127.0.0.1:6379> hlen myhash
(integer) 3
redis 127.0.0.1:6379>
10、hkeys
返回hash的所有field。
redis 127.0.0.1:6379> hkeys myhash
1) "field2"
2) "field"
3) "field3"
redis 127.0.0.1:6379>
說明這個hash中有3個field。
11、hvals
返回hash的所有value。
redis 127.0.0.1:6379> hvals myhash
1) "World"
2) "Hello"
3) "12"
redis 127.0.0.1:6379>
說明這個hash中有3個field。
12、hgetall
擷取某個hash中全部的filed及value。
redis 127.0.0.1:6379> hgetall myhash
1) "field2"
2) "World"
3) "field"
4) "Hello"
5) "field3"
6) "12"
redis 127.0.0.1:6379>
可見,一下子將myhash中所有的field及對應的value都取出來了。
Redis詳解:hashes資料類型及操作