Redis分布式锁功能在单机环境下,有闪购活动。在短时间内,服务器压力和流量会突然增加。这会产生并发问题。如果要解决并发,需要解决以下几个问题:1.提高系统吞吐率,即每秒qps处理的请求数。2、避免高并发情况下资源争用导致的超买超买问题。内存数据库通过提高系统的qps来解决第二个问题:需要使用经常遇到的锁。比如MySQL有读锁、写锁、排它锁、悲观锁、乐观锁。但是这里我们只讨论redis实现锁的简单版本。设置锁$redis=newRedis();$redis->connect('127.0.0.1',6379);//连接Redis$expire=10;//有效期为10秒$key='lock';//key$value=time()+$expire;//锁值=Unix时间戳+锁有效期$lock=$redis->setnx($key,$value);//判断是否加锁成功,如果成功则执行下一步if(!empty($lock)){//下一步...}如果能用这么一个简单版的锁解决所有问题,那就太小看锁在程序中的应用了。正常的操作例子基本都是这样写的。但是这种写法也存在一些问题。1、如果有10000个请求访问redis中不存在的key,这样的请求指的是接收MySQL数据,导致CPU短时间内达到100%甚至崩溃。这种场景通常被称为缓存崩溃导致的缓存雪崩。2.如果CPU太高或者网络延迟问题导致锁没有被删除或者缓存key过期没有被回收,就会出现死锁。解决问题:引用reidssetnx方法的作用是当设置的key不存在时,设置一个新的值。这样就避免了缓存崩溃的问题。检测key的过期时间避免死锁,解决死锁问题$expire=10;//有效期10秒$key='lock';//key$value=time()+$expire;//锁定值=Unix时间戳+锁有效期$status=true;while($status){$lock=$redis->setnx($key,$value);如果(空($lock)){$value=$redis->get($key);如果($value