首页 / REDIS / redis实现限速器的几种方式
redis实现限速器的几种方式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了redis实现限速器的几种方式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1322字,纯文字阅读大概需要2分钟。
内容图文
![redis实现限速器的几种方式](/upload/InfoBanner/zyjiaocheng/589/715220aeeb614070bee59b63f800543a.jpg)
![redis实现限速器的几种方式 - 文章图片](/upload/getfiles/0001/2021/4/27/20210427083316027.jpg)
redis 实现限速器的几种方式。
GET + INCR + EXPIRE
先获取 key 的当前值,如果没有超出限制再执行 INCR 增1,如果 key 不存在,使用 redis 的事务初始化 key 和过期时间。
(推荐:redis视频教程)
伪代码:
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
更多redis知识请关注redis入门教程栏目。
以上就是redis实现限速器的几种方式的详细内容。
内容总结
以上是互联网集市为您收集整理的redis实现限速器的几种方式全部内容,希望文章能够帮你解决redis实现限速器的几种方式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。