Loading

& Redis实现分布式锁

Redis 实现分布式锁

1. 概述

  • 分布式锁是一种思想,他的实现方式有很多种,但是大体步骤一致。
    • 加锁
    • 解锁
    • 锁超时(避免死锁)
  • 分布式锁实现方式
    • 数据库
    • redis
    • zookeeper

/**

  • 使用redis分布式锁需要注意一下3点
  • 1.设置lock的key值(value) 必须是uuid(其他也可以 但是需保证唯一且随机)
    • 2.设置lock的key必须超时时间 时间一到 自动清除key 防止出现一直占用锁 出现死锁 expire
    • 3.保证原子性 lua
    • 缺点 超时掌握不好 代码需要执行5秒 5+ 2倍到3倍
      */

2. 单节点Redis实现分布式锁

2.1 加锁

加锁实际上就是在redis中,给Key键设置一个值,为避免死锁,并给定一个过期时间。
SET lock_key random_value NX PX 5000
值得注意的是:
random_value 是客户端生成的唯一的字符串。
NX 代表只在键不存在时,才对键进行设置操作。
PX 5000 设置键的过期时间为5000毫秒。
这样,如果上面的命令执行成功,则证明客户端获取到了锁。

2.2 解锁

解锁的过程就是将Key键删除。但也不能乱删,不能说客户端1的请求将客户端2的锁给删除掉。这时候random_value的作用就体现出来。

为了保证解锁操作的原子性,我们用LUA脚本完成这一操作。先判断当前锁的字符串是否与传入的值相等,是的话就删除Key,解锁成功。

lua脚本操作redis 实现删除key(保证原子性)

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

2.3 代码实现

posted @ 2021-07-04 15:10  yescctv6  阅读(66)  评论(0编辑  收藏  举报