简介
Hash类型是String类型的filed和value的映射表,或者说是一个String集合,hash特别适合存储对象,相对比较而言,将一个对象类型存储在hash类型要比存储在String类型里占用更少的内存空间,并对整个对象的存取,可以看成具有key和value的map容器,该类型非常适合于存储值对象的信息,如uname,upass,age等,该类型的数据仅占用很少的磁盘空间(相比于JSON)。
Redis中每个hash可以存储2的32次方-1的键值对(40多亿)
其中list、set、hash、zset这四种数据结构是容器型数据结构,它们共享下面两条通用规则:
- create if not exists:容器不存在则创建
- drop if no elements:如果容器中没有元素,则立即删除容器,释放内存
hash(字典)的内部结构
Redis的hash(字典)相当于Java语言中的HashMap,它是根据散列值分布的无序字典,内部的元素是通过键值对的方式存储。
hash(字典)的实现与Java中的HashMap(JDK1.7)的结构也是一致的,它的数据结构也是数组+链表组成的二维结构,节点元素散列在数组上,如果发生hash碰撞则使用链表串联在数组节点上。
hash(字典)的实现与Java中的HashMap(JDK1.7)的结构也是一致的,它的数据结构也是数组+链表组成的二维结构,节点元素散列在数组上,如果发生hash碰撞则使用链表串联在数组节点上。
hash(字典)扩容
Redis中的hash(字典)存储的value只能是字符串值,此外扩容与Java中的HashMap也不同。Java中的HashMap在扩容的时候是一次性完成的,而Redis考虑到其核心存取是单线程的性能问题,为了追求高性能,因而采取了渐进式rehash策略。
渐进式rehash指的是并非一次性完成,它是多次完成的,因此需要保理旧的hash结构,所以Redis中的hash(字典)会存在新旧两个hash结构,在rehash结束后也就是旧hash的值全部搬迁到新hash之后,新的hash在功能上才会完全替代以前的hash。
赋值语法
HSET 为指定的key,设定FILED/VALUE
为指定的key,设定FILED/VALUE
HSET KEY FILED VALUE
127.0.0.1:6379> hset user name dhx
(integer) 1
HMSET批量设置
同时将多个filed-value(域-值)对设置到哈希表key中
HMSET KEY FILED VALUE [KEY FILED VALUE] ....
127.0.0.1:6379> hmset user age 19 sex man
OK
取值语法
HGET 获取存储在hash中的值,根据FILED获得VALUE
获取存储在hash中的值,根据FILED获得VALUE
HGET KEY FILED
127.0.0.1:6379> hget user name
"dhx"
HMGET获取key所有给定字段的值
获取key所有给定字段的值
HMGET KEY FILED [FILED]
127.0.0.1:6379> hmset user age 19 sex man
OK
127.0.0.1:6379> hget user name
"dhx"
127.0.0.1:6379> hmget user age sex
1) "19"
2) "man"
127.0.0.1:6379>
HMGETALL返回指的key所有的字段和值
返回指的key所有的字段和值
HMGETALL KEY
127.0.0.1:6379> hgetall user
1) "name"
2) "dhx"
3) "age"
4) "19"
5) "sex"
6) "man"
HKEYS 获得指定key的所有字段(FILED )
获得指定key的所有字段(FILED )
HKEYS KEY
127.0.0.1:6379> hkeys user
1) "name"
2) "age"
3) "sex"
HVALS 获得指定key的所有值
获得指定key的所有值
HVALS KEY
127.0.0.1:6379> hvals user
1) "dhx"
2) "69.599999999999994"
3) "woman"
HLEN 获取指定key字段的数量
获取指定key字段的数量
HLEN KEY
127.0.0.1:6379> hlen user
(integer) 3
删除语法
HDEL 删除一个或者多个hash表中字段
删除一个或者多个hash表中字段
HDEL KEY FILED1 [FILED2]
127.0.0.1:6379> hdel user sex
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "dhx"
3) "age"
4) "19"
其他语法
HSETNX 只要当字段filed不存在时,设置改字段的值
只要当字段filed不存在时,设置改字段的值
HSETNX KEY FILED VALUE
127.0.0.1:6379> hsetnx user sex woman
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "dhx"
3) "age"
4) "19"
5) "sex"
6) "woman"
HINCRBY 为哈希表key中指定字段的整数加上增量 increment
为哈希表key中指定字段的整数加上增量 increment
HINCRBY KEY FILED increment
127.0.0.1:6379> hincrby user age 20
(integer) 39
127.0.0.1:6379> hget user age
"39"
HINCRBYFLOAT 为哈希表key中指定字段的浮点数加上增量 increment
HINCRBYFLOAT KEY FILED increment
127.0.0.1:6379> hincrbyfloat user age 30.6
"69.599999999999994"
127.0.0.1:6379> hget user age
"69.599999999999994"
HEXISTS 查看哈希表key中,指定字段是否存在
查看哈希表key中,指定字段是否存在
HEXISTS KEY FILED
127.0.0.1:6379> hkeys user
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user aaa
(integer) 0