C# 使用 Redis Script

Posted by Max Lin on 2022-07-25

先前大致有紀錄 基礎 LuaScript 語法Docker 佈署 Redis 以及 Redis 腳本,接下來紀錄一下 C# 與 Redis 腳本串接方式。

連線:

  1. var connString = "localhost:6379";
  2. // 建立連線
  3. ConnectionMultiplexer conn = ConnectionMultiplexer.Connect(connString);
  4. // 取得 redis server 實體
  5. IServer redisServer = conn.GetServer(connString);

建立資料:

  1. var createScript = @"
  2. local key = KEYS[1]
  3. local id = ARGV[1]
  4. local name = ARGV[2]
  5. local phone = ARGV[3]
  6. return redis.call('HSET', key, 'Id', id, 'Name', name, 'Phone', phone)"; // do redis command
  7. // 載入至 server
  8. var loadedScript = await LuaScript.Prepare(createScript).LoadAsync(redisServer);
  9. // 宣告入參
  10. var keys = new RedisKey[] { "Profile:Max" };
  11. var values = new RedisValue[] { "A128996644", "Max Lin", "3345678" };
  12. // 執行腳本
  13. await conn.GetDatabase().ScriptEvaluateAsync(loadedScript.Hash, keys, values);

查看:

取得資料:

  1. var getScript = @"
  2. local key = KEYS[1]
  3. return redis.call('HVALS', key)";
  4. // 載入至 server
  5. var loadedScript = await LuaScript.Prepare(getScript).LoadAsync(redisServer);
  6. // 執行腳本
  7. var result = (string[])await conn.GetDatabase().ScriptEvaluateAsync(loadedScript.Hash, new RedisKey[] { "Profile:Max" });
  8. var profile = result.Length == 0 ? null : new Profile
  9. {
  10. Id = result[0],
  11. Name = result[1],
  12. Phone = int.Parse(result[2])
  13. };
  14. Console.WriteLine("Profile: ");
  15. Console.WriteLine(profile.Id);
  16. Console.WriteLine(profile.Name);
  17. Console.WriteLine(profile.Phone);
  18. Console.ReadKey();

補充

在使用 lua script 執行 redis command 時,分別有兩種方式:

  • redis.call
  • redis.pcall

兩者差別主要在於錯誤處理方式,在調用 redis.call 時出現錯誤,則會將錯誤向上拋出,而 redis.pcall 則會將錯誤 catch 並回傳一個錯誤訊息。