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接口中是不存在任何方法的,就相当于一个标记,即表明这个类可以序列化。