只有累積,沒有奇蹟

2019年2月26日 星期二

[.NET] StackExchange.Redis.RedisServerException : 'ERR Error compiling script'

問題 
這幾天在對新專案做 POC,開始對 Redis Server 新增資料做測試,有個 Test Case 在使用 Lua script 新增多筆資料到 Redis Server 時候發生錯誤,錯誤訊息為  "StackExchange.Redis.RedisServerException: 'ERR Error compiling script (new function): user_script:1: function or expression too complex near ''insert script'' ' " ,這篇就針對此案例作簡單紀錄與分享若是有不清楚或是錯誤的地方歡迎討論予糾正

解決方法 
首先先看一下案發現場的 code 如下
  1. private static void InsertBy_LuaScript(IEnumerable<string> input)
  2. {
  3. var insertValues = String.Join(",", input.Select(o => $"'{o}'"));
  4. string luaScript = $"redis.call('rpush', 'Luascript', {insertValues})";
  5.  
  6. var prepared = LuaScript.Prepare(luaScript);
  7. RedisConnection.GetDatabase().ScriptEvaluate(prepared);
  8. }
針對 function 所傳遞進來的集合做字串相加,最後在將所有相加後的字串當作 redis.call 的參數,舉例輸入集合為 test01、test02、test03,其變數 luaScript 結果 redis.call('rpush','Luascript','test01', 'test02', 'test03') ,最後將此 script 傳入 LuaScript.Prepare API 執行;此語法在測試數量少的時候正常,但後期逐漸地把測試筆數加到 300 筆時,就會產生執行失敗跳出下列錯誤訊息
經 debug 後發現異常時其 lua script 輸出如下
  1. redis.call('rpush', 'Luascript', '0','1','2'...'299')
該 script 當遇到新增筆數量大時,就會變成參數過度擴增的狀況,有可能是因為 redis.call 支援不了這麼多參數,且用此段語法在 lua script online 進行測試也是 compiler error,因此心中判定此種寫法失格出局,改良後的寫法如下
  1. private static void InsertBy_LuaScript(IEnumerable<string> input)
  2. {
  3. StringBuilder sb = new StringBuilder();
  4. foreach (var item in input)
  5. {
  6. sb.AppendLine($"redis.call('rpush', 'Luascript', {item})");
  7. }
  8.  
  9. var prepared = LuaScript.Prepare(sb.ToString());
  10. RedisConnection.GetDatabase().ScriptEvaluate(prepared);
  11. }
使用 stringBuilder 將輸入集合內容匯總為字串,每筆輸出都單獨定義其 redis.call 其設定值參數,改完後測試筆數可超越原本的限制 300 筆,測試 10000 筆資料也沒問題,宣告結案打完收工 

心得
對於 lua script 不熟悉因此踩到這基本的雷,但轉個念頭想也是因為自己因為對於基本語法不熟悉,才會造成錯誤的使用,也提醒下次遇到類似情況時可以先搞清楚觀念,或許很多雷就不會在踩到

Related Posts:

  • [Chocolatey] Windows 套件管理工具 - Chocolatey 初體驗前言  之前在外面上課時就聽過講師介紹 chocolatey 套件管理工具,但當時趕專案上線就沒有再深入研究,直到最近要在公司筆電安裝軟體才想起 Windows 有此神奇的套件管理神器,今天就針對此神器筆記安裝與功能介紹,避免初老症狀病發還要再次請教 google 大神。  Chocolatey 是什麼 可以吃嗎 ? 在過去在 Windows 安裝軟體應用程式時,需要下載安裝檔與使用其軟體安裝流程步驟等各種 GUI 介面… Read More
  • [Nuget] The term 'nuget.exe' is not recognized as the name of a cmdlet, function, script file, or operable program問題  最接開發完 Libary 專案要上傳到 nuget server 時,要將 package 檔案透過指令 push 噴 error 錯誤訊息 nuget.exe : The term 'nuget.exe' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the … Read More
  • [Nuget] 架設公司內部 Nuget Server 前言  在開發上常常會遇到某些代碼是跨專案共用的,在 .NET 中會將重複使用的代碼打包成「套件」,其中包含了編譯後的 dll 以及相關的檔案資訊,接著將套件內容上傳到 Nuget Server 上提供開發者下載使用,Nuget server 有分共用與私人主機兩種,共用的 nuget server 上有相當多好用的 libary 供開發者下載,例如常用的 NLog、newtonsoft.json、NUnit...等各種好用的 pack… Read More
  • [Chocolatey] 設定 Package 安裝路徑問題  在前一篇介紹 Chocolatey 使用初體驗,文章最後 demo 下載 Winrar 軟體顯示其強大威力,當使用過 Chocolatey 下載 package 後預設路徑是在 C 槽底下,由於個人習慣安裝與下載資料夾都在另外的 D 槽環境,今天要分享的是如何修改 chocolatey 預設下載路徑的設定方式。  設定安裝路徑 Chocolatey 預設下載路徑為 C:\Users\… Read More
  • [Nuget] 使用 NuGet Package Explorer 製作 Nuget 套件問題  在上一篇介紹了如何架設公司內部 nuger server,架設完畢後會使用 nuget push 指令將開發完 Library 上傳到公司內部 nuget server 上,但每次都要透過手動打指令 push 難道沒有更快的方法了嗎 ? 今天就要來介紹一套好用的工具 Nuget Package Explorer 可以省去打指令的動作,透過 GUI 的介面將開發好的 Library 上傳到共用或是私人架設的 nuget … Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com