Redis数据类型之Hash类型

简介

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值