Redis cluster eval的使用

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

对于eval 有一个很大的约束在集群模式下,即lua所用到的key必须在该节点上

因此可以借助solt来发送到指定的key存在的节点上  因此需要redis-client 正确处理 key

方法1:

    通过client显示指定key 发送到对应的节点上,lua代码不参与redis缓存 每次发送到redis的lua代码都是新的 因为把用到的东西 都封装到代码里面强了,会导致缓存泄漏问题 虽然redis文档说 不是大问题,

Redis cluster eval的使用_第1张图片

方法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(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节点,因此这也无伤大雅

转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/1923799

你可能感兴趣的:(Redis cluster eval的使用)