在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用
@EnableCaching
开启缓存支持即可。 例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。
描述
使用Redis缓存高频数据,并使用Spring Cache优化代码,提高系统的性能和响应速度。
springboot整合redis
lettucs客户端技术操作Redis,默认
1 RedisTemplate对象
在进行整合之前先梳理一下整合的思想,springboot整合任何技术其实就是在springboot中使用对应技术的API。如果两个技术没有交集,就不存在整合的概念了。所谓整合其实就是使用springboot技术去管理其他技术,几个问题是躲不掉的。
第一,需要先导入对应技术的坐标,而整合之后,这些坐标都有了一些变化
第二,任何技术通常都会有一些相关的设置信息,整合之后,这些信息如何写,写在哪是一个问题
第三,没有整合之前操作如果是模式A的话,整合之后如果没有给开发者带来一些便捷操作,那整合将毫无意义,所以整合后操作肯定要简化一些,那对应的操作方式自然也有所不同
按照上面的三个问题去思考springboot整合所有技术是一种通用思想,在整合的过程中会逐步摸索出整合的套路,而且适用性非常强,经过若干种技术的整合后基本上可以总结出一套固定思维。
springboot整合redis步骤:
步骤①:导入springboot整合redis的starter坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
上述坐标可以在创建模块的时候通过勾选的形式进行选择,归属NoSQL分类中
tip:第二行spring data reactive redis包含了第一行Redis的驱动和访问,现在阶段只用第一行就够了。
步骤②:进行基础配置
默认配置:
spring:
data:
redis:
host: localhost
port: 6379
操作redis,最基本的信息就是操作哪一台redis服务器,所以服务器地址属于基础配置信息,不可缺少。但是即便你不配置,目前也是可以用的。因为以上两组信息都是默认配置值,刚好就是上述配置值。
更丰富配置:
小贴士:
- 这里database: 0的意思是使用0号数据库,在redis服务器启动后默认提供了16个数据库,不同数据库内容不互通,默认使用0号数据库。
- 修改Redis提供数据库数量:
conf文件:
- 切换成数据库1:
客户端命令行
select 1
步骤③:确保之前启动服务器后,自动注入Redis模板对象,获取值操作对象对数据增删改查。
此处使用的是注入Redis模板对象RedisTemplate的opsForValue()方法获取值操作对象ValueOperations ,通过ValueOperations对象的get和set方法操作数据库。
@SpringBootTest
class Springboot16RedisApplicationTests {
//自动注入RedisTemplate对象
@Autowired
private RedisTemplate redisTemplate;
//注意ValueOperations 添加是set,HashOperations 添加是put
@Test
void set() {
//获取值简单k-v操作对象ValueOperations。如果想获取hash操作对象要用opsForHash()方法。
ValueOperations ops = redisTemplate.opsForValue();
ops.set("age",41);
}
@Test
void get() {
ValueOperations ops = redisTemplate.opsForValue();
Object age = ops.get("name");
System.out.println(age);
}
@Test
void hset() {
//获取hash类型操作对象HashOperations
HashOperations ops = redisTemplate.opsForHash();
ops.put("info","b","bb");
}
@Test
void hget() {
HashOperations ops = redisTemplate.opsForHash();
//hash操作对象的get返回值类型是Object,可以强转为String
Object val = ops.get("info", "b");
System.out.println(val);
//获取keys
System.out.println(ops.keys("*"));
System.out.println(ops.keys("info"));
}
操作list类型数据:
操作set类型数据:
操作zset类型数据:
通用命令:
在操作redis时,需要先确认操作何种数据,根据数据种类得到操作接口。例如使用opsForValue()获取string类型的数据操作接口,使用opsForHash()获取hash类型的数据操作接口,剩下的就是调用对应api操作了。各种类型的数据操作接口如下:
序列化器问题
RedisTemplate是以对象为操作的基本单元,存到数据库的实际内容是序列化后的。
通过命令行看到是乱码的:
由于redis内部不提供java对象的存储格式,因此当操作的数据以对象的形式存在时,会进行转码,转换成字符串格式后进行操作。为了方便开发者使用基于字符串为数据的操作,springboot整合redis时提供了专用的API接口StringRedisTemplate,你可以理解为这是RedisTemplate的一种指定数据泛型的操作API。
@SpringBootTest
public class StringRedisTemplateTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void get(){
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
String name = ops.get("name");
System.out.println(name);
}
}
切换jedis客户端技术
1 RedisTemplate或者StringRedisTemplate
springboot整合redis技术提供了多种客户端兼容模式,默认提供的是lettucs客户端技术,也可以根据需要切换成指定客户端技术,例如jedis客户端技术。jedis是Redis传统的客户端技术。
从默认客户端技术lettucs切换成jedis客户端技术:
步骤①:导入jedis坐标。不用加版本号,该坐标被springboot管理。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
先确保导入了redis的starter坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
jedis坐标受springboot管理,无需提供版本号
步骤②:配置客户端技术类型,设置为jedis
spring:
spring:
redis:
host: localhost
port: 6379
client-type: jedis
也可以根据需要设置对应的配置
spring:
redis:
host: localhost
port: 6379
client-type: jedis
lettuce:
pool:
max-active: 16
jedis:
pool:
max-active: 16
步骤③: 整合方法和lettucs一样
使用RedisTemplate对象或者StringRedisTemplate对象。
@SpringBootTest
class Springboot16RedisApplicationTests {
//自动注入RedisTemplate对象
@Autowired
private RedisTemplate redisTemplate;
//注意ValueOperations 添加是set,HashOperations 添加是put
@Test
void set() {
//获取值操作对象。如果想获取hash操作对象要用opsForHash()方法。
ValueOperations ops = redisTemplate.opsForValue();
ops.set("age",41);
}
@Test
void get() {
ValueOperations ops = redisTemplate.opsForValue();
Object age = ops.get("name");
System.out.println(age);
}
@Test
void hset() {
HashOperations ops = redisTemplate.opsForHash();
ops.put("info","b","bb");
}
@Test
void hget() {
HashOperations ops = redisTemplate.opsForHash();
Object val = ops.get("info", "b");
System.out.println(val);
}
}
非Maven项目使用jedis的方法:
jedis以字符串为操作的基本单元,代码里添加的数据,在命令行模式也能查到。
lettcus与jedis区别
jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用,这样整体性能就大受影响
lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。 StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用。当然lettcus也支持多连接实例一起工作
总结
- springboot整合redis提供了StringRedisTemplate对象,以字符串的数据格式操作redis
- 如果需要切换redis客户端实现技术,可以通过配置的形式进行
参考链接:
【精选】Redis基础-CSDN博客