php redis incr过期时间,Redis 利用 incr 和 expire 来限流, 并发导致过期时间失效问题...
当某一个接口需要限流时,可以采用redis的incr来递增,记录访问次数, 以及 expire 来设置失效时间.
大概的代码如下:
r = redis.Redis.connect()
key = "linyk3"
query_times = redis.Redis.get_data(r, key)
if query_times and int(query_times) > 1000:
print('访问次数过多,超过1000次限制!')
return
else:
redis.Redis.incr(r, key)
if redis.Redis.get_data(r, key) == 1:
redis.Redis.expire_data(r, key, 60*60)
因为redis的incr操作,当key不存在时, 会生成这个key并将值初始化为0, 并且默认设置key的有效时间为长期.
这样上面的代码就基本可以限制住访问次数,并在1小时内失效,允许重新访问.
但是在高并发的情况下,当某进程查询key不存在,所以执行了上面的incr后,会将值初始化为0,
假如进程1执行了incr, 将key对应的值递增为1,这时在进程1执行 if redis.Redis.get_data(r, key) == 1: 判断前, 进程2也执行了incr,这时key对应的值就会被递增为2, 然后进程1在判断 if redis.Redis.get_data(r, key) == 1: 会发现2 !=1, 所有不会设置过期时间,这样这个访问就会一直被拒绝了.
解决方法:
当获取key为None时, 创建key,并直接设置失效时间:
r = redis.Redis.connect()
key = "linyk3"
query_times = redis.Redis.get_data(r, key)
if not query_times:
redis.Redis.incr(r, key)
redis.Redis.expire_data(r, key, 60 * 60)
elif int(query_times) > 1000:
print('访问次数过多,超过1000次限制!')
return
else:
redis.Redis.incr(r, key)
php redis incr过期时间,Redis 利用 incr 和 expire 来限流, 并发导致过期时间失效问题...相关推荐
- Redis(六)——限流算法:滑动时间窗口限流和漏斗限流
本文主要总结自<redis深度历险> 限流的意义 限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子.限流可以保证系 ...
- redis获取存在的键值_Redis 分布式锁、限流
谈及分布式系统的时候,很多企业都会使用到分布式锁,分布式锁的实现方案目前主要是存在两种,redis实现和zookeeper实现. redis实现方案是多个线程相互竞争,在redis的某一个节点内创建一 ...
- 单个接口添加超时时间_SpringBoot使用Guava令牌桶对接口限流
pom.xml引入jar包 com.google.guava guava 29.0-jre 代码 @RestControllerpublic class HelloController { //创建令 ...
- 基于Redis的分布式限流详解
前言 Redis除了能用作缓存外,还有很多其他用途,比如分布式锁,分布式限流,分布式唯一主键等,本文将和大家分享下基于Redis分布式限流的各种实现方案. 一.为什么需要限流 用最简单的话来说:外部请 ...
- Redis实现分布式限流(学习笔记
Redis实现分布式限流(学习笔记2022.07.09) 前言: 以下实现都是基于: spring-boot-starter-web + spring-boot-starter-data-redis ...
- Redis 做接口限流
Redis 除了做缓存,还能干很多很多事情:分布式锁.限流.处理请求接口幂等性...太多太多了- 今天想和小伙伴们聊聊用 Redis 处理接口限流,这也是最近的 TienChin 项目涉及到这个知识点 ...
- 解决redis缓存穿透、redis缓存雪崩问题
redis缓存雪崩 如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了. 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕 ...
- 咳咳,会用redis的帅哥拿到了上万,我这会用redis,还会配置redis的小鲜肉最低也待18k吧
刚刚看到个会使用redis的帅哥拿到了上万,我很是不服,我这不但会使用redis还会配置redis,而且会redis集群,主从复制,哨兵模式和解决缓存穿透.缓存击穿和缓存雪崩等问题,重点重点我还是小鲜 ...
- php limit限流,php+redis 限流
## 思路 ### 用户请求限限流(同接口访问时间限制) > redis key 接品名+ user_id 每访问一次+1 过期时间为限制访问时间 ```php _user_id = (int) ...
最新文章
- CF385C Bear and Prime Numbers
- 当React Native 遇到了Google reCAPTCHA
- SAP Fiori Elements 框架里 Smart Table 控件的工作原理介绍
- 如果征信有这些行为,申请房贷直接被拒绝
- java 图片去除黑边_根据 Map 上的变量绘制彩色和形状的点时,保持符号的黑色边框(geom_point)...
- 004python与mongoDB交互
- 【java】java原生序列化和Kryo序列化性能实例对比分析
- 手游服务器源码 https,python手游服务端搭建(转)
- C语言常用开发环境IDE
- Google地图开发API
- VMware安装流畅系统Chrome OS以及国产系统FedyOS(基于Chrome OS的二次开发)
- freessl申请ssl证书-笔记
- VBA字典(dictionary)
- dns---svchost
- 数字图像处理编程入门
- python四分位数_下四分位数和上四分位数分别是什么?能举个栗子吗?主要想了解python的quantile函数具体含义?...
- Linux下Mysql的解压安装 5.7.32
- 流程图设计入门指南 —— 以 Draw.io 为例
- 解决firefox Windows与linux数据不同步的问题
- webstorm热更新
热门文章
- iPhone文件管理连接服务器,iOS11文件管理器怎么用?Files文件管理器使用方法与功能介绍...
- https证书不安全是什么原因?
- 12.1.2、Doris__基本使用、doris的基本命令、建表概念、语句、建表语法、建表方式(引擎存储规则)、导入数据的方式、支持的数据类型、rollup索引
- 一个纯技术程序员的求职心酸历程
- 转手动档汽车的换挡技巧
- 地下城与勇士鬼剑士觉醒java_地下城与勇士之鬼剑士觉醒单机版
- 7. 全概率公式与贝叶斯公式
- shiro 使用md5密码加密 锁定账户
- 电子器件系列25:74HC138译码器
- 计算机算法在生物信息学中的应用,生物信息学在系统发育分析中的应用(自己原创) - 生物科学 - 小木虫 - 学术 科研 互动社区...