Redis数据结构之哈希hash
哈希类型(hash)用于存储键值对结构的数据,值只能是字符串
常用命令
添加
hset:添加数据,返回1或0
hset key field value
127.0.0.1:6379> hset user:1 name redis
(integer) 1
hmset:批量添加数据
hmset key field1 value1 field2 value2 ..
查询
hget:获取field对应的值,如果field存在,则返回value,如果field不存在,返回nil
hget key field
127.0.0.1:6379> hget user:1 name
""redis
hlen:获取field的个数
hlen key
hmget:批量获取field
hmget key field1 field2 ..
hexists:查询某个field是否存在,返回1或0
hexists key field
hkeys:获取所有的field
hkeys key
hvals:获取所有的value
hvals key
hgetall:获取所有的filed-value
如果元素个数较多,可能会造成Redis阻塞,如果只需要获取部分元素,可以使用hmget
hgetall key
删除
hdel:删除元素,返回1或0
hdel key field1 field2..
127.0.0.1:6379> hdel user:1 name
(integer) 1
127.0.0.1:6379> hdel user:1 name
(integer) 0
其他命令
hincrby:自增
hincrby key field
hstrlen:查询value的字符串长度
hstrlen key fild
内部编码
字符串类型内部有3种编码:
- ziplist(压缩列表):当 哈希类型 元素个数 小于
hash-max-ziplist-entries配置(默认512个)、同时 所有值 都 小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为 哈希 的 内部实现,ziplist使用更加 紧凑的结构 实现多个元素的 连续存储,所以在 节省内存 方面比hashtable更加优秀 - hashtable(哈希表):当 哈希类型 无法满足
ziplist的条件时,Redis会使用hashtable作为 哈希 的 内部实现,因为此时ziplist的 读写效率 会下降,而hashtable的读写 时间复杂度 为O(1)。
可以使用object encoding key查看当前编码
当 field 个数 小于512个,且没有大的 value 时,内部编码 为 ziplist:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
127.0.0.1:6379> object encoding hashkey
"ziplist"
- 当有
value大于64字节或者field个数大于512时,内部编码 会由ziplist变为hashtable:
127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 byte....."
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"
常用场景
购物车
购物车这种数据如果存入数据库,会频繁读写,造成数据库压力大,而Redis是基于内存操作的,频繁读写不会造成数据库压力,并且可以持久化到磁盘,任何时间地点都可以访问

浙公网安备 33010602011771号