StackExchange.Redis載入Lua腳本進行模糊查詢的批量刪除和修改

来源:http://www.cnblogs.com/skig/archive/2016/12/15/redis-lua-batch.html
-Advertisement-
Play Games

前言 使用StackExchange.Redis沒有直接相關的方法進行模糊查詢的批量刪除和修改操作,雖然可以通過Scan相關的方法進行模糊查詢,例如:HashScan("hashkey", "*key*"),然後再使用相關的方法進行相關的批量操作,但是如果緩存數據量比較大,效率低下,那麼可以使用Lu ...


前言

使用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 腳本進行求值。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...