没等紫珍珠爆发,唐三抬手按住她的肩膀:“好了。不要闹了,紫珍珠。我们要走了,给我们一艘救生艇。然后你们就回去吧。”

太监从地上扶起郭晓,缓缓来到近前,郭晓再次跪在地上,“郭将军,太平府一案,朕杀了那么多人,为何留下你?”

集结号电影影评800字

到时候她就真正的走出了属于自己的路,而不是现在只是徘徊在边缘,始终走不进入核心的道路,而且到时候她也能参与高端战斗使用修真科技去战斗,这一切一切都能在我和僵尸有个约会世界得到,布玛能不激动才怪。
果然,萼绿华又道:“另外,因瑶池已被娘娘从妖魔手中收回,正在重建之中。许多四处逃难的女仙也纷纷回到瑶池,由于祝融和后土娘娘还未诛除,天界仍不安全,王母娘娘因仍需坐镇灵霄宝殿,担心瑶池无人守护,或有一天重演当日瑶池落入妖魔手中之惨事,故想让飞琼回到瑶池,替娘娘守护太微天。只是娘娘又说,飞琼名义上虽是瑶池女仙,却又是陛下身边之人,因此,此事还需征求陛下同意。”

下午,一队队金吾卫和巡查营和士兵出现在长安街头,平康坊内更是官府关注的重点,河东客栈的客人、掌柜和伙计全部被带回衙门询问,衙役们在平康坊挨家挨户盘问,来历不明的人一律带回衙门。

ehcache模糊批量移除缓存


目录

  • 前言

  • 实现

  • 总结

前言

众所周知,encache是现在最流行的java开源缓存框架,配置简单,结构清晰,功能强大。通过注解@Cacheable可以快速添加方法结果到缓存。通过@CacheEvict可以快速清除掉指定的缓存。

但由于@CacheEvict注解使用的是key-value的,不支持模糊删除,就会遇到问题。当我用@Cacheable配合Spring EL表达式添加了同一方法的多个缓存比如:

@GetMapping("/listOfTask/{page}/")
@Cacheable(value = "BusinessCache", key = ""listOfTask_"+ #page")
public ResponseMessage<PageTaskVO> getTaskList(@PathVariable("page") String page) {
    do something...
}

上述代码是分页获取任务信息。用EL表达式获取到参数中的page,并作为缓存的key,使用@Cacheable添加到ehcache的缓存中。此时,在缓存中就会出现listOfTask_1, listOfTask_2, listOfTask_3这种类型的key。

当添加、删除任务时,列表就会发生改变。这时候,就需要把listOfTask_*相关的缓存全部去掉。而这时,我不知道缓存中到底缓存了多少和listOfTask_*相关的内容,不可能调用@CacheEvict挨个删除。

既然ehcache本身无法支持,那就只能靠我们自己实现了。

实现

考虑到使用的注解添加的缓存,那么移除缓存也使用注解处理,可以保持开发的一致性。注解对开发者来说也很友好。那么我们就考虑使用自定义注解来来模糊批量移除缓存。

首先,定义注解CacheRemove

