背景

之前分享了一篇利用lua脚本批量删除redis的key的文章.现在项目中我打算使用spring的缓存,而Spring缓存以前我是用ehcache来做实现的.没发现什么问题..这次我换成redis来做缓存了..一般也没什么大问题...目前唯一遇到的一个比较坑的问题就是缓存通过注解删除不了..我想想好像也算正常吧.因为java里面做缓存的话可能会使用map类似的结构,我remove掉一个key,不管对应的value是什么结构都能删除掉..但是redis的key是没有层级的...比如2个key分别是a:a1和a:a2.虽然可视化工具上看上去都是属于a下面的..但是redis的del a并不会删除a下属的所有key而是只会删除key为a的这个数据.所以我得自己实现Spring Cache中删除缓存的那部分逻辑.而redis本身是没有批量删除key的功能的.

问题

所以现在的问题就是 如何在Spring的redisTemplate中使用lua脚本删除key

解决办法

我觉得可以这么做:

1.首先把之前文章写的批量删除的lua脚本放到maven项目的resources下.

2.然后写一个Beanimplements InitializingBean在启动的时候加载这些脚本.

1 /**

2 * 加载批量lua脚本3 *4 *@throwsException5 */

6 @Override7 public void afterPropertiesSet() throwsException {8 loadDelScript();9 }10

11 /**

12 * 加载批量删除脚本13 */

14 private void loadDelScript() throwsIOException {15 String s = FileUtils.readFileToString(new ClassPathResource(CRedisCacheConstant.SCRIPT_PATH + "/" + "dels.lua").getFile(), Charset.forName("UTF-8"));16 DefaultRedisScript sc = new DefaultRedisScript<>(s, List.class);17 scripts.put("dels", sc);18 }

3.需要批量删除的时候通过DefaultRedisScript去使用这个脚本

1 DefaultRedisScript sc = scripts.get("dels");2 List cache = (List) redisTemplate.execute(sc, stringRedisSerializer, stringRedisSerializer, Collections.singletonList(wholeKey));3 log.info("删除page缓存 {}", cache);

这样就可以在Java代码中使用lua脚本成功批量删除缓存啦.

有些小朋友可能会问.这样做每次都需要把脚本序列化传给redis吗?那脚本大了不是很占用网络吗?

其实并不会...

DefaultScriptExecutor中有一段代码:

1 protected T eval(RedisConnection connection, RedisScript script, ReturnType returnType, intnumKeys,2 byte[][] keysAndArgs, RedisSerializerresultSerializer) {3

4 Object result;5 try{6 result =connection.evalSha(script.getSha1(), returnType, numKeys, keysAndArgs);7 } catch(Exception e) {8

9 if (!exceptionContainsNoScriptError(e)) {10 throw e instanceof RuntimeException ? (RuntimeException) e : newRedisSystemException(e.getMessage(), e);11 }12

13 result =connection.eval(scriptBytes(script), returnType, numKeys, keysAndArgs);14 }15

16 if (script.getResultType() == null) {17 return null;18 }19

20 returndeserializeResult(resultSerializer, result);21 }

会先计算这个脚本的sha1的值,通过redis的EVALSHA去允许脚本..如果失败了,比如第一次没有加载.就把脚本序列化传过去执行...往后都通过这个sha1值直接调用.

127.0.0.1:6379>SCRIPT EXISTS f7cb6ede3d6d2e14b812f32f129633443197b42c1) (integer) 1

小结

通过使用DefaultRedisScript可以比较方便的在java中使用lua脚本操作redis

java redis 批量删除_在Spring中使用Redis Lua脚本批量删除缓存相关推荐

  1. java为什么引入注解_说说Spring中为何要引入Lookup注解

    前言 我们先探一探官方文档关于Method Injection的章节是怎么说的: In most application scenarios, most beans in the container ...

  2. lua游戏代码_在游戏中如何使用LUA脚本语言

    当你希望在你的游戏开始的时候读取一些信息,以配置你的游戏,这些信息通常都是放到一个文本文件中,在你的游戏启动的时候,你需要打开这个文件,然后解析字符串,找到所需要的信息. 或许你认为这样就足够了,为什 ...

  3. linux连接redis 命令_在Docker中使用Redis

    1. 简介 本文章将介绍如何使用 Docker 探索 Redis.我们可以在 Docker for Windows .Docker for mac 或者 Linux 模式下运行 Docker 命令. ...

  4. 记自己在spring中使用redis遇到的两个坑

    本人在spring中使用redis作为缓存时,遇到两个坑,现在记录如下,算是作为自己的备忘吧,文笔不好,望大家见谅: 一.配置文件 1 <!-- 加载Properties文件 --> 2 ...

  5. java.lang.IllegalArgumentException: 字符[_]在域名中永远无效。 at

    [http-nio-8080-exec-1] org.apache.coyote.AbstractProcessor.parseHost [xxx_tomcat] 是无效主机注意:更多的请求解析错误将 ...

  6. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

  7. redis 清空缓存_「镜头回放」简直了!spring中清除redis缓存导致应用挂死

    异常场景 springWeb应用一直运行正常,同事最近反应,每次版本更新完毕,刷新缓存,就会导致应用挂死.只有重启redis应用才恢复正常. 项目概况 springWeb项目,常用配置表做了redis ...

  8. java悲观者不加事务_在spring中,使用事务和不用事务的区别

    各位高手大家好,我最近在学习Spring,自己也作了几个例子.但我在开发的过程中发现我使用事务和不使用事务效果都一样,我想问一下两者的区别,谢谢大家:第一种,不使用事务,Spring... 各位高手大 ...

  9. 在Spring中使用Redis

    随着NoSQL解决方案在许多问题上越来越受欢迎,现代项目越来越多地考虑使用一些(或几种)NoSQL代替(或并排)传统RDBMS. 我已经在本 , 本和本文章中介绍了我在MongoDB上的经验. 在本文 ...

最新文章

  1. 《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)
  2. Linux命令(2):free
  3. linux会话管理,Linux 安装 screen 远程会话管理工具
  4. Left,Right,Outer和Inner Joins有什么区别?
  5. php语言三个数从小到大排序,求教输入5个数,从小到大排序 的C语言程序?
  6. 四、记一次失败的 CAS 搭建 之 结果总是那么伤(客户端)
  7. Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略
  8. 执行存储过程执行时,报ORA-01031权限不足
  9. Linux中MySQL没有schema_linux服务器安装Mysql后,只能看到information_schema/test这两个库,无法修改密码...
  10. 什么是EJB?EJB详解
  11. javaweb调用第三方短信接口
  12. 微信小程序阻止默认冒泡事件
  13. 四季电台应用项目源码
  14. 老域名及用户行为习惯.
  15. Sass、Scss、Less和Stylus区别总结
  16. 最高月薪15K!当过老师、卖过保险的退伍小哥,用三个月开启技术人生!
  17. gpu超算算法_四颗intel Xeon 可扩展频率高达4GHz处理器+双GPU的全能超算架构
  18. Unity2019刷地形教程
  19. r股票数据接口读取CSV文件
  20. dhcp snooping华为_华为交换机dhcp snooping 功能配置

热门文章

  1. w10计算机配置在哪,Win10怎么看电脑配置?Win10系统电脑配置查看方法图解
  2. Linux基础——SSH远程连接
  3. 如何设置谷歌浏览器默认搜索引擎为百度
  4. 淘宝2013双12攻略:淘宝卖家双12怎么玩?
  5. (OK) porting MPTCP to LineageOS-14.1-kiwi (Android-7.1.1,运行在Huawei honor 5x) - 华为荣耀5x - 95% 成功
  6. 贪吃蛇—C—基于easyx图形库(下):从画图程序到贪吃蛇【自带穿墙术】
  7. 机器学习中的矩阵分解方法
  8. 假设计算机显示器,计算机显示器是由什么组成
  9. poj3270 Cow Sorting 置换环+贪心
  10. 破解仓储难题?WMS仓储管理系统解决方案