参考资料

Redis 常用命令,思维导图:https://www.kdocs.cn/view/l/ss49IFenIOSm

底层实现

img

Hash 就是字典,所以明白了这个,接着往下看就没啥问题了

Redis hash数据结构 是一个键值对(key-value)集合,它是一个 string 类型的 field 和 value 的映射表

一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对

table属性是一个数组,数组中的每个元素都是指向dictEntry结构的指针,每个dictEntry结构保存着一个键值对,size属性记录了table的大小 used哈希表目前已有的节点sizemask属性的值总是等于size-1

散列存储

创建的时候是ht0,有数据了就是ht1,然后发现数据大了,就把ht1的数据导入到ht0,然后ht1的数据被清空,ht0数据变大后,再导入到ht1。这样循环扩大存储空间

String+Json 和 Hash 存储对比

类型 String+Json Hash
效率 很高
容量
灵活性
序列化 简单 复杂

应用场景

1、当某个对象需要频繁的更新的时候,不适合用string+json这个方法,因为每次的更新对需要对整个对象序列化复制。如果使用hash的话,就可以直接怼某个单独的字段修改,不需要修改整个对象。(例如:销量、评论数、关注量)

2、所以说,如果你存储的数据里面有很多个field(字段),并且呢还经常更新,那么你最好使用hash,可以更加灵活。反之用string+json合适例如优惠券

常用命令

img

命 令 说 明 备 注
hdel key field1[field2…] 删除 hash 结构中的某个(些)字段 可以进行多个字段的删除
hexists key field 判断 hash 结构中是否存在 field 字段 存在返回 1,否则返回 0
hgetall key 获取所有 hash 结构中的键值 返回键和值
hincrby key field increment 指定给 hash 结构中的某一字段加上一个整数 要求该字段也是整数字符串
hincrbyfloat key field increment 指定给 hash 结构中的某一字段加上一个浮点数 要求该字段是数字型字符串
hkeys key 返回 hash 中所有的键 ——
hlen key 返回 hash 中键值对的数量 ——
hmget key field1[field2…] 返回 hash 中指定的键的值,可以是多个 依次返回值
hmset key field1 value1 [field2 field2…] hash 结构设置多个键值对 ——
hset key filed value 在 hash 结构中设置键值对 单个设值
hsetnx key field value 当 hash 结构中不存在对应的键,才设置值 ——
hvals key 获取 hash 结构中所有的值 ——