Redis 做分布式锁你会几种姿势?
首先我们来看一个问题场景: 例如一个简单的用户操作,一个线程去修改用户的状态,首先从数据库中读出用户的状态,然后在内存中进行修改,修改完成后,再存回去。在单线程中,这个操作没有问题,但是在多线程中,由于读取、修改、存 这是三个操作,不是原子操作,所以在多线程中,这样会出问题。 解决这个问题,我们就需要锁,对于锁,大家应该不会陌生,在 Java 中的 synchronized 以及 ReentrantLock 可重入锁都是我们比较常见的,但是这种锁都是本地锁,现在微服务、分布式系统思想大行其道,在这样的系统中,本地锁显然是不够用的,于是大家纷纷想办法,如何在分布式环境下解决锁的问题。想出来的办法很多,我们可以通过 MySQL、可以通过 ZK、也可以通过 Redis ,都可以用来解决分布式锁的问题,这里我们主要来看看如何通过 Redis 解决分布式锁问题。 2.解决方案 2.1 整体思路 「分布式锁实现的思路很简单,就是进来一个线城先占位,当别的线城进来操作时,发现已经有人占位了,就会放弃或者稍后再试。」 在 Redis 中,占位一般使用 setnx 指令,先进来的线程先占位,线程的操作执行完成后,再调用 del 指令释放位子。同时为了防止死锁,我们一般还要给锁加一个过期时间,到期了自动释放。 基于这样的思路,我们来看两种不同的实现方式: 2.2 解决方案一
基于我们前面所说的思路,可以使用 setnx 和 expire 实现分布式锁,但是 setnx 和设置过期时间 expire 这是两个操作,这两个操作一起的话就不具备原子性(除非自己写 Lua 脚本),为了解决这个问题,从 Redis2.8 开始,setnx 和 expire (编辑:保山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |