Redis 数据结构 哈希

哈希类型中的映射关系焦作 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会消耗更多的内存






猜你喜欢

转载自blog.csdn.net/m0_37668842/article/details/80838262