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进行判断,是否属于自己的锁,如果不属于则不删除。