redis应用场景:实现计数器-防止刷单

最近由于双11要来临,公司需要在接口请求上,做一下并发限制的处理,或者做一个防止刷单的安全拦截:
比如:一个接口请求,限制每秒请求总数为200次,超过200次就等待,等下一秒,再次请求,这里用到一个redis作为一个计数器的模式来实现。

调用redis的方法:

INCR key
将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

这是一个针对字符串的操作,因为 Redis 没有专用的整数类型,所以 key 内储存的字符串被解释为十进制 64 位有符号整数来执行 INCR 操作。
code:
redis> SET test 20
OK
redis> INCR test
(integer) 21
redis> GET test # 数字值在 Redis 中以字符串的形式保存
"21"

计数器的实现

计数器是 Redis 的原子性自增操作可实现的最直观的模式了,它的想法相当简单:每当某个操作发生时,向 Redis 发送一个 INCR 命令。

比如在一个 web 应用程序中,如果想知道用户在一年中每天的点击量,那么只要将用户 ID 以及相关的日期信息作为键,并在每次用户点击页面时,执行一次自增操作即可。

比如用户名是 peter ,点击时间是 2012 年 3 月 22 日,那么执行命令 INCR peter::2012.3.22 。

$redisKey = “api_name_” + $api;
$count = $this->redis->incr($redisKey);
if ($count == 1) {
//设置有效期一s
$this->redis->expire($redisKey,1);//设置一s的过期时间
}
if (count > 200) {//防止刷单的安全拦截
return false;//超过就返回false
}
//后续处理

这就简单的实现了redis计数器的应用,另外还有以下方法:

以下几种方式扩展这个简单的模式:

可以通过组合使用 INCR 和 EXPIRE ,来达到只在规定的生存时间内进行计数(counting)的目的。
客户端可以通过使用 GETSET 命令原子性地获取计数器的当前值并将计数器清零,更多信息请参考 GETSET 命令。
使用其他自增/自减操作,比如 DECR 和 INCRBY ,用户可以通过执行不同的操作增加或减少计数器的值,比如在游戏中的记分器就可能用到这些命令。

_____________________________________________________________________________________________
欢迎关注公众号【phper的进阶之路】,将不断更新各种技术心得,免费提供各种学习资源!!!

转载于:https://www.cnblogs.com/yaozhengqi/p/7825343.html

redis应用场景:实现简单计数器-防止刷单相关推荐

  1. 【缓存应用】谈谈redis应用场景

    关于redis应用场景总结 1.计数器相关应用场景 高并发的秒杀活动.分布式序列号的生成 限制手机短信发送数量.接口每分钟请求次数 工单号递增计数场景 可以使用redis的 incrby命令实现原子性 ...

  2. Redis应用场景-计数器

    文章目录 Redis应用场景-计数器 计数器 视频播放次数 防止刷单 限制登录失败次数 参考文档 Redis应用场景-计数器 计数器 计数器可以分为: 简单计数器,用incr就可以实现: 有有效期的计 ...

  3. redis应用场景—— 缓存,分布式锁,去重

    Redis实际应用场景 https://www.cnblogs.com/mrhgw/p/6278619.html Redis在很多方面与其他数据库解决方案不同: 它使用内存提供主存储支持,而仅使用硬盘 ...

  4. 转载:Redis 应用场景

    2019独角兽企业重金招聘Python工程师标准>>> 1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载 ...

  5. Redis应用场景汇总

    Redis作为一个非关系型数据库,除了在访问速度上拥有显著优势外,其本身支持的多种数据类型也非常有用,能覆盖系统开发中的很多应用场景.下面列举的场景有的是从网上其他人的博客里看到的,有的自己开发时尝试 ...

  6. redis 数据类型详解 以及 redis适用场景场合

    redis 数据类型详解 以及 redis适用场景场合 1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访 ...

  7. 详解 Redis 应用场景及应用实例

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...

  8. Redis 应用场景和应用实例详解

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主 ...

  9. 详解 Redis 应用场景及原理

    本文转自https://blog.csdn.net/niucsd/article/details/50966733,描述了redis实现原理和应用场景,篇幅较长,有意学习redis的同学可耐心阅读. ...

  10. redis应用场景及实例

    redis应用场景及实例 前言 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.在这篇文章中,我们将阐述 Re ...

最新文章

  1. 统计substr在母串中出现次数/删除字符串中所有空格
  2. leetcode算法题--删除排序链表中的重复元素 II
  3. SpringBatch之CompositeItemWriter详解
  4. 如何给 SAP Fiori Elements 应用的字段添加 value help
  5. rmi远程代码执行漏洞_【最新漏洞简讯】WebLogic远程代码执行漏洞 (CVE202014645)
  6. opencv计算图像亮度调节_OpenCV教程创建Trackbar图像对比度、亮度值调整
  7. 顶级程序员的心得 Coders at Work (III)
  8. 程序员面试技巧:一起去面试,公司用他而不用你,注意这三个点
  9. 运用大数据提高政协协商能力
  10. linux zookeeper开机启动
  11. Selenium 全自动化下载QQ付费音乐-说好不哭MV
  12. QIIME2进阶四_QIIME2扩增子基因序列系统发育分析
  13. [Codeforces1148C]Crazy Diamond——构造
  14. linux添加jetdirect协议,Padavan 路由器固件 不能驱动 hp1005、hp1020之类打印机 foo2zjs ZjStream协议的linux打印机驱动程序...
  15. JAVA 使用POI读取文档
  16. 制作可以用航模遥控器遥控的ESP32小车
  17. 逻辑运算是计算机实现计算器基础,第1章__计算机的发展与运算基础.ppt
  18. 传智播客php拔高_传智播客2017最新php视频课件推荐
  19. 智能卡操作(非接触CPU卡又称智能卡) 总结
  20. 易语言 json取成员数 根节点就是数组

热门文章

  1. android 设置editext只能输入数字
  2. mac 升级到mavericks 安装php扩展现问题
  3. 【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)
  4. JMeter——JMeter如何进行汉化
  5. Linux crontab 定时任务详解
  6. Swift - 高级运算符介绍
  7. 启动工程Ehcache报错
  8. EmptyRecycle() 清空回收站
  9. [转]理解JSON:3分钟课程
  10. c#使用私有构造方法