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是基于内存操作的,频繁读写不会造成数据库压力,并且可以持久化到磁盘,任何时间地点都可以访问

posted @ 2020-05-10 23:20  范特西-  阅读(160)  评论(0)    收藏  举报