zoukankan      html  css  js  c++  java
  • & 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 代码实现

  • 相关阅读:
    Git实战(二)原理

    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现蓝桥杯 历届试题 k倍区间
    Java实现蓝桥杯 历届试题 k倍区间
    Java实现蓝桥杯 历届试题 k倍区间
  • 原文地址:https://www.cnblogs.com/doagain/p/14969021.html
Copyright © 2011-2022 走看看