2.3 hashes類(lèi)型及操作 Redis hash是一個(gè)string類(lèi)型的field和value的映射表.它的添加、刪除操作都是O(1)(平均)。hash特別適合用于存儲(chǔ)對(duì)象。相較于將對(duì)象的每個(gè)字段存成單個(gè)string類(lèi)型。將一個(gè)對(duì)象存儲(chǔ)在hash類(lèi)型中會(huì)占用更少的內(nèi)存,并且可以更方便的存取整個(gè)對(duì)象。省內(nèi)存的原因是新建一個(gè)hash對(duì)象時(shí)開(kāi)始是用zipmap(又稱(chēng)為small hash)來(lái)存儲(chǔ)的。這個(gè)zipmap其實(shí)并不是hash table,但是zipmap相比正常的hash實(shí)現(xiàn)可以節(jié)省不少hash本身需要的一些元數(shù)據(jù)存儲(chǔ)開(kāi)銷(xiāo)。盡管zipmap的添加,刪除,查找都是O(n),但是由于一般對(duì)象的field數(shù)量都不太多。所以使用zipmap也是很快的,也就是說(shuō)添加刪除平均還是O(1)。如果field或者value的大小超出一定限制后,Redis會(huì)在內(nèi)部自動(dòng)將zipmap替換成正常的hash實(shí)現(xiàn). 這個(gè)限制可以在配置文件中指定 hash-max-zipmap-entries 64 #配置字段最多64個(gè) hash-max-zipmap-value 512 #配置value最大為512字節(jié) 2.3.1 hset 設(shè)置hash field為指定值,如果key不存在,則先創(chuàng) 建。 redis 127.0.0.1:6379> hset myhash field1 Hello (integer) 1 redis 127.0.0.1:6379> |
2.3.2 hsetnx 設(shè)置hash field為指定值,如果key不存在,則先創(chuàng)建。如果field已經(jīng)存在,返回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> |
第一次執(zhí)行是成功的,但第二次執(zhí)行相同的命令失敗,原因是field已經(jīng)存在了。 2.3.3 hmset 同時(shí)設(shè)置hash的多個(gè)field。 redis 127.0.0.1:6379> hmset myhash field1 Hello field2 World OK redis 127.0.0.1:6379> |
2.3.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> |
由于數(shù)據(jù)庫(kù)沒(méi)有field3,所以取到的是一個(gè)空值nil 2.3.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> |
由于數(shù)據(jù)庫(kù)沒(méi)有field3,所以取到的是一個(gè)空值nil 2.3.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,即做了一個(gè)減8的操作。 2.3.7 hexists 測(cè)試指定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> |
通過(guò)上例可以說(shuō)明field1存在,但field9是不存在的。 2.3.8 hlen 返回指定hash的field數(shù)量。 redis 127.0.0.1:6379> hlen myhash (integer) 4 redis 127.0.0.1:6379> |
通過(guò)上例可以看到myhash中有4個(gè)field。 2.3.9 hdel 返回指定hash的field數(shù)量。 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> |
2.3.10 hkeys 返回hash的所有field。 redis 127.0.0.1:6379> hkeys myhash 1) "field2" 2) "field" 3) "field3" redis 127.0.0.1:6379> |
說(shuō)明這個(gè)hash中有3個(gè)field 2.3.11 hvals 返回hash的所有value。 redis 127.0.0.1:6379> hvals myhash 1) "World" 2) "Hello" 3) "12" redis 127.0.0.1:6379> |
說(shuō)明這個(gè)hash中有3個(gè)field 2.3.12 hgetall 獲取某個(gè)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> |
可見(jiàn),一下子將myhash中所有的field及對(duì)應(yīng)的value都取出來(lái)了。 -------------------------------------------------------------------
《MongoDB管理與開(kāi)發(fā)精要》、《Redis實(shí)戰(zhàn)》作者
ChinaUnix.net專(zhuān)家 http://cdhongwan.blog.chinaunix.net
@CD紅丸 http://weibo.com/u/2446082491
|