Перед реализацией скрипта Lua я читал хэши в цикле и иногда получал ошибку соединения.
Чтобы уменьшить сетевые вызовы, я пробовал скрипт Lua (ниже), он работает
local result = {}
local ruletypes = @RuleTypes
local assetId = @AssetId
for rule in ruletypes:gmatch("([^,]+)") do
local ruleType = rule..'_hash'
local val = redis.call('HGET', ruleType, assetId)
result[#result + 1] = val
end
return result
C # CacheService для выполнения сценария Lua
public class CacheService
{
private readonly IDatabase cache;
private static readonly string connectionString = ConfigurationManager.AppSettings["RedisConnection"];
private static LoadedLuaScript ruleLuaScript;
public CacheService()
{
this.cache = Connection.GetDatabase();
ruleLuaScript = LoadLuaScriptForGetRule(@"Lua/getMultiHashWithParameter.lua");
}
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect(connectionString);
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
private LoadedLuaScript LoadLuaScriptForGetRule(string scriptUrl)
{
string script = File.ReadAllText(scriptUrl);
LuaScript luaScript = LuaScript.Prepare(script);
var endpoints = Connection.GetEndPoints();
var endpoint = endpoints[0];
IServer server = Connection.GetServer(endpoint);
return luaScript.Load(server);
}
public void PrepareLuaScript(dynamic parameters)
{
RedisResult result = this.cache.ScriptEvaluate(ruleLuaScript, parameters);
if (!result.IsNull)
{
//how to read result?
}
}
}
Вывод LuaScript
Вопросы
Я не уверен, это правильный способ регистрации Lua Script?
Какполучить данные JSON от RedisResult?Есть ли какое-нибудь общее решение?