Redis单线程执行指令,利用redis.eval方法执行lua脚本的原子性很容易实现。
use namespace\Redis;
function get_lock($cache_key, $cache_value, $expire_time)
{
return Redis::set($cache_key, $cache_value, 'EX', $expire_time, 'NX');
}
function release_lock($cache_key, $cache_value)
{
$lua = <<<EOF
if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]); else return 0; end
EOF;
return Redis::eval($lua, 1, $cache_key, $cache_value);
}