专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习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
这个类,它的key
和value
的序列化方式默认就是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
中的数据。