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会消耗更多内存