美文网首页
redis-简单分布式锁

redis-简单分布式锁

作者: GGBond_8488 | 来源:发表于2020-04-03 16:59 被阅读0次

在Redis中有一个 setnx key value命令,这个命令只能在key不存在时才能执行成功,因此,可以利用该特性构建一个分布式锁。

这里以一个秒杀系统需求下的场景来探索redis分布式锁

Version1

使用setnx object_id_1 value(随机value)获取锁,完成操作del object_id_1释放锁
这个版本问题很多,非常明显的就是,若是加锁的线程意外崩溃(并未执行释放锁操作),那么其他线程永远也无法获得该锁。
(在go中可以使用defer来收尾,确保释放锁)
但是,有很多其他情况使得无法执行到释放锁操作(服务器down机)
但是redis里该锁还是未被释放

Version2

加锁时,给其也设置一个超时时间(这里保证原子操作)。
SET object_id_1 random_value NX PX 5000
这种情况下,如果时间设置过短,低于业务真正执行时间,那么可能就会出现这样的问题,

线程1获得锁,执行业务代码,(此时锁自动过期) -- 这时线程1执行完毕释放锁
------------------------------------------此时业务2可以获得该锁,执行业务2的代码

那么这里线程1就把线程2加的锁给释放掉了,后来的更多线程都能获得锁,分布式锁直接失效

这里的问题:

1.过期时间设置问题
2.线程可以释放其他线程的锁

解决1:该线程获得锁以后,开辟一个新的线程,给锁保活,增加其过期时间。
解决2:每一个线程使用自己生成的全局唯一uuid来作为锁的value(使用LUA脚本完成这一操作,先判断当前锁的字符串是否与传入的值相等,是的话就删除Key,)

但是这里在主从模式下,主服务器down掉,setnx并未传递到从机,当从机提升为主机时
可以设置(保证从结点加锁成功才会返回成功)

若是cluster情况下,可以使用官方建议的redlock(这个好像有争议)

相关文章

  • redis-简单分布式锁

    在Redis中有一个 setnx key value命令,这个命令只能在key不存在时才能执行成功,因此,可以利用...

  • redis-分布式锁

    redis 分布式锁 重点 可冲入锁主要是通过threadlocal实现.有可能在执行dosomthing的时候,...

  • Redis-分布式锁

    分布式锁的由来 如何实现分布式锁 但是,它存在一个很大的问题,当客户端 1 拿到锁后,如果发生下面的场景,就会造成...

  • Redis-实现分布式锁

    为什么要使用分布式锁 大多数业务服务中,都是以集群的形式部署。高并发场景下对服务共享变量进行量的操作,很容易出现并...

  • Redis-简单分布式限流

    Redis-简单分布式限流 限流方式 漏斗式: 应对突发会直接溢出,拒绝服务了.令牌桶式: 应对突发会比较好,毕竟...

  • 使用redis实现分布式锁

    几种redis分布式锁实现 一、简单的分布式锁实现 利用下面的命令,实现一个带自动删除的分布式锁 编写两个lua脚...

  • Apache-Ignite入门实战之三 - 分布式锁

    在 Ignite 的分布式缓存中还有一种常见应用场景是分布式锁,利用分布式锁我们可以实现简单的集群master选举...

  • Redis-分布式缓存(三)

    前置文章:Redis-分布式缓存(一)[https://www.jianshu.com/p/85d67595e68...

  • Redis-分布式缓存(二)

    前置文章:一、Redis-分布式缓存(一)[https://www.jianshu.com/p/85d67595e...

  • 分布式锁

    为什么要用分布式锁 数据库乐观锁redis分布式锁zookeeper分布式锁 使用分布式锁的场景 实现分布式锁的方...

网友评论

      本文标题:redis-简单分布式锁

      本文链接:https://www.haomeiwen.com/subject/vlfkphtx.html