参考资料
Redis 常用命令,思维导图:https://www.kdocs.cn/view/l/ss49IFenIOSm
底层实现
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合适例如优惠券
常用命令
命 令 | 说 明 | 备 注 |
---|---|---|
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 结构中所有的值 | —— |