关于@CacheEvict无法解决分页缓存清除的解决思路

目录
  • @CacheEvict无法解决分页缓存清除
    • 了解了两种写法::
  • spring分页缓存

@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) {
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用@CacheEvict清除指定下所有缓存

    目录 @CacheEvict清除指定下所有缓存 @Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除 @Cacheable 缓存 @CachePut:缓存更新 @CacheEvict:缓存删除 @CacheEvict清除指定下所有缓存 @CacheEvict(cacheNames = "parts:grid",allEntries = true) 此注解会清除part:grid下所有缓存 @CacheEvict要求指定一个或多个缓存,使之都受影响.

  • Spring实战之清除缓存操作示例

    本文实例讲述了Spring实战之清除缓存操作.分享给大家供大家参考,具体如下: 一 配置文件 <?xml version="1.0" encoding="GBK"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p=&

  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    注释介绍 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @Cacheable 作用和配置方法 参数 解释 example value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如: @Cacheable(value="mycache") @Cacheable(value={"cache1","cache2"} key 缓存的 key,可以为空,如果指定要按照

  • @CacheEvict 清除多个key的实现方式

    借用@Caching实现 入参是基本类型的: @Caching(evict={@CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId"), @CacheEvict(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleId"), @C

  • 关于@CacheEvict无法解决分页缓存清除的解决思路

    目录 @CacheEvict无法解决分页缓存清除 了解了两种写法:: spring分页缓存 @CacheEvict无法解决分页缓存清除 当下比较热门的spring缓存就是encache,但是最近在写毕业设计的时候,发现了在缓存分页的时候,往往只缓存了一页数据,导致点击下一页的时候,没有响应.因此花了点时间去了解了一想@CacheEvict. 在我们缓存一个数据的时候,都是缓存在一个key里面,如下 //这是插入的时候需要清除缓存key里面的内容 @CacheEvict(value = "abou

  • JSP 开发之Servlet解决网页缓存问题

    JSP 开发之Servlet解决网页缓存问题 (1)我们为什么要防止游览器页面缓存的问题: 所以在不需要缓存的页面中需要实现不缓存页面: 代码如下: package com.lc.HttpTest; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.ser

  • 使用时间戳解决ie缓存的问题

    在开发测试中,如果选择ie,当编辑某条数据时,再回过头来进行编辑,会发现,里面的数据和没有编辑以前是一样的, 这和种情况下,解决ie缓存成了问题.我的方法是,在请求链接后面加上一个时间戳,就只可以避免这种问题的出现. 复制代码 代码如下: var getTimestamp=new Date().getTime(); //时间戳 var _url = "${pageContext.request.contextPath}/productData/addShow.do?productDataId=&

  • Nginx 反向代理并缓存及缓存清除的方法

    本文介绍了Nginx 反向代理并缓存及缓存清除的方法,分享给大家,具体如下: 一. Nginx 配置 #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { log_form

  • 基于vue中keep-alive缓存问题的解决方法

    vue开发的时候,我们经常会有这样的需求:开发一个详细页面来展示商品的详细信息,根据列表页传入的id进行请求,拿到对应的数据进行渲染. 但是一般在路由上都会加上keep-alive保持数据的状态,除非强制无缓存刷新,这就导致第一次进入详情页面时,可以在created中拿到id,但是返回后,再点击进入,就不会再走相应的生命周期了,无法拿到新的id 这时候可以使用vue的$destroy()方法 这是vue的一个生命周期,完全销毁一个实例.清理它与其它实例的连接,解绑它的全部指令及事件监听器. 不用

  • mysql一对多关联查询分页错误问题的解决方法

    xml问价中查询数据中包含list,需要使用collection <resultMap id="XX" type="com.XXX.XXXX"> <id column="o_id" jdbcType="BIGINT" property="id" /> <result column="o_user_id" jdbcType="BIGINT"

  • 关于vue路由缓存清除在main.js中的设置

    1.main.js /* 页面数据缓存 */ var _CACHE_OBJS = {}; function _init_cache(comp, key, cache) { var obj = cache[key]; if (obj !== undefined) { comp[key] = obj; } var deep = typeof comp[key] === 'object'; comp.$watch(key, function (val) { //console.log("page &q

  • iOS蓝牙设备名称缓存问题的解决方法

    1. 问题背景 当设备已经在 App 中连接成功后 修改设备名称 App 扫描到的设备名称仍然是之前的名称 App 代码中获取名称的方式为(perpheral.name) 2. 问题分析 当 APP 为中心连接其他的蓝牙设备时. 首次连接成功过后,iOS系统内会将该外设缓存记录下来. 下次重新搜索时,搜索到的蓝牙设备时,直接打印 (peripheral.name),得到的是之前缓存中的蓝牙名称. 如果此期间蓝牙设备更新了名称,(peripheral.name)这个参数并不会改变,所以需要换一种方

  • 解决removeEventListener 无法清除监听的问题

    1. 原因 许多入前端不久的人都会遇到 removeEventListener 无法清除监听的情况,这是由于 要移除事件句柄,addEventListener() 的执行函数必须使用外部函数,如上实例所示 (myFunction). 匿名函数,类似 "document.removeEventListener("event", function(){ myScript });" 该事件是无法移除的. 而在很多情况下我们需要句柄回调的传参,又需要其他传参时免不了使用句柄

  • vue keepAlive缓存清除问题案例详解

    vue项目中经常会用到keepalive来做缓存,在应付基本要求上可以说非常方便.但是遇到同一个页面,根据条件不同,分别缓存或者不缓存,就有些麻烦了. 首先先把坑列出来: 1. <keep-alive v-if="xxx"> <router-view /> </keep-alive> <keep-alive v-else> <router-view /> </keep-alive> 网上很多都是这种方法,用了这种方

随机推荐