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 *


spring 读取url_命名空间


向 http://localhost:8080/testRedis/testSetStringKey/1234 发送请求以实现向Redis中写入缓存


spring 读取url_spring 读取url_02


看看Redis数据库是否发生了变化,从下图可以看到,新加入了一个名为testStringKey-1234的String Key,其值为Student对象Json序列化后的字符串,此时,说明缓存写入成功


spring 读取url_缓存_03


向 http://localhost:8080/testRedis/testGetStringKey/1234 发送请求以实现从Redis中读取相应的缓存数据,下图结果表明缓存读取成功


spring 读取url_Redis_04


通过Sping Cache注解操作缓存

@Cacheable注解

该注解可以标记在方法、类上,表明该方法是支持缓存的。当调用该方法时,Spring Cache会首先检查该方法对应的缓存。如果缓存中该Key存在,则直接将缓存Key中的Value作为方法的结果返回,而无需进入并执行方法;如果缓存中无指定Key,则进入并执行方法,在将返回值返回的同时将其存入缓存中,以便下次调用该方法时,直接从缓存中获取方法的执行结果,而无需再进入方法执行

可用属性:

  • value: 缓存名称。在Redis中其实际上即为命名空间。默认使用::作为命名空间的分隔符,上文的RedisConfig配置类的cacheManager()方法中,自定义:作为Redis的命名空间
  • key: 缓存Key名。自定义缓存Key名中可以使用“#参数”方式引用形参中的值
  • unless: 方法返回值不存入缓存的条件, 使用#result引用方法的返回值

测试代码如下:


@Controller


Redis数据库中的情况


spring 读取url_命名空间_05


我们向 http://localhost:8080/testSpringCache/testCacheable?name=Aaron&age=18 发送请求后,再查看此时Redis数据库中的情况,即可看到多了一个Key为SpringCacheTest:Aaron-18的缓存,如上所述,将SpringCacheTest作为命名空间的名称,使用:作为命名空间的分隔符,而该缓存的过期时间TTL也为上文配置的RedisConfig.timeToLive值


spring 读取url_命名空间_06


@CacheEvict注解

该注解可以标记在方法、类上,表明调用该方法是即清除指定缓存。当调用该方法时,Spring Cache即会清除指定的缓存

可用属性:

  • value : 指定欲清除key所在的缓存名称(命名空间名)
  • key
  • beforeInvocation : 是否在调用方法前去清除指定缓存。当其为true时,将会在方法执行前清除缓存;当其为false时,将会在方法成功执行后清除缓存,如果方法未成功执行(抛出异常)将无法清除缓存

测试代码如下:


@Controller


Redis数据库中的情况:


spring 读取url_Redis_07


我们向 http://localhost:8080/testSpringCache/testOneCacheEvict 发送请求后,再查看此时Redis数据库中的情况,即可发现命名空间SpringCacheTest下key为Tony的缓存已经被成功清除


spring 读取url_命名空间_08


我们再向 http://localhost:8080/testSpringCache/testAllCacheEvict 发送请求,再查看此时Redis数据库中的情况,即可发现命名空间SpringCacheTest下所有key的缓存全部被清除完毕


spring 读取url_Redis_09


[Note]: