哈希类型中的映射关系焦作 field - value
1、设置值,成功返回1,失败返回0
hset key field value
此外,redis还提供了hsetnx,和setnx一样。
2、获取值,如果获取不到,返回nil
hget key field
3、删除field, 返回删除成功的field的个数
hdel key field [field ...]
4、计算field个数
hlen key
127.0.0.1:6379> hset ceshi1 user1 '{"name":"wangwei","age":"23"}'
(integer) 1
hsetnx ceshi1 1 1
(integer) 1
127.0.0.1:6379> hlen ceshi1
(integer) 2
127.0.0.1:6379>
5、批量设置或获取 field-value
hmget key field [field ...]
hmset key field value [field1 value2 ...]
6、判断field是否存在 ,存在返回1,不存在返回0
hexists key field
7、获取所有的field
hkeys key
8、获取所有value
hvals key
127.0.0.1:6379> hexists ceshi1 user1
(integer) 1
127.0.0.1:6379> hkeys ceshi1
1) "user1"
2) "1"
127.0.0.1:6379> hvals ceshi1
1) "{\"name\":\"wangwei\",\"age\":\"23\"}"
2) "1"
127.0.0.1:6379>
9:获取所有的field - value
hgetall key
127.0.0.1:6379> hgetall ceshi1
1) "user1"
2) "{\"name\":\"wangwei\",\"age\":\"23\"}"
3) "1"
4) "1"
127.0.0.1:6379>
注:在使用hgetall时,如果哈希元素个数比较多,会存在阻塞redis的可能,如果开发人员只需要获取部分field,可以使用hmget,如果一定要获取全部field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型
10、自增
hincrby key field
hincrbyfloat key field
hincrby 和hincrbyfloat,就像incrby和incrbyfloat命令一样,他们的作用域是field;
11、计算value字符串长度
hstrlen key field
127.0.0.1:6379> hstrlen ceshi1 user1
(integer) 29
127.0.0.1:6379>
二、内部编码
哈希类型的内部编码有两种
1、ziplist(压缩列表) :当哈希类型的元素个数小于 hash-max-ziplist-entries配置(默认512)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存芳敏比hashtable更加优秀。
2、当哈希类型无法满足ziplist的条件时,redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)
127.0.0.1:6379> object encoding ceshi1
"ziplist"
127.0.0.1:6379> hset ceshi1 hehe dayu1111111111111111111111111111111111111111111111111111111111111111111111111111
(integer) 1
127.0.0.1:6379> object encoding ceshi1
"hashtable"
使用场景:
key为 userinfo:userId
field 为用户属性
value 为用户属性值
如: hset userinfo:1 id 1 age 23 name wang
与字符串序列化缓存用户信息相比,哈希类型更加直观
哈希类型和关系型数据库的两点不同之处
1、哈希类型是稀疏的,而关系型数据库使完全结构化的,如哈希一个键可以有不同的field,比如用户属性,第一个用户userinfo1只存age,name ,而第二个用户userinfo2只存 id,name;但是关系型数据库一旦添加新的列,就要为其赋值(即使为null)
2、关系型数据库可以做复杂的关系查询,而redis去模拟关系型复杂查询开发困难,维护成本高
三、缓存用户信息优缺点对比
1)原生态字符串类型,每个属性一个键
set user:1:name tom
set user:1:age 23
优点:简单直观,每个属性都支持更新操作
缺点:占用过多的键,内存占用量较大,同时用户信息聚集性比较差(生产环境一般不用)‘
2)序列化字符串类型,将用户信息序列化后用一个键保存
set user:1 serialize(userInfo)
优点:简化编程,如果合理使用序列化可以提高内存的使用率
缺点,序列化和反序列化有一定的开销,同时每次更新属性都需要把所有的数据取出来进行反序列化,更新后再序列化到redis中
3)哈希类型
hmset usr:1 name tom age 23 city beijing
优点:简单直观,如果使用合理可以减少内存空间的使用
缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多的内存
Redis 数据结构 哈希
猜你喜欢
转载自blog.csdn.net/m0_37668842/article/details/80838262
今日推荐
周排行