Redis : Hash形式
哈希类型
哈希类型的命令
hset
设置key指定的字段(field)的值(value)
也可以设置多组field和value
hget
获得哈希中指定字段的值
如果该字段为空或者key为空则返回nil
hexists
判断哈希中是否有该字段的值
如果有则会返回1,否则返回0
hdel
删除哈希中该字段对应的值
返回本次删除的字段个数
也可以一次删除多个哈希中的字段
hkeys
获得哈希中的全部字段
hvals
获得哈希中的所有值
hgetall
获得哈希中的全部字段和全部的值
hmget
一次性获得哈希中的多个字段
hlen
获得哈希中所有字段的个数
hstrlen
获得哈希中字段的长度
hsetnx
字段不存在下,设置哈希中的字段和值
返回1表示设置成功,0表示设置失败
hincrby
对哈希中对应字段的值添加指定的值(+/-)
hincrfloat
对哈希中的字段中的值进行浮点数运算
注:如果只对单个的字段进行命令作用,时间复杂度为O(1),否则是O(N)N为字段(field)的个数
带H的命令必须保证作用的是哈希类型
内部编码
哈希的内部编码一共有两种:ziplist(压缩列表)和hashtable(哈希表)
当field的个数较少,并且没有特别大的value,内部编码为ziplist,否则会自动转换为hashtable
压缩的本质,是对数据进行重新编码
可以再redis的配置文件中修改默认的配置(ziplist -> hashtable)
使用场景
用户信息的保存
关系型数据库保存用户信息
userId | uesrName | age |
1 | zhangsan | 2 |
2 | lisi | 3 |
映射关系表示用户信息
相⽐于使⽤JSON格式的字符串缓存用户信息,哈希类型变得更加直观,并且在更新操作上变得更灵活。
作为缓存
如果使用String(json)的格式表示UserInfo
- 只是想获取某个field,或者修改某个field
- 就需要把整个json都读出来,操作field,转成json字符串,再写回去
如果用哈希的方式表示UserInfo
- 就可以使用field表示对象的属性
- 此时修改和获取任何一个属性就会十分的方便
注:使用hash进行field的读取和修改,确实是十分的方便,但是会使其内部编码再ziplist和hashtable中进行切换,造成内存的消耗
希望能对大家有所帮助!!!!!!!