Redis实现锁

2016-05-26  本文已影响301人  crocodile_b

基于Redis单例的实现

为了后面更好的了解分布式锁的实现,我们先来看看如何基于Redis单例实现锁服务。我们可以用下面方法获得锁:


 SET resource_name my_random_value NX PX 30000

上面的命令在只有当key不存在的时候会执行成功(NX选项),同时会设置过期时间为30000ms(PX选项)。key的值会被设置为my_random_value。这个值在多个客户端和锁中必须是唯一的,我们使用random value是为了方便安全地释放锁,看看下面的脚本:

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

只有当key存在且值是预期的值的时候才会删除key。这种方式可以避免误删除其他客户端创建的锁。例如,当客户端获取锁之后执行一个很长时间的逻辑,一直过了锁的过期时间,这个时候锁会被自动释放掉,而另外一个客户端又获取了这个锁,前一个客户端终于执行完了逻辑执行,回头释放锁,删除key,其实这个时候释放的已经是另外一个客户端持有的锁了。使用DEL是不安全的,因为客户端有可能误删其他客户端持有的锁。上面脚本的方法的好处是每次获得锁的时候加上一个随机的签名,当释放锁的时候去看看是不是自己持有的锁,这个时候就不会误删。
现在我们学会了如何在Redis单例上获取锁和释放锁,那么接下来我们看看如何在Redis集群上获取锁和释放锁。

基于Redlock算法的实现

在分布式环境下,假设我们有N个master,这些节点都是独立的,因此我们没有配置复制策略。上面我们已经学会了如何在单机环境下获取锁和释放锁,我们假设的更具体一些,N=5,为了能获取锁,客户端的步骤为:

上一篇 下一篇

猜你喜欢

热点阅读