Spring笔记(11) Spring boot redis 的集成,开箱即用 Spring Data Redis

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/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注