专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习Redis,同时也是为了记录我自己学习Redis的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁等。希望大家有问题也可以一起沟通,欢迎一起学习,对于专栏内容有错还望您可以及时指点,非常感谢大家 🌹。

目录

  • 专栏前言
  • 1.什么是SpringDataRedis
  • 2.SpringDataRedis 快速入门
  • 2.1 引入依赖
  • 2.2 配置文件
  • 2.3 注入 RedisTemple
  • 3. StringRedisTemplate
  • 4.其余类型
  • 5. RedisTemple 与 StringRedisTemplate 区别

1.什么是SpringDataRedis

   SpringDataRedis顾名思义,是一个Spring官方提供的供我们操作Redis的一个库。它提供了RedisTemplate统一的API来操作Redis,支持Redis的哨兵和集群以及各种数据类型的序列化和反序列等。

2.SpringDataRedis 快速入门

2.1 引入依赖

导入我们需要的依赖包

<!--redis依赖-->
<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>

2.2 配置文件

我们将链接的 ip 地址和端口以及连接池的信息,都写在配置文件中。这里需要注意的是,SpringDataRedis 默认支持的是 lettuce,如果想使用jedis则需要手动导入依赖。下面使用的是.yml配置文件。

spring:
  redis:
    host: 192.168.87.128
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 1000ms

2.3 注入 RedisTemple

在具体操作时,我们需要通过注入,得到RedisTemple这个对象然后去操作redis。在具体操作时,对于不同的类型,RedisTemple需要去调用不同的封装库,比如我们在插入String类型时,调用的是opsForValue

@SpringBootTest
class RedisApplicationTests {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Test
    void testString() {
        //写入一条key和value都是String的数据
        redisTemplate.opsForValue().set("name", "Jack");
        //获取数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }
}

这里需要注意一个问题,如果RedisTemplate没有通过泛型指定插入数据的类型,此时就会因为序列化产生问题。而我们以后在使用时,也并不能确定插入的到底是啥类型,可能是String,也有可能是一个对象,这时我们在插入时就会产生问题。

3. StringRedisTemplate

  为了解决上述问题,Spring官方为我们提供了StringRedisTemplate这个类,它的keyvalue的序列化方式默认就是String方式,我们插入String类型时,可以直接插入。插入对象时,可以手动将其序列化成String再进行插入,取值时也可以手动反序列化为对象。

@Autowired
    private StringRedisTemplate stringRedisTemplate;

    //SpringMVC 默认使用的序列化工具
    private static final ObjectMapper mapper = new ObjectMapper();

	@Test
    void testSaveUser() throws JsonProcessingException {
        User user = new User("小王", 21);
        //手动序列化
        String json = mapper.writeValueAsString(user);
        //写入数据
        stringRedisTemplate.opsForValue().set("user:200", json);
        //获取数据
        String jsonuser = stringRedisTemplate.opsForValue().get("user:200");
        //手动反序列化   需要有无参构造
        User user1 = mapper.readValue(jsonuser, User.class);
        System.out.println(user1);
    }

4.其余类型

除了操作其他String类型,操作其他类型有不同的方法,具体见下:

stringRedisTemplate.opsForValue();//操作String
stringRedisTemplate.opsForHash();//操作hash
stringRedisTemplate.opsForList();//操作list
stringRedisTemplate.opsForSet();//操作set
stringRedisTemplate.opsForZSet();//操作有序set

5. RedisTemple 与 StringRedisTemplate 区别

  首先,StringRedisTemplate是继承自RedisTemple,也就是说StringRedisTemple包含有RedisTemple的所有方法。StringRedisTemple默认采用的是String的序列化策略,而RedisTemple默认采用的 JDK的序列化策略。
  还有一点很重要的是,两者的数据是不共通的。 也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。