1. 介绍
Redis 中存储的 key-value 本身就是哈希表的结构,存储的 value 也可以是一个哈希表的结构
这里每一个 key 对应的一个 哈希类型用 field-value 来表示
2. 常用命令
命令 | 介绍 | 时间复杂度 |
hset key field value | 用于设置哈希表 | O (1) |
hget key field | 获取哈希表 | O (1) |
hdel key field [field ...] | 删除哈希表 | O (k),k 是字段个数 |
hlen key | 计算哈希表 | O (1) |
hgetall key | 获取哈希表 | O (k),k 是字段个数 |
hmget field [field ...] | 批量获取哈希表 | O (k),k 是字段个数 |
hmset field value [field value ...] | 批量设置哈希表 | O (k),k 是字段个数 |
hexists key field | 判断哈希表 | O (1) |
hkeys key | 获取哈希表 | O (k),k 是字段个数 |
hvals key | 获取哈希表 | O (k),k 是字段个数 |
hsetnx key field value | 只有在哈希表 | O (1) |
hincrby key field n | 将哈希表 | O (1) |
hincrbyfloat key field n | 将哈希表 | O (1) |
hstrlen key field | 计算哈希表 | O (1) |
3. 内部编码
hashtable:最基本的 hash 表
ziplist:如果 hash 表中的元素比较少并且 value 的长度比较短的时候会优化为 ziplist,节省内存
压缩的本质是针对数据进行重新编码,编码之后就能缩小体积,ziplist 付出的代价是进行读写元素时速度较慢,但是如果元素个数较少,影响不大,如果元素个数多了,就会影响效率,所以当哈希表中的元素较少,并且每一个 value 的值的长度都比较短时,使用 ziplist 表示,如果某个 value 长度过长也会转化为 hashtable
4. 应用场景
hash 类型也可以作为缓存来使用,可以用来存储用户信息
通过 hash 表的方式来存储,相比于 String 来存储 JSON 更加简单直观,灵活,JSON 和对象的相互转化需要用到序列化和反序列化,需要一定的开销,不过 hash 的方式存储也设计到 ziplist 到 hashtable 的编码的转换,可能造成内存的较大消耗