在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.然后写一个Bean implements InitializingBean在启动的时候加载这些脚本.
/**
* 加载批量lua脚本
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
loadDelScript();
} /**
* 加载批量删除脚本
*/
private void loadDelScript() throws IOException {
String s = FileUtils.readFileToString(new ClassPathResource(CRedisCacheConstant.SCRIPT_PATH + "/" + "dels.lua").getFile(), Charset.forName("UTF-8"));
DefaultRedisScript<List> sc = new DefaultRedisScript<>(s, List.class);
scripts.put("dels", sc);
}
3.需要批量删除的时候通过DefaultRedisScript去使用这个脚本
DefaultRedisScript<List> sc = scripts.get("dels");
List<String> cache = (List<String>) redisTemplate.execute(sc, stringRedisSerializer, stringRedisSerializer, Collections.singletonList(wholeKey));
log.info("删除page缓存 {}", cache);
这样就可以在Java代码中使用lua脚本成功批量删除缓存啦.
有些小朋友可能会问.这样做每次都需要把脚本序列化传给redis吗?那脚本大了不是很占用网络吗?
其实并不会...
DefaultScriptExecutor中有一段代码:
protected <T> T eval(RedisConnection connection, RedisScript<T> script, ReturnType returnType, int numKeys,
byte[][] keysAndArgs, RedisSerializer<T> resultSerializer) { Object result;
try {
result = connection.evalSha(script.getSha1(), returnType, numKeys, keysAndArgs);
} catch (Exception e) { if (!exceptionContainsNoScriptError(e)) {
throw e instanceof RuntimeException ? (RuntimeException) e : new RedisSystemException(e.getMessage(), e);
} result = connection.eval(scriptBytes(script), returnType, numKeys, keysAndArgs);
} if (script.getResultType() == null) {
return null;
} return deserializeResult(resultSerializer, result);
}
会先计算这个脚本的sha1的值,通过redis的EVALSHA去允许脚本..如果失败了,比如第一次没有加载.就把脚本序列化传过去执行...往后都通过这个sha1值直接调用.
127.0.0.1:> SCRIPT EXISTS f7cb6ede3d6d2e14b812f32f129633443197b42c
) (integer)
小结
通过使用DefaultRedisScript可以比较方便的在java中使用lua脚本操作redis
在Spring中使用Redis Lua脚本批量删除缓存的更多相关文章
- SpringBoot(18)---通过Lua脚本批量插入数据到Redis布隆过滤器
通过Lua脚本批量插入数据到布隆过滤器 有关布隆过滤器的原理之前写过一篇博客: 算法(3)---布隆过滤器原理 在实际开发过程中经常会做的一步操作,就是判断当前的key是否存在. 那这篇博客主要分为三 ...
- Redis Lua脚本完全入门
1. 前言 Redis是高性能的KV内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO地理位置信息计算.Redis提供了丰富的命令来供我们使用以实现一些计算.R ...
- Redis Lua脚本调试
从版本3.2开始,Redis包含一个完整的Lua调试器,可以用来使编写复杂Redis脚本的任务更加简单. 由于Redis 3.2仍处于测试阶段,请unstable从Github 下载Redis 的分支 ...
- Redis Lua 脚本使用
本文转载自Redis Lua 脚本使用 Lua 简介 Lua语言提供了如下几种数据类型:booleans(布尔).numbers(数值).strings(字符串).tables(表格). 下面是一些 ...
- redis lua脚本学习
语法格式(常见) a = 5 -- 全局变量 local b = 5 -- 局部变量 Eval的使用 EVAL script numkeys key [key ...] arg [arg ...] 首 ...
- 记自己在spring中使用redis遇到的两个坑
本人在spring中使用redis作为缓存时,遇到两个坑,现在记录如下,算是作为自己的备忘吧,文笔不好,望大家见谅: 一.配置文件 <!-- 加载Properties文件 --> < ...
- Redis批量删除缓存数据
背景: 在使用redis中,经常会遇到批量删除缓存的情况,但是对于在客户端中,如果一个一个的删除key,则需要较长时间及相对麻烦,可以使用以下命令,批量删除缓存. 本地批量删除KEY: ./redis ...
- redis优雅的批量删除key
redis优雅的批量删除key 近期在处理redis的故障中,发现需要删除大量的历史数据(也是bigkeys),好在符合正则表达式.要不然就很痛苦,这也体现了在设计key的时候遵循规范带来的维护好处之 ...
- LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
原文:LINQ To SQL在N层应用程序中的CUD操作.批量删除.批量更新 0. 说明 Linq to Sql,以下简称L2S. 以下文中所指的两层和三层结构,分别如下图所示: 准确的说,这里 ...
随机推荐
- BZOJ3438:小M的作物 (最大闭合权图->最小割)
小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可以获得ai ...
- hiho1523 数组重排2
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个1-N的排列A1, A2, ... AN,每次操作小Hi可以选择一个数,把它放到数组的最左边. 请计算小Hi最少进 ...
- linux发行版本centos7.4上安装jdk,tomcat,mariadb良心教程
准备工作: 本地安装:rpm -ivh 程序名 因为jdk,tomcat,mysql的安装过程需要从网上下载部分支持包才可以继续,所以要求提前安装下载好依赖. yum install glibc.i6 ...
- 关于Mybatis将查询结果中添加常量列并返回
引言 在使用mybatis的时候,查询一个集合返回给前台页面,在有的时候,我们会添加一个常量字段到对象或者集合中,来标识这个对象属于的类型等等情况,当前台进行再次请求的时候携带此变量进行请求. 但是: ...
- Unrecoverable error: corrupted cluster config file.
from: https://www.cnblogs.com/topicjie/p/7603227.html 缘起 正在欢乐的逗着孩子玩耍,突然间来了一通电话,值班人员告诉我误重启了一台服务器,是我负责 ...
- hadoop入门手册1:hadoop【2.7.1】【多节点】集群配置【必知配置知识1】
问题导读 1.说说你对集群配置的认识?2.集群配置的配置项你了解多少?3.下面内容让你对集群的配置有了什么新的认识? 目的 目的1:这个文档描述了如何安装配置hadoop集群,从几个节点到上千节点.为 ...
- java中static关键字的理解(转载)
static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...
- python 时间日期处理
refer to : http://www.wklken.me/posts/2015/03/03/python-base-datetime.html#datetime-string http://ww ...
- python: delete the duplicates in a list
下面有几种做法, 其中3之简洁令人惊讶. 1, >>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8] >>> t [1, 2, 3, 1, 2, ...
- centos6 查看SELinux状态 关闭SELinux
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.在这种访问控制体系的限制下,进程只能访问那 ...