redis实现限速器的几种方式
Redis 实现 方式 几种 限速
2023-09-14 08:57:43 时间
redis 实现限速器的几种方式。
GET + INCR + EXPIRE
先获取 key 的当前值,如果没有超出限制再执行 INCR 增1,如果 key 不存在,使用 redis 的事务初始化 key 和过期时间。
伪代码:
count = redis.GET(key) if redis return nil { redis.MULTI redis.INCR(key) redis.EXPIRE(key, expire_time) redis.EXEC count = 1 } if count > limit { return 超出限制 } else { redis.INCR(key) }
高并发下的问题:
如果同时10个并发程序执行 GET 返回了 nil, 那么这10个并发程序都会执行 redis 的事务将 key 增一,但每个程序的 count 值都为1,如果 limit 设置的值小于10,那么真正执行的程序就超过限制了。如果执行完事务后再查一次 redis 赋值给 count,那么每个程序可能都会返回10,从而没有程序能够继续执行。
key 已经存在的情况下,先 GET 后 INCR 的逻辑也可能会出现实际执行的程序数多于 limit 的情况。
INCR + EXPIRE
先 INCR, 如果值为1说明是 key 刚设置的,此时再执行 EXPIRE
伪代码:
count = redis.INCR(key) if count == 1 { redis.EXPIRE(key, expire_time) } if count > limit { return 超出限制 }
慎用
如果 INCR 之后程序挂掉了,没有执行 EXPIRE, 那么这个 key 就没有过期时间了,具体的影响视需求而定。
lua脚本
local current current = redis.call("incr",KEYS[1]) if tonumber(current) == 1 then redis.call("expire",KEYS[1],1) end
更多学习内容请访问:
八重樱:腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)
相关文章
- Redis存储模型与原理深度解析(redis的存储原理)
- 领取秒杀红包:用Redis实现快速领取(redis红包)
- Redis:高效的内部实现(redis内部实现)
- 构建Redis集群实现高可用(redis集群的实现)
- Redis实现优化数据库同步(redis 与数据库同步)
- 优质带宽,高效缓存Redis实现新标准(带宽高redis)
- 查询数据存入Redis中的实现(查询数据存到redis)
- 高效操作精准删除Redis节点(删除redis节点)
- 善用内存型Redis,提升运算效率(内存型redis)
- 内外网Redis实现数据同步(内外网redis同步)
- 多线程读取Redis,实现高效存取(多线程 读 redis)
- 秒杀大酬宾实现神速火爆,借Redis之力(使用redis做秒杀)
- 借助Redis验证码 提升登录时间效率(redis验证码时间)
- 借助Redis集群实现时间同步(redis集群时间同步)
- Redis集群搭建实现无缝集成的插件(redis集群搭建插件)
- Redis队列实现原子性操作(redis 队列 原子)
- 使用Redis快速实现链接验证(redis链接验证)
- 深入浅出Redis的事务是怎么回事(redis里面有事物么)
- 利用Redis,实现多样化的存储(redis都可以存储什么)
- Redis优化读写数据的高效流程(redis读写数据流程)
- Redis订阅模式的弊端分析(redis订阅模式缺点)
- 存储使用Redis实现持久化存储(redis进行持久话)