php对redis分布锁的实现

redis锁一般用于限制对某些共享资源的同时修改,或防止同样的请求重复执行。今天就说一下php如何实现redis分布锁。

  redis锁的原理,即是set一个value,同时设置一个过期时间,如果value存在,则加锁失败。set value和设置过期时间必须是原子操作,否则如果set value刚刚成功,在还没来得及设置过期时间的时候进程崩溃了,会导致redis中设置的value一直存在,资源会被一直锁住。

php中提供了原子操作的方法,$redis->set($key, $value, ['nx', 'ex'=> $expire] ); 下面是php redis加锁的函数实现

其中token是的用处是防止误删别的线程加的锁。

如果在A线程加锁之后,过期时间设置为1s,但是由于业务代码执行时间过长,超过了1s,锁被自动释放了,这时B线程访问成功加了锁,但是A线程提前于B线程执行结束了,就会错误的删除B线程加的锁下面就是释放锁的时候对token进行判断,是否属于自己的锁,如果不属于则不删除。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容