背景说明
在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存。这时就需要对资源加锁。实现锁的方式有很多,比如数据库锁、文件锁等等。本文简单介绍PHP中使用redis来实现加锁和解锁。实现方式参考了redis官方文档。
示例代码
代码环境:单redis实例,PHP5.6及以上,且需开启redis扩展
$redis = new \Redis();
$redis->connect('127.0.0.1');
$lockKey = 'lock_key';
$randValue = rand(10000, 99999);
//lock
$lock = $redis->set($lockKey, $randValue, ['NX', 'EX'=>1]);
if($lock) {
//do something
//unlock
$script = '
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
';
$redis->eval($script, [$lockKey, $randValue], 1);
}
代码说明
这段代码会在资源未被锁定(NX选项)时获取锁,同时设定了1s的过期时间(EX)选项,可在代码出错或超时情况下自动释放锁。值被设定为一个随机数,且执行lua脚本来解锁,就不会误释放其它用户加的锁。
更多参考:
https://www.php.cn/redis/452685.html
https://learnku.com/articles/4211/unlock-the-correct-position-of-the-redis-lock
本文介绍了在PHP中如何利用Redis实现资源的加锁和解锁操作,以确保在并发环境下如商品秒杀时的安全库存扣减。通过设置NX和EX选项,可以保证锁的独占性和自动释放。在解锁时,使用lua脚本避免了误释放他人锁的问题。
3081

被折叠的 条评论
为什么被折叠?



