当前位置: 首页 > news >正文

StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改

前言

使用StackExchange.Redis没有直接相关的方法进行模糊查询的批量删除和修改操作,虽然可以通过Scan相关的方法进行模糊查询,例如:HashScan("hashkey", "*key*"),然后再使用相关的方法进行相关的批量操作,但是如果缓存数据量比较大,效率低下,那么可以使用Lua脚本进行模糊查询的批量操作:ScriptEvaluate(LuaScript.Prepare(...))。

 

通过keys进行模糊查询后的批量操作

批量删除

复制代码
 1             var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379,allowAdmin = true");
 2             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
 3                 //Redis的keys模糊查询:
 4                 " local ks = redis.call('KEYS', @keypattern) " + //local ks为定义一个局部变量,其中用于存储获取到的keys
 5                 " for i=1,#ks,5000 do " +    //#ks为ks集合的个数, 语句的意思: for(int i = 1; i <= ks.Count; i+=5000)
 6                 "     redis.call('del', unpack(ks, i, math.min(i+4999, #ks))) " + //Lua集合索引值从1为起始,unpack为解包,获取ks集合中的数据,每次5000,然后执行删除
 7                 " end " +
 8                 " return true "
 9                 ),
10                 new { keypattern = "mykey*" });
复制代码

批量修改

复制代码
1             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
2                 " local ks = redis.call('KEYS', @keypattern) " + 
3                 " for i=1,#ks do " +    
4                 "     redis.call('set', ks[i], @value) " +
5                 " end " +
6                 " return true "),
7                 new { keypattern = "mykey*", value = "setval" });
复制代码

对Hash集合下的key进行模糊查询后的批量操作

批量删除

复制代码
 1             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
 2                 " local ks = redis.call('hkeys', @hashid) " +
 3                 " local fkeys = {} " +
 4                 " for i=1,#ks do " +
 5                 //使用string.find进行匹配操作
 6                 "   if string.find(ks[i], @keypattern) then " +
 7                 "      fkeys[#fkeys + 1] = ks[i] " +
 8                 "   end " +
 9                 " end " +
10                 " for i=1,#fkeys,5000 do " +
11                 "   redis.call('hdel', @hashid, unpack(fkeys, i, math.min(i+4999, #fkeys))) " +
12                 " end " +
13                 " return true "
14                 ),
15                 new { hashid = "hkey", keypattern = "^mykey" });   //keypattern为可使用正则表达式
复制代码

批量修改

复制代码
 1             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
 2                 " local ks = redis.call('hkeys', @hashid) " +
 3                 " local fkeys = {} " +
 4                 " for i=1,#ks do " +
 5                 "   if string.find(ks[i], @keypattern) then " +
 6                 "      fkeys[#fkeys + 1] = ks[i] " +
 7                 "   end " +
 8                 " end " +
 9                 " for i=1,#fkeys do " +
10                 "   redis.call('hset', @hashid, fkeys[i], @value) " +
11                 " end " +
12                 " return true "
13                 ),
14                 new { hashid = "hkey", keypattern = "^key", value = "hashValue" });   //keypattern为可使用正则表达式
复制代码

对Set集合下的值进行模糊查询后的批量操作

批量删除

复制代码
 1             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
 2                 " local ks = redis.call('smembers', @keyid) " +
 3                 " local fkeys = {} " +
 4                 " for i=1,#ks do " +
 5                 "   if string.find(ks[i], @keypattern) then " +
 6                 "      fkeys[#fkeys + 1] = ks[i] " +
 7                 "   end " +
 8                 " end " +
 9                 " for i=1,#fkeys,5000 do " +
10                 "   redis.call('srem', @keyid, unpack(fkeys, i, math.min(i+4999, #fkeys))) " +
11                 " end " +
12                 " return true "
13                 ),
14                 new { keyid = "setkey", keypattern = "^myval" });   //keypattern为可使用正则表达式
复制代码

注意

从 Redis 2.6.0 版本开始,才可通过内置的 Lua 解释器,使用 EVAL 命令对 Lua 脚本进行求值。

相关文章:

  • Java培训小结
  • Flume NG 学习笔记(六)Selector(复用与复制)测试
  • [开源]用MQL4实现MD5加密
  • 清除浮动
  • zabbix监控mysql主从状态
  • 大整数算法[12] 有符号乘法
  • 多线程(七)---多线程同步相关问题
  • java基础入门1到100的奇数求和
  • 清除Css中select的下拉箭头样式
  • android中webview携带cookie以及webview所加载网页中js调用java方法问题
  • 模拟 ZOJ 3878 Convert QWERTY to Dvorak
  • 【Java每日一题】20170322
  • JavaScript中的对象复制(Object Clone)
  • C#后台传入数据JS接收
  • petstore-jdbc
  • 【译】JS基础算法脚本:字符串结尾
  • $translatePartialLoader加载失败及解决方式
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • AngularJS指令开发(1)——参数详解
  • gf框架之分页模块(五) - 自定义分页
  • IOS评论框不贴底(ios12新bug)
  • js对象的深浅拷贝
  • leetcode46 Permutation 排列组合
  • PAT A1120
  • Python爬虫--- 1.3 BS4库的解析器
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Transformer-XL: Unleashing the Potential of Attention Models
  • webpack+react项目初体验——记录我的webpack环境配置
  • 基于axios的vue插件,让http请求更简单
  • 记一次删除Git记录中的大文件的过程
  • 开源地图数据可视化库——mapnik
  • 前端性能优化--懒加载和预加载
  • 如何使用 JavaScript 解析 URL
  • 入门级的git使用指北
  • 山寨一个 Promise
  • 深度学习入门:10门免费线上课程推荐
  • 详解移动APP与web APP的区别
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 原生js练习题---第五课
  • (C#)获取字符编码的类
  • (pojstep1.3.1)1017(构造法模拟)
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (蓝桥杯每日一题)love
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Linq学习笔记
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .htaccess配置常用技巧
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution