Redis优雅实现分布式锁
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。 在实际项目开发中经常会遇到这样一个业务场景:如果同一台机器有多个线程抢夺同一个共享资源,同一个线程多次执行会出现异常,这种情况下就会出现非线程安全。我们解决方法通常使用锁来解决。但是如果有多台机器呢?这时候我们通常使用分布式锁来解决分布式环境下共享资源的同步问题。实现分布式锁常见有Redis,zookeeper等,今天主要就是讲讲如何使用Redis实现分布式锁。 使用Redis实现分布式锁的方案其实很简单,首先我们先实现一个方案一:每次执行请求的时候,机器先查询Redis中是否存在分布式锁的key,如果不存在锁的key,就以该锁为key,value取随机数写入到Redis中,然后开始执行请求。 方案一看起来很简单,但是这样的处理逻辑不可避免的存在两个致命的BUG:第一:如果一个进程成功取到锁,但是这时候这个机器出现故障宕机了,分布式的锁没有得到释放,就造成了死锁的产生了。第二:如果同一时间存在两个机器同时查询Redis,都发现Redis不存在锁的key,于是都成功获得了锁。 这时候我们可以这么处理改善方案一实现方案二:Redis有提供一个原子写入操作的命令:setnx,setnx只有在锁的key不存在的情况下才允许设置key值