为什么存储成hash会省内存?
之所以存成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设置key和value值,如果不存在key则先创建
127.0.0.1:6379> hset myhash name tonva
(integer) 1
myhash表示的是设置hash的名字
2.hsetnx设置key和value,如果field已经存在返回0,如果不存在返回1
127.0.0.1:6379> hsetnx myhash name "tonva"
(integer) 0
3.hmset,同时设置hash的多个key
127.0.0.1:6379> hmset myhash name tonva password 451989
OK
4.hget获取指定的hash key值
127.0.0.1:6379> hget myhash password
"451989"
5.hmget获取多个hash key的值
127.0.0.1:6379> hmget myhash name password
1) "tonva"
2) "451989"
6.hincrby给指定的hash key加上定值
127.0.0.1:6379> hincrby myhash count 10
(integer) 10
127.0.0.1:6379> hget myhash count
"10"
127.0.0.1:6379> hincrby myhash count -5
(integer) 5
7.hexists测试指定key是否存在
127.0.0.1:6379> hexists myhash count
(integer) 1
127.0.0.1:6379> hexists myhash count2
(integer) 0
8.hlen返回指定hash的field数量
127.0.0.1:6379> hlen myhash
(integer) 3
9.hdel删除指定hash key的值
127.0.0.1:6379> hdel myhash count
(integer) 1
127.0.0.1:6379> hget myhash count
(nil)
10.hkeys,返回hash的所有key
127.0.0.1:6379> hkeys myhash
1) "name"
2) "password"
11.hvals,返回hash的所有value
127.0.0.1:6379> hvals myhash
1) "tonva"
2) "451989"
12.hgetall,获取指定hash中所有key和value
127.0.0.1:6379> hgetall myhash
1) "name"
2) "tonva"
3) "password"
4) "451989"