脚本宝典收集整理的这篇文章主要介绍了php 使用redis锁限制并发访问类示例,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
本文介绍了PHP 使用redis锁限制并发访问类,并详细的介绍了并发访问限制方法。
对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。
例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制的情况下,用户则可以使用同一个换领码同时兑换到多张优惠券。
伪代码如下:
if A(可以换领) B(执行换领) C(更新为已换领) D(结束)
如果用户并发提交换领码,都能通过可以换领(A)的判断,因为必须有一个执行换领(B)后,才会更新为已换领(C)。因此如果用户在有一个更新为已换领之前,有多少次请求,这些请求都可以执行成功。
使用文件锁可以实现并发访问限制,但对于分布式架构的环境,使用文件锁不能保证多台服务器的并发访问限制。
Redis是一个开源的使用ANSI c语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
本文将使用其setnx方法实现分布式锁功能。setnx即Set IT N**ot eX**ists。
当键值不存在时,插入成功(获取锁成功),如果键值已经存在,则插入失败(获取锁失败)
RedisLock.class.PHP
<PRe class="brush:PHP;">private $_config;
private $_redis;
/**
/**
// 不能<a href="https://www.js-code.COM/tag/huoqu/" target="_blank" class="keywords">获取</a>锁
if(!$is_lock){
// 判断锁是否过期
$lock_time = $this->_redis->get($key);
// 锁已过期,<a href="https://www.js-code.com/tag/shanchu/" target="_blank" class="keywords">删除</a>锁,重新<a href="https://www.js-code.com/tag/huoqu/" target="_blank" class="keywords">获取</a>
if(time()>$lock_time){
$this->unlock($key);
$is_lock = $this->_redis->setnx($key,time()+$expire);
}
}
return $is_lock? true : false;
}
/**
/**
} // class end
?>
以上是脚本宝典为你收集整理的php 使用redis锁限制并发访问类示例全部内容,希望文章能够帮你解决php 使用redis锁限制并发访问类示例所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。