Redis五大数据类型详解—hash

Redis五大数据类型—hash

1、概念

1、Redis中的hash是一个键值对集合,同时又是一个string类型的field和value的映射表,hash特别适合用于存储对象
2、类似于java里面的Map<String,Object>
3、每个 hash 可以存储 232 - 1 键值对(40多亿)

2、常用命令

1、hset < key> < field> < value>给< key>集合中的 < field>键赋值< value>
.
2、hget < key1> < field> 从< key1>集合< field> 取出 value
.
3、hmset < key1> < field1> < value1> < field2> < value2>… 批量设置hash的值
.
4、hexists key < field> 查看哈希表 key 中,给定域 field 是否存在
.
5、hkeys < key> 列出该hash集合的所有field
.
6、hvals < key> 列出该hash集合的所有value
.
7、hincrby < key> < field> < increment> 为哈希表 key 中的域 field 的值加上增量
increment
.
8、hsetnx < key> < field> < value> 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
.
9、hgetall < key> 获取在哈希表中指定 key 的所有字段和值

127.0.0.1:6379> hset userInfo user:0001:uid 0001
(integer) 1
127.0.0.1:6379> hget userInfo user:0001:uid
"0001"
127.0.0.1:6379> hmset userInfo user:0001:name admin user:0001:sex J  //批量设置
OK
127.0.0.1:6379> hmget userInfo user:0001:name user:0001:sex  //批量获取
1) "admin"
2) "J"
127.0.0.1:6379> hgetall userInfo  //获取指定集合所有的field-value
1) "user:0001:uid"
2) "0001"
3) "user:0001:name"
4) "admin"
5) "user:0001:sex"
6) "J"
127.0.0.1:6379> hexists userInfo user:0001:uid  //判断userInfo 集合中是否存在user:0001:uid 属性
(integer) 1
127.0.0.1:6379> hvals userInfo //获取集合中所有的value
1) "0001"
2) "admin"
3) "J"
127.0.0.1:6379> hkeys userInfo //获取key 所有的属性
1) "user:0001:uid"
2) "user:0001:name"
3) "user:0001:sex"
127.0.0.1:6379> hset userInfo user:0001:age 25 
(integer) 1
127.0.0.1:6379> hincrby userInfo user:0001:age 2  //将user:0001:age的值 加2
(integer) 27
127.0.0.1:6379> hsetnx userInfo user:0001:uid 0002  //已经存在user:0001:uid属性了 插入不了
(integer) 0

3、思考,在Java中存放一个Javabean对象与在redis中存放Javabean

public class Person {
    Integer id;
    String sex;
    String name;
}

在Redis中建议通过key(用户id)+field(属性标签)可以操作对应属性数据(hash类型)

优点:
1、不需要重复存储数据,不会造成key的冗余

2、不会带来序列化和并发修改控制的问题
.
可以理解为将对象作为key 属性作为value,如图:

在这里插入图片描述

我们试想一下,我们用 用户id+属性作为key,那么一个用户id+属性就对应一个键,10个就是10个键,这么就会造成key的冗余(常见于redis中的set集合),所以不推荐使用这种方式
.
或者将用户id为key,value为Javabean序列化后的字符串,那么每次修改用户的某个属性,先反序列化改好后再序列化回去,开销将会非常大(常见于redis中的string类型+json)。
.
这里有一点值得注意的事,前面说了,使用string存放javabean,频繁的修改属性,每次修改的时候都要序列化,造成开销大,但是如果不常变化的属性存储在string类型中是却可以的,string类型只是不适合频繁的修改属性值,因为要来回序列化。
但是,当对象的某个属性不是基本类型或字符串时,使用hash类型就必须手动进行复杂序列化,这样的话序列化工作就太繁琐了,不如直接用string + json的方式来的简单
.
string+json 就是使用将对象转换为json格式,再存储在string类型中

所以总结,在redis中,如果想要存放Javabean,得分情况,看当前对象属性是否频繁修改,如果频繁修改,建议采用hash类型,否则一般采用string类型+json的方式

注意: 如果Redis查找中文的时候出现了类似于"\xe7\x94\xb7"的乱码,那么就在登录数据库时后面加 --raw 即可 命令:redis-cli --raw

4、序列化
1)、概念

java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象。
对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输。反序列化就是根据这些保存的信息重建对象的过程。
.
序列化:将java对象转化为字节序列的过程。
反序列化:将字节序列转化为java对象的过程。

2)、如何实现序列化

将需要序列化的类实现Serializable接口就可以了,Serializable接口中是不存在任何方法的,就相当于一个标记,即表明这个类可以序列化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值