序列化
防止乱码:
// key序列化
redisTemplate.setKeySerializer(STRING_SERIALIZER);
// value序列化
redisTemplate.setValueSerializer(JACKSON__SERIALIZER);
// Hash key序列化
redisTemplate.setHashKeySerializer(STRING_SERIALIZER);
// Hash value序列化
redisTemplate.setHashValueSerializer(JACKSON__SERIALIZER);
redisTemplate.afterPropertiesSet();
String
//插入字符串
redisTemplate.opsForValue().set("String","String");
图示
使用场景
String是最常用的数据类型,普通的key/value都可以归为此类,value其实不仅是String,也可以是数字。
比如想知道什么时候封锁一个IP地址(访问超过几次)。INCRBY命令让这些变得很容易,通过原子递增保持计数。
List
//插入集合
List<String> strings1 = new ArrayList<>();
strings1.add("LIST1");
strings1.add("LIST2");
strings1.add("LIST2");
for (String str:strings1){
redisTemplate.opsForList().leftPush("list1",str);//左插入
redisTemplate.opsForList().rightPush("list2",str);//右插入
}
图示(注意对比左右插入的区别)
使用场景
最新消息排行。
消息队列。利用Lists的push的操作,将任务存储在list中,然后工作线程再用pop操作将任务取出进行执行。
Set
//插入set集合
Set<String> set1 = new HashSet<>();
set1.add("set1");
set1.add("set2");
set1.add("set3");
set1.add("set3");
for (String str:set1){
redisTemplate.opsForSet().add("set",str);
}
图示(注意对比代码和图示)
使用场景
set类似list,特殊之处是set可以自动排重。
set还提供了某个成员是否在一个set内的接口,这个也是list没有的。
比如在微博应用中,每个人的好友存在一个集合(set)中,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。
Redis还为集合提供了求交集、并集、差集等操作。
Hash
//插入map
redisTemplate.opsForHash().put("hash","hashKey1","hashValue1");
redisTemplate.opsForHash().put("hash","hashKey2","hashValue2");
图示
使用场景
1.购物车:hset [key] [field] [value] 命令, 可以实现以用户Id,商品Id为field,商品数量为value,恰好构成了购物车的3个要素。
2.存储对象:hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。
zset
//插入zset
redisTemplate.opsForZSet().add("zset","hello", 1);
redisTemplate.opsForZSet().add("zset","hi", 2);
redisTemplate.opsForZSet().add("zset","nihao", 3);
使用场景
例如热门歌曲榜单列表,value值是歌曲ID,score是播放次数,这样就可以对歌曲列表按播放次数进行排序。
当然还有类似微博粉丝列表、评论列表等等,可以将value定义为用户ID、评论ID,score定义为关注时间、评论点赞次数等等。
图示