Spring boot redis
在 Spring boot 中使用 redis 很方便,通过集成 Spring Data Redis 来管理 redis 。通过调用 RedisTemplate 的相关方法,可以分别完成对字符串、列表、集合、有序集合、哈希类型数据的管理。
Pom.xml依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
创建对象
@Data
@AllArgsConstructor
public class User implements Serializable {
private Long id;
private String name;
private Integer gender;
}
注意实体类必须实现序列化接口,否则在存储数据时会抛出异常。
使用
@Autowired
private RedisTemplate redisTemplate;
@PostMapping("/set")
public void setUser(@RequestBody User user){
redisTemplate.opsForValue().set("user", user);
}
@GetMapping("/get")
public void getUser(){
User user = (User) redisTemplate.opsForValue().get("user");
System.out.println(user.toString());
}
配置文件
spring:
redis:
database: 0
host: localhost
port: 6379
启动项目,调用接口,会打印
User(id=1, name=hello, gender=13)
说明已经将 User 对象存入你redis 中,但是如果在 Redis 客户端通过命令来查询,发现结果为空。
Olivers-MMP:bin guozh$ ./redis-cli
127.0.0.1:6379> get user
(nil)
127.0.0.1:6379>
这就出现问题了,直接用命令行 stu 查不到数据,但是使用 RedisTemplate 却可以查到,原因是使用 RedisTemplate 在存数据的时候,key 没做序列化,所以实际存入 Redis 的 key 值并不是 stu,客户端当然是查不到数据的,那 Redis 的 key 值是什么呢?如果 RedisTemplate 没做 key 的序列化处理,实际存入 Redis 的 key 前面会多几个字符,可以通过命令查看真实 key 值。
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x04user"
127.0.0.1:6379>
可以看到 “\xac\xed\x00\x05t\x00\x03stu” 才是 Redis 中存入的 key 值,在 stu 前面添加了几个字符串,通过真实 key 值是可以查到数据的,如下所示。
127.0.0.1:6379> get "\xac\xed\x00\x05t\x00\x04user"
"\xac\xed\x00\x05sr\x00\x1ecom.guozh.chineseexchange.UserP\xa9A\xe41\x9e\xc8\xca\x02\x00\x03L\x00\x06gendert\x00\x13Ljava/lang/Integer;L\x00\x02idt\x00\x10Ljava/lang/Long;L\x00\x04namet\x00\x12Ljava/lang/String;xpsr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\rsr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexq\x00~\x00\x06\x00\x00\x00\x00\x00\x00\x00\x01t\x00\x05hello"
Redis 支持的数据类型有 5 种,分别是字符串、列表、集合、有序集合、哈希,接下来分别演示 RedisTemplate 对这 5 种类型的支持。
字符串
redisTemplate.opsForValue().set("str","Hello World");
System.out.println(redisTemplate.opsForValue().get("str"));
List
获取 ListOperations 对象,存入三个 key 为 “list”,值分别为 “Hello”、”World”、”Java” 的数据,再遍历取出。
ListOperations<String,String> list = redisTemplate.opsForList();
list.leftPush("list","Hello");
list.leftPush("list","World");
list.leftPush("list","Java");
List<String> getList = list.range("list",0,2);
for (String val:getList){
System.out.println(val);
}
学习list.range()
用法。获取指定key的范围内的value值的 list列表。 (0 -1)反回所有值列表 。
Set
SetOperations<String,String> set = redisTemplate.opsForSet();
set.add("set","Hello");
set.add("set","Hello");
set.add("set","World");
set.add("set","World");
set.add("set","Java");
set.add("set","Java");
Set<String> getSet = set.members("set");
for (String val:getSet){
System.out.println(val);
}
获取 SetOperations 对象,存入两次 “Hello”、”World”、”Java”,且 key 值都为 “set”,我们知道 Set 值是唯一的,所以重复数据只保存一次,遍历取出,都只有一次。
有序集合
ZSetOperations 的用法与 SetOperations 类似,区别在于 ZSetOperations 是有序的,在存入数据时,除了 key 和 value 还需额外传入一个 double 的参数 var3 来为数据排序,存储完成之后再遍历取出
ZSetOperations<String,String> zset = redisTemplate.opsForZSet();
zset.add("zset","Hello",1);
zset.add("zset","World",2);
zset.add("zset","Java",3);
Set<String> set = zset.range("zset",0,2);
for(String val:set){
System.out.println(val);
}
哈希
我们在使用 HashMap 存储数据的时候只需要传入 key 和 value 两个参数,但是 HashOperations 存入数据缺需要三个参数 key、hashkey、value,value 是具体的数据,那么 key 和 hashkey 是什么关系呢?
key 可以理解为每组数据的 ID,hashkey 和 value 是一组完整的数据,通过 key 来区分不同的 HashMap,比如有下列代码。
HashMap hashMap1 = new HashMap();
hashMap1.put(key1,value1);
HashMap hashMap2 = new HashMap();
hashMap2.put(key2,value2);
HashOperations<String,String,String> hash = redisTemplate.opsForHash();
hash.put(hashMap1,key1,value1);
hash.put(hashMap2,key2,value2);
hashMap1 和 hashMap2 就是 key,key1 和 key2 就是 hashkey,value1 和 value2 就是 value。
理解了 HashOperations 的使用,具体代码如下。
HashOperations<String,String,String> hash = redisTemplate.opsForHash();
hash.put("key","hashkey","Hello");
System.out.println(hash.get("key","hashkey"));
本篇文章前半部分代码是我的,后面全都是Gitchat。本篇用法几乎将 redis 所有能碰到的数据种类都总结了,存、取都在内,以后想使用,直接翻本篇博客即可,也不用全部记在脑中。
以上代码笔记内容来自付费专栏:案例上手 Spring 全家桶
PS:如果侵犯版权,请联系我。
本文由老郭种树原创,转载请注明:https://guozh.net/spring-boot-data-redis/