系列文章Redis应用-分布式锁Redis应用-异步消息队列和延迟队列Redis应用-位图Redis应用-HyperLogLogRedis应用-布隆过滤器Redis应用-限流Redis应用-Geo多进程时不在同一个系统,需要使用分布式锁来控制多个进程对资源的访问。使用redis实现分布式锁主要使用如下命令:SETNXKEYVALUE如果key不存在,则设置该字符串对应的keyvalueexpireKEYseconds设置key的过期时间delKEY删除key代码实现如下:$redis=newRedis();$redis->connect('127.0.0.1',6379);$ok=$redis->setNX($key,$value);if($ok){//得到锁……做点什么……$redis->del($key);}上面的代码有没有问题?如果我们在逻辑处理过程中出现异常情况,没有删除KEY,那么就会出现死锁。所以一般我们在拿到锁后都会给KEY加上一个过期时间。为了保证执行的原子性,我们使用multi有如下代码$redis->multi();$redis->setNX($key,$value);$redis->expire($key,$ttl);$res=$redis->exec();if($res[0]){//获取锁...做点什么...$redis->del($key);}但是还有一个问题像这样。第一次请求成功,后面的请求虽然没有拿到锁,但是每次都会刷新锁的时间。这样一来,设置锁过期时间的意义就不存在了。所以我们会在拿到锁后操作过期时间。这时候我们可以牺牲Lua脚本来进行原子操作。代码如下$script=<<
