对于eval 有一个很大的约束在集群模式下,即lua所用到的key必须在该节点上
因此可以借助solt来发送到指定的key存在的节点上 因此需要redis-client 正确处理 key
方法1:
通过client显示指定key 发送到对应的节点上,lua代码不参与redis缓存 每次发送到redis的lua代码都是新的 因为把用到的东西 都封装到代码里面强了,会导致缓存泄漏问题 虽然redis文档说 不是大问题,
方法2:改进方法1 合理的运用redis的lua缓存机制,因为方法1对于redis的lua语义是相悖的,应该是 对于可变化的值 通过 ARGV参数来传递 使得发送给redis的每个脚本代码 产生的sha1都是一样的,因此
//带有 1 个argv 版本
void CommandEval0_1(const string& sKey, const string & script, const string & argv1, const LuaRef& luaReplyCb)
{
LuaRef luaReplyCb2 = luaReplyCb;
auto replyCb = ToFunction<CRedis::ReplyCb>(luaReplyCb2);
GetRedis().CommandF(sKey, replyCb, "eval %s 0 %s", script.c_str(), argv1.c_str());
}
-- 玩家修改名字
t.player_modify_name = [[
local key = 'player_name_' .. ARGV[1];
if redis.call('exists',key) == 0 then
local ret = redis.call('set',key,ARGV[2]);
if ret and ret.ok and ret.ok == "OK" then
return "ok";
else
return "error";
end
else
return "exists";
end]];
方法2,其实也没严格按照redis scripting规范 来 带入 key ,但是由于redis-client 保证了 把脚本发送给key的redis节点,因此这也无伤大雅