本节中将介绍Redis支持的主要数据结构,以及相关的常用Redis命令。redis是一种基于键值对(key-value)的内存数据库,redis数据结构可以分为string、hash、list、set、sorted set。
redis的五种数据结构和相关指令之Hash
哈希hash
哈希hash是一个string类型的field和value的映射表,hash特适合用于存储对象,用Hash中的field对应对象的field即可。
每个hash对象有三个属性:key、field和value;每个hash对象有一个key值,每个key可以对应多个field,每个field对应一个value。
比如将关系型数据表转成redis存储:
使用hash后的存储方式为:
a、基本命令
设值:hset key field value
hset user:1 name james //成功返回1,失败返回0
取值:hget key field
hget user:1 name //返回james
删值:hdel key field
hdel user:1 age //返回删除的个数
计算个数:hlen key
hset user:1 name james; hset user:1 age 23;
hlen user:1 //返回2,user:1有两个属性值
批量设值:
hmset user:2 name james age 23 sex boy //返回OK
批量取值:
hmget user:2 name age sex //返回三行:james 23 boy
判断field是否存在:
hexists user:2 name //若存在返回1,不存在返回0
获取所有field,时间复杂度O(N),慎用:
hkeys user:2 // 返回name age sex三个field
获取user:2所有value,时间复杂度O(N),慎用:
hvals user:2 // 返回james 23 boy
获取user:2所有field与value,时间复杂度O(N),慎用:
hgetall user:2 //name age sex james 23 boy值
增加数值:
hincrby user:2 age 1 //age+1
hincrbyfloat user:2 age 2 //浮点型加2
b、三种方案实现用户信息存储优缺点:
1、string原生:
set user:1:name james;
set user:1:age 23;
set user:1:sex boy;
优点: 简单直观,每个键对应一个值
缺点: 键数过多,占用内存多,用户信息过于分散,不用于生产环境
2、将对象序列化存入redis
set user:1 serialize(userInfo);
优点: 编程简单,若使用序列化合理内存使用率高
缺点: 序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis
3、使用hash类型:
hmset user:1 name james age 23 sex boy
优点: 简单直观,使用合理可减少内存空间消耗
缺点: 要控制ziplist与hashtable两种编码转换,且hashtable会消耗更多内存
总结: 对于更新不多的情况下,可以使用序列化,对于VALUE值不大于64字节可以使用hash类型
————————————————
版权声明:本文为CSDN博主「lingengy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/w1lgy/article/details/84376841