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 超出限制} el { redis.incr(key)}
高并发下的问题:
如果同时10个并发程序执行 get 返回了 nil, 那么这10个并发程序都会执行 redis 的事务将 key 增一,但每个程序的 co帅气的英文名unt 值都为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 currentcurrent = redis.call("incr",keys[1])if tonumber(current) == 1 then redis.call("expire",keys[1],1)end
更多学习内容请访问:
高中体育课教案八重樱:腾讯t3-t4标准精品php架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)
本文发布于:2023-04-08 10:45:09,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/12561021941d0e639a423716351836ca.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:redis实现限速器的几种方式.doc
本文 PDF 下载地址:redis实现限速器的几种方式.pdf
留言与评论(共有 0 条评论) |