@Target({ java.lang.annotation.ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheRemove {
    String value();
    String[] key();
}

其中,value 同 ehcache 一样,用于定义要操作的缓存名。key 是一个数组,用于存放多种缓存 key 的正则表达式。起名 CacheRemove 清晰易懂,也不与 ehcache 本身的注解冲突。注解的定义到此为止。接下来,就需要处理注解了,由于使用的 spring 框架,很自然的,就会想到用 AOP 来做注解的具体实现。

注解的目的是批量模糊移除缓存。需考虑如下两个问题:

  1. 用什么方式模糊匹配
  2. 怎么批量删除key

我给出的处理方式,也是我认为最简单的处理方式是:

  1. 用什么方式模糊匹配 —— CacheRemove中的key传正则,可以传多个,使用正则匹配
  2. 怎么批量删除key —— 循环所有的key,找到匹配正则的就删除

首先定义类名CacheRemoveAspect

@Aspect
@Component
public class CacheRemoveAspect {
    @Pointcut(value = "(execution(* *.*(..)) && @annotation(com.example.CacheRemove))")
    private void pointcut() {}

    do something...
}

在切面中定义切点,使用execution(* *.*(..) && @annotation(com.example.CacheRemove))表示所有带注解类CacheRemove都执行,@annotation中的值是注解的全限定名。

切点定义完毕,下面的重头戏就是切面的具体实现了。一般来说,缓存会在增删改的方法执行完后才要移除。所以使用@AfterReturning()来实现。在具体实现中需要做以下几件事:

  1. 拦截方法上的注解
  2. 判断注解是不是CacheRemove
  3. 由于注解传入的 key 是个数组,循环处理每个key
  4. 在循环中编制每个 key 为 pattern, 并循环所有的缓存,移除匹配上的缓存

具体实现如下:

@AfterReturning(value = "pointcut()")
private void process(JoinPoint joinPoint){
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    Method method = signature.getMethod();
    CacheRemove cacheRemove = method.getAnnotation(CacheRemove.class);

    if (cacheRemove != null){
        String value = cacheRemove.value();
        String[] keys = cacheRemove.key(); //需要移除的正则key

        List cacheKeys = CacheUtils.cacheKeys(value);
        for (String key : keys){
            Pattern pattern = Pattern.compile(key);
            for (Object cacheKey: cacheKeys) {
                String cacheKeyStr = String.valueOf(cacheKey);
                if (pattern.matcher(cacheKeyStr).find()){
                    CacheUtils.remove(value, cacheKeyStr);
                }
            }
        }
    }
}

以上,为 ehcache 模糊批量移除缓存的具体实现。其中 BusinessCacheUtils 为自己封装的 ehcache 工具类。主要实现获取缓存池,获取缓存,移除缓存,添加缓存,查看所有缓存等正常功能。代码如下:

public class CacheUtils {

    private static CacheManager cacheManager = SpringContextHolder.getBean("ehCacheManagerFactory");

    public static Object get(String cacheName, String key) {
        Element element = getCache(cacheName).get(key);
        return element == null ? null : element.getObjectValue();
    }

    public static void put(String cacheName, String key, Object value) {
        Element element = new Element(key, value);
        getCache(cacheName).put(element);
    }

    public static void remove(String cacheName, String key) {
        getCache(cacheName).remove(key);
    }

    public static List cacheKeys(String cacheName){
        return getCache(cacheName).getKeys();
    }

   /**
     * 获得一个Cache,没有则创建一个。
     * @param cacheName
     * @return
     */
    private static Cache getCache(String cacheName) {
        Cache cache = cacheManager.getCache(cacheName);
        if (cache == null) {
            cacheManager.addCache(cacheName);
            cache = cacheManager.getCache(cacheName);
            cache.getCacheConfiguration().setEternal(true);
        }
        return cache;
    }

    public static CacheManager getCacheManager() {
        return cacheManager;
    }

}

至此,整个ehcache 模糊批量移除缓存的功能就实现了。

总结

整个过程思路简单,用到了一些 AOP 的知识就完成了需要的功能。但具体的移除部分代码可考虑进行优化。通过一次缓存的全部循环,就把需要移除的缓存都移除干净,而不是想现在这样有几个key,就全缓存遍历几次。具体实现留给读者自行完成。希望对各位有所帮助。

当前文章:http://hnhdqp.com/news/2018111853242/index.html

发布时间:2019-03-21 10:04:53

大赢家棋牌下载最新版 保友圈是什么情况 免费赢话费游戏 胡适之打牌原文 微信红包提现多久到账 怎么快速学会打麻将 乐乐课堂化学视频 金都棋牌现金网

编辑:戏海

相关新闻

换轮胎有11项服务——途虎养车网虎式服务正式上线

2019-03-21 09:17:14

牡丹江着读美术工作室

《我叫MT2》封测数据遭泄露 次日留存高达88%

2019-03-21 07:08:59

北京缎匕建筑材料集团有限公司

唐敬宗庄陵发现6尊番酋像 其中4件保存身躯部分

2019-03-21 02:06:10

如皋谮阎赘金融集团

定边县砖井镇十项工程提升幸福指数

2019-03-21 09:39:24

北海嚼嫉信息技术有限公司

热门推荐

  • 霍金去世前10天提交最后科学论文 为发现平行宇宙奠定理论基础
  • 进击的AMD,Ryzen 3000旗舰处理器曝光
  • 部分谷歌Pixel 2 XL无偏色问题,但“一机难觅”
  • 【股讯】纳指再创历史新高 人人大涨近9%
  • “香格里拉之夜”旅游推介活动在昆举行
  • 前IGN女编辑自曝被性骚扰,骚扰者:我把你当朋友
  • 预计售价25-30万 瑞风M6全系参数配置首曝
  • 君马MEET3最新谍照 更多细节信息曝光
  • “成年”的腾讯要更有责任心——对话腾讯刘胜义
  • 北京午后雷雨大风将至 雨水或添堵周一早晚岑岭
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:微赢棋牌透视 游延会官网
  • 熊猫棋牌乐 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 熊猫麻将手机官网 在线连环夺宝手机版 丹东娱乐网棋牌下载 打渔乐官网下载