关于@CacheEvict无法解决分页缓存清除的解决思路
作者:你听_我说 发布时间:2023-07-06 20:22:44
标签:@CacheEvict,分页,缓存,清除
@CacheEvict无法解决分页缓存清除
当下比较热门的spring缓存就是encache,但是最近在写毕业设计的时候,发现了在缓存分页的时候,往往只缓存了一页数据,导致点击下一页的时候,没有响应。因此花了点时间去了解了一想@CacheEvict。
在我们缓存一个数据的时候,都是缓存在一个key里面,如下
//这是插入的时候需要清除缓存key里面的内容
@CacheEvict(value = "aboutShop", key = "'selectAllShop'")
//这是一开始查询的时候,保存到key的内容
@Cacheable(value = "aboutShop", key = "'selectAllShop'")
//这是后来添加了分页的缓存key设置,这样缓存分页了,但是在插入的时候,无法更新到查询信息
@Cacheable(value = "aboutShop", key = "'selectAllShop_'+#params.pageNo")
这是我的一个查询分页并缓存分页一开始的写法,然而,每次缓存都是缓存了第一页
因此,就去看了一下如何解决
了解了两种写法::
第一种:用spring AOP的方式,循环遍历删除所有带有前缀selectAllShop的内容,
因为encache没有自带模糊通配符,所有要自己重写一个方法进行匹配删除。这里有个博主讲的挺好的,我的第一个方法就是这样汲取的。
https://www.jb51.net/article/134394.htm
接下来讲被我吸收利用到毕业设计里面的第二种方法吧!我看完第一种方法,发现这种方法循环遍历删除,如果数据几十万条的情况下(虽然我的只有一百多条数据),遍历删除需要的时间还是不少的。因此我们可以从encache注解熟悉的value里面下手,
我给出的代码,是我写好的自定义value名称,配置大于约定,我在spring-redis.xml中配置一个RedisCacheManager管理器,并且配置缓存区间
<!--配置RedisCacheManager-->
<bean class="org.springframework.data.redis.cache.RedisCacheManager" id="redisCacheManager">
<constructor-arg name="redisOperations" ref="redisTemplate"/>
<!--设置过期时间-->
<property name="defaultExpiration" value="${redis.expiration}"/>
<!--配置缓存区间-->
<property name="cacheNames">
<list>
<value>aboutUser</value>
<value>aboutShop</value>//这是我独立出来的一个缓存区间,用来专门存放Shop查询分页的信息
</list>
</property>
</bean>
在插入信息的时候使用:
//allentries是指清除value里面的所有内容
@CacheEvict(value = "aboutShop", allEntries = true)
这样就可以实现插入的时候,同步缓存分页了
spring分页缓存
@Cacheable(key = "'myPage_'+#pagePlus.current+'_'+#pagePlus.limit")
public void cachePage(Page pagePlus) {
}
来源:https://blog.csdn.net/weixin_39236419/article/details/88810726


猜你喜欢
- 前言Spring内置的工具类里,最喜欢用的就是文件读写这一部分,虽然原生的写法也没几句,但是就是懒,不想循环、判断什么的,直接调用现成的静态
- spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单
- 一 为什么要使用线程池对于操作系统而言,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换时要执行内存换页,清空
- 1.启动项目的时候报错1.Error starting ApplicationContext. To display the auto-co
- 本文实例为大家分享了Android仿今日头条订阅频道,供大家参考,具体内容如下源码:Android实现今日头条订阅频道布局文件<?xm
- 前言我们在配置Spring Xml配置文件的时候,可以在文件路径字符串中加入 ${} 占位符,Spring会自动帮我们解析占位符,这么神奇的
- @ApiImplicitParam作用在方法上,表示单独的请求参数参数name:参数名。value:参数的具体意义,作用。required:
- 公司经理把我拉出来,死马当活马医,做一个安卓app,作为刚毕业几个月且只是培训了几个月的小白来说,这无疑是一个非常大的挑战,当然最大的挑战不
- 一、Spring Boot的特点首先我们要知道 Spring Boot 在底层已经为我们添加好了很多依赖。比如我们常用的Tomcat,Spr
- 本文章牵涉到的技术点比较多:spring Data JPA、Redis、Spring MVC,Spirng Cache,所以在看这篇文章的时
- 我在5月份的时候就申请了洞态IAST企业版内测,算是比较早的一批用户了。聊聊几个我比较在意的问题,比如API接口覆盖率、第三方开源组件检测以
- 前言本篇教程偏向实战,程序猿直接copy代码加入到自己的项目中做简单的修修改改便可使用,而对于springboot以及mybatis不在此进
- webclient在调用DownloadData或者DownloadString的时候请求回来的数据出现乱码问题,解决办法如下:1、设置we
- 1. Date.compareTo()java.util.Date提供了在Java中比较两个日期的经典方法compareTo()。如果两个日
- 1.问题由来迷宫实验是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡
- 一、系统自动抛出异常当程序语句出现一些逻辑错误、主义错误或者类型转换错误时,系统会自动抛出异常例一public static void ma
- 在拼接绝对路径的网址时,经常需要从Request.Url中获取根网址(比如https://git.oschina.net),然后与相对路径一
- /// <summary>/// 获取本机在局域网的IP地址/// </summary>/// <return
- Android中的传递有两个方法,一个是Serializable,另一个是Parcelable。Serializable是J2SE本身就支持
- 目录业务场景:解决方案:总结业务场景:一个用户数据接口,要求在20ms内返回数据,它的调用逻辑复杂,关联接口多,需要从3个接口汇总数据,这些