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限制每天的发送频率和发送时间相关推荐

  1. php使用redis的批量发送短信

    1.首先将需要发送信息的手机号存入redis缓存 $redis = new \redis();$conn = $redis->connect('localhost', 6379);$auth = ...

  2. php redis消息订阅与发布_PHP使用Redis实现订阅发布与批量发送短信

    原标题:PHP使用Redis实现订阅发布与批量发送短信 1 什么是redis订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.直接点, ...

  3. SpringCloud集成发送短信--容联云通讯--Redis

    SpringCloud集成–容联云通讯–Redis 发送短信微服务 项目结构 配置文件 pom.xml <?xml version="1.0" encoding=" ...

  4. tp6框架结合阿里短信接口发送短信并记录redis

    tp6框架结合阿里短信接口发送短信并记录redis 1> 开通阿里云短信服务 2> 安装redis服务 3>config配置文件 创建sms.php 文件,配置阿里云短信信息 ret ...

  5. 手机异步发送短信验证码解决方案-Celery+redis

    Celery介绍和使用 一.Celery介绍: 一个简单.灵活且可靠.处理大量消息的分布式系统,可以在一台或者多台机器上运行. Celery是一个功能完备即插即用的任务队列 单个 Celery 进程每 ...

  6. java 限制发送频率_java发送短信如何限制发送频率例子代码

    本篇文章主要是详细介绍了java发送短信系列之怎么限制发送频率示例解析,在此为大家介绍一下怎么样限制向同一个用户(根据手机号和ip)发送短信的频率. 1.使用session 要是web程序那在sess ...

  7. Springboot+Redis接入腾讯云短信服务实现验证码发送

    目录 一.开通腾讯云短信服务 二.代码实现 三.测试 申请阿里云短信服务需要以上线APP或已备案网站,腾讯云短信服务可以使用微信公众号申请,注册个人微信公众号比较方便,改用腾讯云短信服务,参考官方SD ...

  8. java 限制发送频率_java发送短信系列之限制日发送次数

    在前两篇文章中, 我们实现了同步/异步发送短信以及限制发送短信频率.这一篇, 我们介绍一下限制每日向同一个用户(根据手机号和ip判断)发送短信的次数 1.数据表结构 由于需要记录整天的发送记录, 因此 ...

  9. Java短信频率_java发送短信系列之限制发送频率

    本篇是发送短信的第二部分, 这里我们介绍一下如何限制向同一个用户(根据手机号和ip)发送短信的频率. 1.使用session 如果是web程序, 那么在session中记录上次发送的时间也可以, 但是 ...

最新文章

  1. Intellij Idea生成serialVersionUID的方法
  2. 项目管理中的组织计划
  3. 编译原理中LL(1)分析程序的设计---用c++程序语言实现
  4. C语言自学《三》---- 条件判断
  5. 企业架构研究总结(24)——TOGAF架构开发方法(ADM)之机会及解决方案阶段
  6. java死锁怎么用jvm调试_性能测试之JVM的故障排查-死锁
  7. 深度学习三十年创新路
  8. 安卓干货——安卓NFC通信
  9. 微信小程序:计算器(附源码)
  10. 实现div半透明效果
  11. NameNode故障处理之数据恢复
  12. 桌面IE图标删不掉解决方案
  13. NFT Insider #38:YGG旗下YGG SEA融资1500万美元,耐克收购虚拟时尚品牌RTFKT
  14. P2P追债也用上大数据
  15. Apple Watch使用指南:所有Apple Watch图标和符号含义
  16. mac系统怎么制作装系统的u盘?苹果电脑u盘启动盘制作教程
  17. 打印出js对象里面的内容
  18. GDOC CEO Musk Shing出席“链接未来”区块链全球人才交流会
  19. 智能优化算法——粒子群算法原理(附代码)
  20. 论文笔记 | Learning Deep Features for Discriminative Localization

热门文章

  1. 计算机视觉顶级会议与期刊
  2. 基于物联网的智能家居控制系统【100010619】
  3. OpenFOAMGmshCFD圆柱绕流(两个圆柱)
  4. AMD兼容好的matlab,是不是AMD的CPU不适合MATLAB?
  5. 无线传屏显示无法连接服务器,无线传屏,无线精彩
  6. 动态规划之 铺砖问题
  7. GimbalLock万向节锁、 欧拉角坐标旋转、 四元数旋转
  8. 爱因斯坦设计师AI支持大规模个性化设计
  9. 居民小区物业电能收费系统
  10. iPhone 14或成史上销量最差机型;腾讯首次发布《全真互联白皮书》;GNOME 43发布|极客头条...