前言

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

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

批量删除

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

批量修改

             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
" local ks = redis.call('KEYS', @keypattern) " +
" for i=1,#ks do " +
" redis.call('set', ks[i], @value) " +
" end " +
" return true "),
new { keypattern = "mykey*", value = "setval" });

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

批量删除

             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
" local ks = redis.call('hkeys', @hashid) " +
" local fkeys = {} " +
" for i=1,#ks do " +
//使用string.find进行匹配操作
" if string.find(ks[i], @keypattern) then " +
" fkeys[#fkeys + 1] = ks[i] " +
" end " +
" end " +
" for i=1,#fkeys,5000 do " +
" redis.call('hdel', @hashid, unpack(fkeys, i, math.min(i+4999, #fkeys))) " +
" end " +
" return true "
),
new { hashid = "hkey", keypattern = "^mykey" }); //keypattern为可使用正则表达式

批量修改

             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
" local ks = redis.call('hkeys', @hashid) " +
" local fkeys = {} " +
" for i=1,#ks do " +
" if string.find(ks[i], @keypattern) then " +
" fkeys[#fkeys + 1] = ks[i] " +
" end " +
" end " +
" for i=1,#fkeys do " +
" redis.call('hset', @hashid, fkeys[i], @value) " +
" end " +
" return true "
),
new { hashid = "hkey", keypattern = "^key", value = "hashValue" }); //keypattern为可使用正则表达式

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

批量删除

             redis.GetDatabase().ScriptEvaluate(LuaScript.Prepare(
" local ks = redis.call('smembers', @keyid) " +
" local fkeys = {} " +
" for i=1,#ks do " +
" if string.find(ks[i], @keypattern) then " +
" fkeys[#fkeys + 1] = ks[i] " +
" end " +
" end " +
" for i=1,#fkeys,5000 do " +
" redis.call('srem', @keyid, unpack(fkeys, i, math.min(i+4999, #fkeys))) " +
" end " +
" return true "
),
new { keyid = "setkey", keypattern = "^myval" }); //keypattern为可使用正则表达式

注意

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

最新文章

  1. mac 下JDK 与 tomcat 的安装与配置
  2. C# 把日期字符串转换为日期类型 (MM大写为月、小写为分钟)
  3. SqlServer性能优化 自定义动化性能收集(四)
  4. css 九宫格
  5. FreeCodeCamp 高级算法(个人向)
  6. SQL中的NULL值
  7. JavaIO流程--创建文件和目录的实例
  8. avalon1.0正式发布
  9. cmd 命令行模式操作数据库 添加查询 修改 删除 ( 表 字段 数据)
  10. Python 一等函数
  11. Mysql8 安装过程及安装过程系列问题记录
  12. 潭州课堂25班:Ph201805201 WEB 之 jQuery 第七课 (课堂笔记)
  13. 找出相似的图片--C#
  14. Git入门看这一篇就够了! (转)
  15. flex属性的学习
  16. 浅谈log4j-5-读取properties文件(转自godtrue)
  17. mock生成随机数的各种情况
  18. 基于Django-Cookie的CBV和FBV的用户验证装饰器
  19. 如何使用C#关键字const,readonly,static
  20. 【luogu P2831 愤怒的小鸟】 题解

热门文章

  1. ASP.NET Core 1.0中的管道-中间件模式
  2. RAID 概述
  3. 2016苹果春季发布会 iPhone SE发布
  4. Session for SSRS Report of Microsoft Dynamics AX
  5. TortoiseSVN Clean up 失败的处理方法
  6. SVN-让项目不包括Bin和Obj
  7. for循环或Repeat里面对某个字段进行复杂处理的解决方案
  8. ArcGIS API for JavaScript(2)-ArcGIS Server发布要素图层服务
  9. jQuery动画的实现
  10. Unity3D移植到Windows phone8 遇到的点点滴滴