java redis 批量删除_在Spring中使用Redis Lua脚本批量删除缓存
背景
之前分享了一篇利用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脚本批量删除缓存相关推荐
- java为什么引入注解_说说Spring中为何要引入Lookup注解
前言 我们先探一探官方文档关于Method Injection的章节是怎么说的: In most application scenarios, most beans in the container ...
- lua游戏代码_在游戏中如何使用LUA脚本语言
当你希望在你的游戏开始的时候读取一些信息,以配置你的游戏,这些信息通常都是放到一个文本文件中,在你的游戏启动的时候,你需要打开这个文件,然后解析字符串,找到所需要的信息. 或许你认为这样就足够了,为什 ...
- linux连接redis 命令_在Docker中使用Redis
1. 简介 本文章将介绍如何使用 Docker 探索 Redis.我们可以在 Docker for Windows .Docker for mac 或者 Linux 模式下运行 Docker 命令. ...
- 记自己在spring中使用redis遇到的两个坑
本人在spring中使用redis作为缓存时,遇到两个坑,现在记录如下,算是作为自己的备忘吧,文笔不好,望大家见谅: 一.配置文件 1 <!-- 加载Properties文件 --> 2 ...
- java.lang.IllegalArgumentException: 字符[_]在域名中永远无效。 at
[http-nio-8080-exec-1] org.apache.coyote.AbstractProcessor.parseHost [xxx_tomcat] 是无效主机注意:更多的请求解析错误将 ...
- spring 加载java类_在Spring中基于Java类进行配置的完整步骤
在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...
- redis 清空缓存_「镜头回放」简直了!spring中清除redis缓存导致应用挂死
异常场景 springWeb应用一直运行正常,同事最近反应,每次版本更新完毕,刷新缓存,就会导致应用挂死.只有重启redis应用才恢复正常. 项目概况 springWeb项目,常用配置表做了redis ...
- java悲观者不加事务_在spring中,使用事务和不用事务的区别
各位高手大家好,我最近在学习Spring,自己也作了几个例子.但我在开发的过程中发现我使用事务和不使用事务效果都一样,我想问一下两者的区别,谢谢大家:第一种,不使用事务,Spring... 各位高手大 ...
- 在Spring中使用Redis
随着NoSQL解决方案在许多问题上越来越受欢迎,现代项目越来越多地考虑使用一些(或几种)NoSQL代替(或并排)传统RDBMS. 我已经在本 , 本和本文章中介绍了我在MongoDB上的经验. 在本文 ...
最新文章
- 《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)
- Linux命令(2):free
- linux会话管理,Linux 安装 screen 远程会话管理工具
- Left,Right,Outer和Inner Joins有什么区别?
- php语言三个数从小到大排序,求教输入5个数,从小到大排序 的C语言程序?
- 四、记一次失败的 CAS 搭建 之 结果总是那么伤(客户端)
- Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略
- 执行存储过程执行时,报ORA-01031权限不足
- Linux中MySQL没有schema_linux服务器安装Mysql后,只能看到information_schema/test这两个库,无法修改密码...
- 什么是EJB?EJB详解
- javaweb调用第三方短信接口
- 微信小程序阻止默认冒泡事件
- 四季电台应用项目源码
- 老域名及用户行为习惯.
- Sass、Scss、Less和Stylus区别总结
- 最高月薪15K!当过老师、卖过保险的退伍小哥,用三个月开启技术人生!
- gpu超算算法_四颗intel Xeon 可扩展频率高达4GHz处理器+双GPU的全能超算架构
- Unity2019刷地形教程
- r股票数据接口读取CSV文件
- dhcp snooping华为_华为交换机dhcp snooping 功能配置
热门文章
- w10计算机配置在哪,Win10怎么看电脑配置?Win10系统电脑配置查看方法图解
- Linux基础——SSH远程连接
- 如何设置谷歌浏览器默认搜索引擎为百度
- 淘宝2013双12攻略:淘宝卖家双12怎么玩?
- (OK) porting MPTCP to LineageOS-14.1-kiwi (Android-7.1.1,运行在Huawei honor 5x) - 华为荣耀5x - 95% 成功
- 贪吃蛇—C—基于easyx图形库(下):从画图程序到贪吃蛇【自带穿墙术】
- 机器学习中的矩阵分解方法
- 假设计算机显示器,计算机显示器是由什么组成
- poj3270 Cow Sorting 置换环+贪心
- 破解仓储难题?WMS仓储管理系统解决方案