spring mvc 使用spring-data-redis实现缓存

spring mvc如何整合spring-data-redis,并且实现缓存?

 

零、添加依赖

pom.xml

一、如何实现缓存

1.如何配置

(1)写一个配置文件

spring-redis.xml

当然也可以不用xml文件进行配置。可以像spring boot中一样,直接写配置类即可。但是在spring mvc中,我还是比较倾向于把配置都写在配置文件中,保持统一。

比整合jedis的配置要稍微复杂一点。

(2)将这个配置文件注入到spring中

千万不要忘记

2.如何使用?

(1)具体使用

userServiceimpl.java

1.如果结果为实体类,那么该实体类需要实现Serializable接口

否则,在获取缓存结果时会报错。

2.加上@EnableCaching

在使用缓存的类上,要加上@EnableCaching注解,允许缓存。

3.需要缓存的方法上加上@Cacheable

基本上只有搜索才用得上缓存,所以加上这个注解:

只要使用了被注解的方法,

1

就会在redis中生成一个set集合。注解中的selectUserById再加上一个“~keys”为这个集合的值名称。

关于具体的缓存的结果,这里涉及到一个特殊的命名规范,在下面会提到。

使用此方法时,如果发现有@Cacheable注解,就会去检查是否存在缓存。如果存在,那么将省略获取步骤,直接返回缓存结果。

4.变更数据时,需要使用@CacheEvict去掉缓存结果

如果数据更改/删除/增加,那么就要去掉缓存结果,时刻保证获取的数据是最新的。

所以,在所有涉及变更数据的方法上都要加上以下注解:

这里的selectUserById就是刚才被缓存的方法注解中的value。清除缓存的时候,根据这个value拼接成为缓存的set的名称,然后在redis中把这个set干掉(也就是说,一次cud会干掉selectByPrimaryKey方法所有缓存的结果)。保证下次执行@Cacheable修饰的方法时,缓存的是最新的结果。

5.如果cud操作可以返回结果,那么@CachePut是个更好的选择

如果@CacheEvict是删除缓存,那么@CachePut就是更新缓存。可以直接把缓存的内容修改成更改后的结果。

如果想要使用@CachePut,一定要保证返回的结果就是你需要缓存的内容。我曾经误用过@CachePut。当时修饰的方法,只要catch到错误,就会返回错误信息,而这个错误信息同样也会被缓存起来。后来我才发现缓存的结果不对劲,发现并且解决了这个问题。

6.如果返回结果为null,将不会被缓存

写了一个测试方法:

如果返回的结果是null,则不会缓存此结果。遇到错误的情况,可以直接返回null,就不用担心缓存的问题了。

(2)命名规则问题

之前我们提到,缓存结果为set集合。

set的名称是@Cacheable注解中的value加上~key拼接而成的,比如刚才的selectByPrimaryKey方法缓存的set的名称就是selectUserById~key。

set中键值对的key命名规则如下:参数名-参数值。比如我刚才使用selectByPrimaryKey(String id)方法,参数id值为1,那么set中的一个键值对的key就为id-1,结果为方法的结果。

这会导致什么问题呢?假如有两个方法,他们的@Cacheable注解value相同,而方法中的参数名和参数值也相同,那么缓存结果就会被互相覆盖。

解决办法有两个:

1.规范命名

在需要缓存的方法不多时,要人工保证注解不能出现相同的value。

2.更换缓存命名规则

写一个配置方法:

注入到spring中,就会改变命名规则。

key的命名规则改成了当前类名-方法名-参数名-参数值,从刚才的id-1改成了userServiceimpl-selectByPrimaryKey-id-1。因为同一个类下不可能同时存在两个相同的方法,那就避免了覆盖问题。

二、总结

除了缓存之外,还可以通过spring-data-redis提供的方法直接操作redis。这里的操作和jedis又有些许不同,我之后将会继续研究。

发表评论

电子邮件地址不会被公开。 必填项已用*标注