Redis数据结构-hash

Redis数据结构-hash

redis中,哈希类型的值是一个键值对结构,如key:value={{field1,val1},{field2,val2}...}

命令

设置值

设置成功返回1

hset key field value
----------------------
> hset user:1 name tom
1
> hset user:1 name kitty
0
> hsetnx user:1 name Leg
0

redis还提供了hsetnx命令,类似set和setnx的关系,只不过作用域由key变为field

获取值

hget key field
----------------------
> hget user:1 name
tom
> hget user:1 age
null
> hget user:2 name
null

如果没有对应的field,返回null

删除field

hdel key field[field ...]
----------------------
> hdel user:1 name
1

hdel会删除一个或多个field,结果返回删除成功的个数

计算field个数

hlen key
-----------------------
> hset user:1 name tom
1
> hset user:1 age 18
1
> hset user:1 sex male
1
> hlen user:1
3

批量设置或获取field-value

hmget key field [field...]
hmset key field value [field value ...]
--------------------------------
> hmset user:2 name laura age 22 sex femal
OK
> hmget user:2 name age sex
laura
22
femal

判断field是否存在

hexists key field
-----------------------
> hexists user:1 name
1

user:1 包含name域,返回1,不包含返回0

获取所有的field

hkeys key
-----------------
> hkeys user:1
name
age
sex

其实叫hfields更恰当,它返回所有的field

获取所有value

hvals key
-----------------
> hvals user:1
tom
18
male

获取所有的field-value

hgetall key
-----------------
> hgetall user:1
name
tom
age
18
sex
male

注意:使用hgetall时,如果哈希元素比较多,存在阻塞redis的可能。如果只使用部分field,可以使用hmget。如果一定要获取全部field-value,可以用hscan命令,该命令会渐进式遍历哈希类型

hincrny hincrbyfloat

hincrby key field
---------------------
> HINCRBY user:1 age 1
19

field自增,就行incrby和incrbyfloat一样,只是作用在field上

计算value的字符串长度

hstrlen key field 
----------------------
> hget user:1 name
tom
> hstrlen user:1 name
3

内部编码

  • ziplist(压缩列表)
    • 哈希元素个数小于hash-max-ziplist-entries(默认512个)
    • 同时所有值小于hash-max-ziplist-value配置(默认64字节)
    • ziplist更加紧凑的结构实现多个元素的连续存储,更加节省内存
  • hashtable(哈希表)
    • 无法使用ziplist的时候,用hashtable,hashtable的读写效率O(1),当然更占空间
> object encoding user:1
ziplist

使用场景

场景:缓存用户对象信息,如User{name:Tom,age:18,sex:male},User{name:Kitty,age:18,sex:female}

可以用几种方案来做缓存

1 序列化字符串

set user:1 serialize(userInfo)

优点:简化编程

缺点:序列化有性能损耗;每次更新必须序列化和反序列化整体

2 哈希类型缓存

key和上面一样,只是用每个field-value存对象的属性和值

hmset user:1 name tom age 18 sex male

优点:简单直观,合理使用减少内存的占用;操作也简单直接

缺点:控制ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存

原文地址:https://www.cnblogs.com/SimonZ/p/14891768.html