Redis中的hash类型

redis自身的键值对是通过哈希的方式来组织的,即key value结构。而value也可以是哈希结构,为了和redis本身的key value区分,采用field value,注意这里的value是field对应的值,不是键key对应的值。

需求:存储一个uid为1的用户对象,姓名zhangsan,年龄18

使用字符串和哈希类型对比
使用string类型的代码“低内聚”,而使用哈希类型是”高内聚“。因为hash类型将用户的信息都存在一个value中,string类型是分别存在不同的value中。

常见命令

hset

设置hash中的field和value
语法:hset key field value [field value...]
时间复杂度:O(1)
返回值:添加的字段个数
image.png

hget

获取hash中指定字段的值
语法:hget key field
时间复杂度:O(1)
返回值:字段对应的值或nil
image.png

hexists

判断是否存在指定字段
语法:hexists key field
时间复杂度:O(1)
返回值:1表示存在,0表示不存在
image.png

hdel

删除hash中指定的字段
语法:hdel key field [field ...]
时间复杂度:O(1)
返回值:返回删除字段个数
image.png

hkeys

返回hash中所有字段
语法:hkeys key
时间复杂度: O(1)
返回值: 返回字段列表
image.png

hvals

返回hash中所有的值
语法:hvals key
时间复杂度:O(1)
返回值:返回所有的值
image.png

hgetall

获取hash中所有字段和对应的值
语法:hgetall key
时间复杂度:O(1)
返回值:返回所有的字段和对应的值
image.png

hmget

一次获取hash中多个字段的值
语法:hget key field [field...]
时间复杂度:O(1)
返回值:返回字段对应的值或者nil
image.png

hlen

获取hash中所有字段的个数
语法:hlen key
时间复杂度:O(1)
返回值:返回字段个数
image.png

hsetnx

只能在字段不存在的情况下,设置hash中的字段和值
语法:hsetnx key field value
时间复杂度:O(1)
返回值:设置成功返回1,设置失败返回0
image.png

hincrby

将hash中字段对应的数值添加指定的值
语法:hincrby key field increment
时间复杂度:O(1)
返回值:字段变化后的值
image.png

hincrbyfloat

hincrby的浮点数版本
语法:hincrbyfloat key field
时间复杂度:O(1)
返回值: 字段变化后的值
image.png

内部编码

hash的内部编码有两种

  1. ziplist压缩列表:当hash类型元素个数较少,同时每个value的值长度都比较短,redis使用ziplist作为hash的内部实现。ziplist使用压缩算法(压缩就是对数据进行重新编码,例如aaaaaabbbbbb重新编码成6a6b,缩小体积),节省内存空间。
  2. hashtable哈希表:当hash类型无法满足ziplist条件时,redis会使用hashtable作为hash的内部实现,因为ziplist读写元素需要压缩和解压缩的过程,当元素多/value值太长的时候读写速度会很慢,而hashtable的读写时间复杂度是O(1)

hash类型的应用场景

作为缓存

场景:存储结构化的数据(类似数据表这样的结构) ,如下图

image.png
使用hash存储
image.png
string类型借助json格式也能做到上述效果,但是比较麻烦。例如只想获取/修改其中某个field,需要把整个json都读取出来,解析成对象,操作field,再重写转成json字符串,再写回去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指挥部在下面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值