PHP进阶与redis锁限制并发访问功能示例
2023-06-13 09:12:23 时间
框架Yii2 1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。
例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制的情况下,用户则可以使用同一个换领码同时兑换到多张优惠券。 伪代码如下:
if A(可以换领)
B(执行换领)
C(更新为已换领)
D(结束)
如果用户并发提交换领码,都能通过可以换领(A)的判断,因为必须有一个执行换领(B)后,才会更新为已换领(C)。
因此如果用户在有一个更新为已换领之前,有多少次请求,这些请求都可以执行成功。?
<?php
/**
* Created by ZhengNiu.
* User: 77103
* Date: 2019/3/28
* Time: 9:38
*/
namespace app\helper;
use Yii;
class RedisLock
{
private $_redis;
private $key;
private $expire;
/**
* 初始化redis
*
* RedisLock constructor.
* @param string $key 锁标识
* @param int $expire 锁过期时间
*/
public function __construct($key, $expire = 5)
{
try{
$this->_redis = Yii::$app->redis;
$this->key = $key;
$this->expire = $expire;
}catch (\Exception $ex) {
return new \Exception($ex->getMessage());
}
}
/**
* 获取锁
*
* @return bool
*/
public function lock()
{
//不存在则返回1,存在返回0
$is_lock = $this->_redis->setnx($this->key, time() + $this->expire);
// 不能获取锁
if (!$is_lock) {
// 判断锁是否过期
$lock_time = $this->_redis->get($this->key);
// 锁已过期,删除锁,重新获取
if (time() > $lock_time) {
$this->unlock($this->key);
$is_lock = $this->_redis->setnx($this->key, time() + $this->expire);
}
}
return $is_lock ? true : false;
}
/**
* 释放锁
*
* @return Boolean
*/
public function unlock()
{
return $this->_redis->del($this->key);
}
}
调用:
<?php
/**
* 锁机制
*/
public function actionLock()
{
$this->layout = false;
$oRedisLock = new RedisLock('test2', 10);// 创建redislock对象
$is_lock = $oRedisLock->lock();
if ($is_lock) {
echo 'get lock success</br>';
//业务逻辑start
sleep(5);
//业务逻辑end
$oRedisLock->unlock();
} else {
echo 'request too frequently</br>';
}
}
测试结果:打开两个浏览器 先访问的浏览器
get lock success
do sth..
success
后者:
request too frequently
相关文章
- 带你一步步用php实现redis分布式、高并发库存问题
- ChatGPT 修得了别人的 Bug,修不了自己的!OpenAI 直指开源数据库 Redis 漏了底
- 极速提升:Redis秒杀集群之高并发设计(redis高并发设计)
- 收容所Redis搭建微博收容所,收容百万网民(redis微博)
- PHP如何关闭MySQL数据库连接(php关闭mysql连接)
- 慕课网Redis视频教程学习Redis必不可少(慕课网redis视频下载)
- 解决Redis高并发的智慧之路(怎么解决redis高并发)
- 提升性能除了Redis,还有哪些缓存技术(缓存技术除了redis)
- 清空Redis缓存 快速执行步骤(清除redis缓存目录)
- 新版本Redis极大提升性能(新版本redis)
- 性优化Redis,提高并发能力(提升redis并发)
- 一台Redis服务器实现瞬时并发量超高(一台redis并发量)
- TP51与Redis的创新结合(tp5.1启动redis)
- 储设置过期时间Redis如何设置缓存有效期(如何给redis存)
- Redis管理如何有效防止并发问题(如何用redis防止并发)
- 多线程并发调用Redis遭遇的阻塞(多线程调用redis阻塞)
- 为提高性能,多服务器集群搭建Redis(多服务器 redis)
- 一个Redis管理多个网站数据(多个网站用一个redis)
- 精通Redis默认数据库名解读(redis默认数据库名)
- 利用Redis提升高并发场景性能(redis高并发场景设计)
- Redis秒杀火热高并发售票(redis高并发售票)
- 使用Redis解决验证码并发问题(redis验证码并发问题)
- Redis队列快速传递,数据瞬间更新(redis 队列速度)
- Redis队列高效率解决高并发问题(redis队列解决高并发)
- 利用Redis锁脚本解决并发问题(redis锁脚本)
- 强悍的表现PHP与Redis的连接(redis链接php)
- 本地Redis搭建登录认证方案实践(redis配置本地登录)