当某一个接口需要限流时,可以采用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 来限流, 并发导致过期时间失效问题...相关推荐

  1. Redis(六)——限流算法:滑动时间窗口限流和漏斗限流

    本文主要总结自<redis深度历险> 限流的意义 限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子.限流可以保证系 ...

  2. redis获取存在的键值_Redis 分布式锁、限流

    谈及分布式系统的时候,很多企业都会使用到分布式锁,分布式锁的实现方案目前主要是存在两种,redis实现和zookeeper实现. redis实现方案是多个线程相互竞争,在redis的某一个节点内创建一 ...

  3. 单个接口添加超时时间_SpringBoot使用Guava令牌桶对接口限流

    pom.xml引入jar包 com.google.guava guava 29.0-jre 代码 @RestControllerpublic class HelloController { //创建令 ...

  4. 基于Redis的分布式限流详解

    前言 Redis除了能用作缓存外,还有很多其他用途,比如分布式锁,分布式限流,分布式唯一主键等,本文将和大家分享下基于Redis分布式限流的各种实现方案. 一.为什么需要限流 用最简单的话来说:外部请 ...

  5. Redis实现分布式限流(学习笔记

    Redis实现分布式限流(学习笔记2022.07.09) 前言: 以下实现都是基于: spring-boot-starter-web + spring-boot-starter-data-redis ...

  6. Redis 做接口限流

    Redis 除了做缓存,还能干很多很多事情:分布式锁.限流.处理请求接口幂等性...太多太多了- 今天想和小伙伴们聊聊用 Redis 处理接口限流,这也是最近的 TienChin 项目涉及到这个知识点 ...

  7. 解决redis缓存穿透、redis缓存雪崩问题

    redis缓存雪崩 如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了. 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕 ...

  8. 咳咳,会用redis的帅哥拿到了上万,我这会用redis,还会配置redis的小鲜肉最低也待18k吧

    刚刚看到个会使用redis的帅哥拿到了上万,我很是不服,我这不但会使用redis还会配置redis,而且会redis集群,主从复制,哨兵模式和解决缓存穿透.缓存击穿和缓存雪崩等问题,重点重点我还是小鲜 ...

  9. php limit限流,php+redis 限流

    ## 思路 ### 用户请求限限流(同接口访问时间限制) > redis key 接品名+ user_id 每访问一次+1 过期时间为限制访问时间 ```php _user_id = (int) ...

最新文章

  1. CF385C Bear and Prime Numbers
  2. 当React Native 遇到了Google reCAPTCHA
  3. SAP Fiori Elements 框架里 Smart Table 控件的工作原理介绍
  4. 如果征信有这些行为,申请房贷直接被拒绝
  5. java 图片去除黑边_根据 Map 上的变量绘制彩色和形状的点时,保持符号的黑色边框(geom_point)...
  6. 004python与mongoDB交互
  7. 【java】java原生序列化和Kryo序列化性能实例对比分析
  8. 手游服务器源码 https,python手游服务端搭建(转)
  9. C语言常用开发环境IDE
  10. Google地图开发API
  11. VMware安装流畅系统Chrome OS以及国产系统FedyOS(基于Chrome OS的二次开发)
  12. freessl申请ssl证书-笔记
  13. VBA字典(dictionary)
  14. dns---svchost
  15. 数字图像处理编程入门
  16. python四分位数_下四分位数和上四分位数分别是什么?能举个栗子吗?主要想了解python的quantile函数具体含义?...
  17. Linux下Mysql的解压安装 5.7.32
  18. 流程图设计入门指南 —— 以 Draw.io 为例
  19. 解决firefox Windows与linux数据不同步的问题
  20. webstorm热更新

热门文章

  1. iPhone文件管理连接服务器,iOS11文件管理器怎么用?Files文件管理器使用方法与功能介绍...
  2. https证书不安全是什么原因?
  3. 12.1.2、Doris__基本使用、doris的基本命令、建表概念、语句、建表语法、建表方式(引擎存储规则)、导入数据的方式、支持的数据类型、rollup索引
  4. 一个纯技术程序员的求职心酸历程
  5. 转手动档汽车的换挡技巧
  6. 地下城与勇士鬼剑士觉醒java_地下城与勇士之鬼剑士觉醒单机版
  7. 7. 全概率公式与贝叶斯公式
  8. shiro 使用md5密码加密 锁定账户
  9. 电子器件系列25:74HC138译码器
  10. 计算机算法在生物信息学中的应用,生物信息学在系统发育分析中的应用(自己原创) - 生物科学 - 小木虫 - 学术 科研 互动社区...