前言

使用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 脚本进行求值。

StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改的更多相关文章

  1. .net core中加载lua脚本的类库: MoonSharp

    前言 MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单: 官网 ...

  2. stark组件的分页,模糊查询,批量删除

    1.分页组件高阶 2.整合展示数据showlist类 3.stark组件之分页 3.stark组件之search模糊查询 4.action批量处理数据 4.总结 1.分页组件高阶 1.分页的class ...

  3. Redis进阶实践之十九 Redis如何使用lua脚本

    一.引言               redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入 ...

  4. 在redis中使用lua脚本

    在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...

  5. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性

    Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...

  6. 新姿势!Redis中调用Lua脚本以实现原子性操作

    背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...

  7. 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密

    下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...

  8. 使用jQuery加载script脚本

    原文链接: Loading Scripts with jQuery JavaScript loaders加载器简单强大而又非常有用.我在博客上介绍过其中一些,例如 curljs  和 LABjs ,也 ...

  9. 动态加载JS脚本

    建立dynamic.js文件,表示动态加载的js文件,里面的内容为: function dynamicJS() { alert("加载完毕"); } 如下方法中的html页面和dy ...

随机推荐

  1. 使用EF取数据库返回的数据

    目录 一.取oracle自定义函数返回的自定义类型. 一.取oracle自定义函数返回的自定义类型. 1.首先创建一个函数返回自定义类型集合 --1.建立自定义类型 CREATE OR REPLACE ...

  2. Code First开发系列实战之使用EF搭建小型博客平台

    返回<8天掌握EF的Code First开发>总目录 本篇目录 理解应用需求 数据库设计 创建实体数据模型 创建实体类 创建关系和导航属性 实现DbContext类 执行数据访问 理解仓储 ...

  3. UI控件(UIButton)

    @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // UIButtonTypeCustom = 0, ...

  4. php杂记(一)

    1.require_once & require include() 函数会将指定的档案读入并且执行里面的程序 include_once() 与include相同,但只允许一次: requir ...

  5. Python黑帽编程 3.5 DTP攻击

    Python黑帽编程 3.5 DTP攻击 在上一节,<Python黑帽编程 3.4 跨越VLAN>中,我们讨论了一般的VLAN中实施攻击的方法,这一节属于扩展内容,简单演示下Cisco特有 ...

  6. [ASP.NET MVC 大牛之路]01 - 开篇

    匆匆2014,转眼就到末尾了.在这一年,你还有哪事情些想做而没有做? 2014年在我身上发生了两件意义重大的事,一是正月初一宝宝出生,我升级成为了爸爸:二是进入了一家创业公司,成为了技术负责人. 去年 ...

  7. ASP.NET MVC 从零开始 - 请求处理

    这篇文章是从我的 github 博客 lxconan.github.io 导入的. 这是这个系列的第三篇了.前两篇文章请参见: ASP.NET MVC 从零开始 - Create and Run AS ...

  8. 自定义view(二)

    1.View 的绘制 通过继承View 并重写它的onDraw()来完成绘制. onDraw()有一个参数,就是Canvas对象.使用这个Canvas就可以绘制图像了,Canvas canvas = ...

  9. Spring(四)注解配置Ioc

    原文链接:http://www.orlion.ga/216/ 一.@Autowired beans.xml配置成如下: <?xml version="1.0" encodin ...

  10. Xdebug+ZendStudio配置

    原文链接:http://www.orlion.ga/689/ 好久之前就知道有这么个东西,但是一直没用,一直用exit().var_dump() debug,效率很低. 首先下载xdebug的dll文 ...