基于predis高并发情况下实现频率控制的函数
2024-10-22 04:48:45
/**
* 频率控制函数
* @param string $product 保持唯一
* @param string $key 限制频率的维度 比如uid
* @param int $millisecond 毫秒间隔内只可以访问1次
* @return bool true-可以正常访问 false-命中频率控制
*/
function controlRate($product, $key, $millisecond) {
if (empty($product) || empty($key) || !is_int($millisecond) || $millisecond <= 0) {
return true;
} $millTime = intval(microtime(true) * 1000);
$key = sprintf('ctrl_%s_%s', $product, $key); $redis = new Redis();
$redis->connect('redis');
$redis->auth('123456'); $lastTimeRes = $redis->get($key);
if ($lastTimeRes === false) {
$addRes = $redis->setNx($key, $millTime);
// 此处有设置失败的风险
$redis->expire($key, 86400);
return $addRes;
} // 若存在 则比对现在的时间 若频率超过x毫秒 则提示过于频繁
$nowTime = $millTime;
if ($nowTime - intval($lastTimeRes) < $millisecond) {
return false;
} // 记录最新时间
return $redis->setEx($key, 86400, $millTime);
}
最新文章
- 比较两个数据库表table结构不同之处
- SharePoint 2013 开发——其他社交功能
- 剑指架构师系列-tomcat6通过伪异步实现connector
- 20145317彭垚《Java程序设计》实验二
- sdutoj 2154 Shopping
- HDU 4833 Best Financing(DP)(2014年百度之星程序设计大赛 - 初赛(第二轮))
- java web每天定时执行任务(四步轻松搞定)
- ABP领域层——仓储(Repositories)
- Cocos2d-x 2.3.3版本 FlappyBird
- js小知识-replace的回调函数
- 聊聊真实的 Android TV 开发技术栈
- C# 动态生成word文档
- day09 函数学习
- elastic-job详解(一):数据分片
- Object 标签遮挡 Div 显示
- 20165304《Java程序设计》第九周学习总结
- 数据库设计和ER模型-------之关系模型的基本概念(第二章)
- drools 的一个小demo
- linux,强大的history命令
- 关于Unity中的transform组件(二)