Redis,目前非常流行的内存数据库,其广泛应用于Web场景的缓存技术下。本文简要介绍在SpringBoot下的Redis的实践应用
配置Redis
1. 添加Redis依赖
在pom.xml中添加Redis依赖
<!-- Redis -->
2. 添加Redis服务器配置
在application.properties配置文件中添加Redis服务器参数配置。
# Redis 服务器配置
3. 添加Redis客户端配置
Spring Boot从2.X版本开始引入新的客户端——Lettuce。较之前的Jedis相比而言,Lettuce是一个基于Netty的线程安全的Redis客户端。故,我们这里推荐使用Lettuce,并在application.properties配置文件中对Lettuce客户端进行配置
[Note]:
- 配置文件中的Redis客户端配置可以不写,则Spring Boot(2.X及以上版本)会默认使用Lettuce客户端
- 当我们在配置文件显式地配置Redis客户端时,需要添加commons-pool2连接池依赖
# Redis客户端Lettuce配置
4. 编写Java Config类
- 自定义RedisTemplate Bean用于直接操作Reids,而不使用SpringBoot默认提供的,故该Bean实例名称必须要为redisTemplate,这样才可以避免Spring生成默认的RedisTemplate实例。对于Redis中的Key使用String序列化,而对于Value则使用更通用的Json序列化,而不是默认的JDK序列化
- 自定义Spring Cache的缓存管理器CacheManager,配置其使用redis数据库中间件,这样我们即可利用Spring Cache的注解快速操作缓存的查询和删除,而不是直接去使用redisTemplate来访问redis数据库
[Note]:
- 值得一提的是,这里虽然为了方便将RedisTemplate的配置类和CacheManager的配置类写在了一起,但是显然两者是两个相对独立的东西,Spring Cache是对各种缓存中间件(包含但不止于Redis)的抽象,通过注解统一缓存的操作方式,而Redis则是一种具体的缓存实现方案
- 需要在配置类上添加@EnableCaching注解,以使能Spring Cache
@Slf4j
缓存操作
直接使用RedisTemplate操作缓存
1. 封装RedisTemplate操作
将redisTemplate常用方法封装到RedisService中,便于我们后面使用
/**
2. 编写测试用例
这里分别提供了一个String Key的写、读缓存测试用例,验证我们的Redis缓存服务是否设置成功
@Controller
3. 测试
在Redis控制台中执行 keys *
向 http://localhost:8080/testRedis/testSetStringKey/1234 发送请求以实现向Redis中写入缓存
看看Redis数据库是否发生了变化,从下图可以看到,新加入了一个名为testStringKey-1234的String Key,其值为Student对象Json序列化后的字符串,此时,说明缓存写入成功
向 http://localhost:8080/testRedis/testGetStringKey/1234 发送请求以实现从Redis中读取相应的缓存数据,下图结果表明缓存读取成功
通过Sping Cache注解操作缓存
@Cacheable注解
该注解可以标记在方法、类上,表明该方法是支持缓存的。当调用该方法时,Spring Cache会首先检查该方法对应的缓存。如果缓存中该Key存在,则直接将缓存Key中的Value作为方法的结果返回,而无需进入并执行方法;如果缓存中无指定Key,则进入并执行方法,在将返回值返回的同时将其存入缓存中,以便下次调用该方法时,直接从缓存中获取方法的执行结果,而无需再进入方法执行
可用属性:
- value: 缓存名称。在Redis中其实际上即为命名空间。默认使用::作为命名空间的分隔符,上文的RedisConfig配置类的cacheManager()方法中,自定义:作为Redis的命名空间
- key: 缓存Key名。自定义缓存Key名中可以使用“#参数”方式引用形参中的值
- unless: 方法返回值不存入缓存的条件, 使用#result引用方法的返回值
测试代码如下:
@Controller
Redis数据库中的情况
我们向 http://localhost:8080/testSpringCache/testCacheable?name=Aaron&age=18 发送请求后,再查看此时Redis数据库中的情况,即可看到多了一个Key为SpringCacheTest:Aaron-18的缓存,如上所述,将SpringCacheTest作为命名空间的名称,使用:作为命名空间的分隔符,而该缓存的过期时间TTL也为上文配置的RedisConfig.timeToLive值
@CacheEvict注解
该注解可以标记在方法、类上,表明调用该方法是即清除指定缓存。当调用该方法时,Spring Cache即会清除指定的缓存
可用属性:
- value : 指定欲清除key所在的缓存名称(命名空间名)
- key
- beforeInvocation : 是否在调用方法前去清除指定缓存。当其为true时,将会在方法执行前清除缓存;当其为false时,将会在方法成功执行后清除缓存,如果方法未成功执行(抛出异常)将无法清除缓存
测试代码如下:
@Controller
Redis数据库中的情况:
我们向 http://localhost:8080/testSpringCache/testOneCacheEvict 发送请求后,再查看此时Redis数据库中的情况,即可发现命名空间SpringCacheTest下key为Tony的缓存已经被成功清除
我们再向 http://localhost:8080/testSpringCache/testAllCacheEvict 发送请求,再查看此时Redis数据库中的情况,即可发现命名空间SpringCacheTest下所有key的缓存全部被清除完毕
[Note]: