php redis 短信频率,发送短信: 使用Redis限制每天的发送频率和发送时间
ratelimiting.lua
--[[实现访问频率的脚本.参数:KEY[1] 用来标识同一个用户的idARGV[1] 过期时间ARGV[2] 过期时间内可以访问的次数返回值: 如果没有超过指定的频率, 则返回1; 否则返回0]]local times = .call('incr', KEYS[1])if times == 1 then-- 说明刚创建, 设置生存时间redis.call('expire', KEYS[1], ARGV[1])endif times > tonumber(ARGV[2]) thenreturn 0endreturn 1
该脚本也更加直观:
Redis网站上有很多Redis. 这里我们使用Jedis.
让我们看一下代码. 该程序中的ClassPathResource和FileCopyUtils类是Spring中的类,因此此处的示例程序取决于Spring
RateLimit.java
public class RateLimit {private JedisPool jedisPool;private String script;// 省略了构造方法public void init() throws Exception {ClassPathResource resource = new ClassPathResource("script/ratelimiting.lua");script = FileCopyUtils.copyToString(new EncodedResource(resource, "UTF-8").getReader());}/*** 提供限制速率的功能** @param key 关键字* @param expireTime 过期时间* @param count 在过期时间内可以访问的次数* @return 没有超过指定次数则返回true, 否则返回false*/public boolean isExceedRate(String key, long expireTime, int count) {List params = new ArrayList<>();params.add(Long.toString(expireTime));params.add(Integer.toString(count));try(Jedis jedis = jedisPool.getResource()) {List keys = new ArrayList<>(1);keys.add(key);Long canSend = (Long) jedis.eval(script, keys, params);return canSend == 0;}}}
此处init方法的作用是读取我们刚刚写入脚本变量中的脚本以供以后使用.
isExceedRate方法将关键字和参数(到期时间和传输次数)封装到List中,然后使用Jedis调用脚本. 获取返回值并确定频率是否太高.
下面,我们使用上述代码完成限制发送频率的功能(有关某些接口和类的声明,请参阅“发送SMS限制发送频率”). 限制每日传输次数的代码基本相同短信网页版,因此我不会在此处发布,请下载源代码以查看.
FrequencyFilter
public class FrequencyFilter implements SmsFilter {private static final String KEY_PREFIX = "rate.frequency.limiting:";private RateLimit rateLimit;private int sendInterval;// 省略了部分代码@Overridepublic void filter(Sms sms) throws FrequentlyException {if(rateLimit.isExceedRate(KEY_PREFIX+sms.getMobile(), sendInterval, 1)|| rateLimit.isExceedRate(KEY_PREFIX+sms.getIp(), sendInterval, 1)){throw new FrequentlyException("发送短信过于频繁");}}}
至此,我们的主要代码已完成,可以看到使用Redis之后该代码确实非常简单.
因为我还没有性能测试,所以我只是使用了for循环来测试性能. 尽管它可能不太准确,但也具有一定的置信度. 当限制发送频率时,使用ConcurrentMap的性能会更高. ,该比率似乎不小,但是由于基数不大短信网页版,因此不需要花费很多时间(100,000条记录仅花费了15秒). 但是,当限制发送天数时,还剩下n个以上的时间. 总体而言,仅使用Redis可以节省更多时间和精力. 此外,个人猜测,当扩展到集群时,应该更容易使用Redis.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-254787-1.html
php redis 短信频率,发送短信: 使用Redis限制每天的发送频率和发送时间相关推荐
- php使用redis的批量发送短信
1.首先将需要发送信息的手机号存入redis缓存 $redis = new \redis();$conn = $redis->connect('localhost', 6379);$auth = ...
- php redis消息订阅与发布_PHP使用Redis实现订阅发布与批量发送短信
原标题:PHP使用Redis实现订阅发布与批量发送短信 1 什么是redis订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.直接点, ...
- SpringCloud集成发送短信--容联云通讯--Redis
SpringCloud集成–容联云通讯–Redis 发送短信微服务 项目结构 配置文件 pom.xml <?xml version="1.0" encoding=" ...
- tp6框架结合阿里短信接口发送短信并记录redis
tp6框架结合阿里短信接口发送短信并记录redis 1> 开通阿里云短信服务 2> 安装redis服务 3>config配置文件 创建sms.php 文件,配置阿里云短信信息 ret ...
- 手机异步发送短信验证码解决方案-Celery+redis
Celery介绍和使用 一.Celery介绍: 一个简单.灵活且可靠.处理大量消息的分布式系统,可以在一台或者多台机器上运行. Celery是一个功能完备即插即用的任务队列 单个 Celery 进程每 ...
- java 限制发送频率_java发送短信如何限制发送频率例子代码
本篇文章主要是详细介绍了java发送短信系列之怎么限制发送频率示例解析,在此为大家介绍一下怎么样限制向同一个用户(根据手机号和ip)发送短信的频率. 1.使用session 要是web程序那在sess ...
- Springboot+Redis接入腾讯云短信服务实现验证码发送
目录 一.开通腾讯云短信服务 二.代码实现 三.测试 申请阿里云短信服务需要以上线APP或已备案网站,腾讯云短信服务可以使用微信公众号申请,注册个人微信公众号比较方便,改用腾讯云短信服务,参考官方SD ...
- java 限制发送频率_java发送短信系列之限制日发送次数
在前两篇文章中, 我们实现了同步/异步发送短信以及限制发送短信频率.这一篇, 我们介绍一下限制每日向同一个用户(根据手机号和ip判断)发送短信的次数 1.数据表结构 由于需要记录整天的发送记录, 因此 ...
- Java短信频率_java发送短信系列之限制发送频率
本篇是发送短信的第二部分, 这里我们介绍一下如何限制向同一个用户(根据手机号和ip)发送短信的频率. 1.使用session 如果是web程序, 那么在session中记录上次发送的时间也可以, 但是 ...
最新文章
- Intellij Idea生成serialVersionUID的方法
- 项目管理中的组织计划
- 编译原理中LL(1)分析程序的设计---用c++程序语言实现
- C语言自学《三》---- 条件判断
- 企业架构研究总结(24)——TOGAF架构开发方法(ADM)之机会及解决方案阶段
- java死锁怎么用jvm调试_性能测试之JVM的故障排查-死锁
- 深度学习三十年创新路
- 安卓干货——安卓NFC通信
- 微信小程序:计算器(附源码)
- 实现div半透明效果
- NameNode故障处理之数据恢复
- 桌面IE图标删不掉解决方案
- NFT Insider #38:YGG旗下YGG SEA融资1500万美元,耐克收购虚拟时尚品牌RTFKT
- P2P追债也用上大数据
- Apple Watch使用指南:所有Apple Watch图标和符号含义
- mac系统怎么制作装系统的u盘?苹果电脑u盘启动盘制作教程
- 打印出js对象里面的内容
- GDOC CEO Musk Shing出席“链接未来”区块链全球人才交流会
- 智能优化算法——粒子群算法原理(附代码)
- 论文笔记 | Learning Deep Features for Discriminative Localization