设为首页 收藏本站
查看: 1923|回复: 0

[经验分享] redis限速器设计(不使用lua脚本及事物)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-9-24 10:38:47 | 显示全部楼层 |阅读模式
公司有一个需求,需要集群中的机器每分钟发送固定个数请求到局域网以外的一台服务器,固定个数,是指集群中的所有机器发送的所有的请求加起来是一个固定的个数,这就需要一个分布式的限速器。首先想到的就是使用redis中的incr方法,在redis的官方文档中寻找到了一个示例
FUNCTION LIMIT_API_CALL(ip)ts = CURRENT_UNIX_TIME()keyname = ip+":"+tscurrent = GET(keyname)IF current != NULL AND current > 10 THEN    ERROR "too many requests per second"ENDIF current == NULL THEN    MULTI        INCR(keyname, 1)        EXPIRE(keyname, 1)    EXECELSE    INCR(keyname, 1)ENDPERFORM_API_CALL()但这个脚本对我来说有两个缺点
1 我的限速器并不是限制一台机器的速度,而是限制整个集群的速度,所以在判断了限速的key的长度之后,会有很多的机器执行incr动作
2 公司DBA不支持使用事物 wail.jpg

看了文档中后面限速器的实现,要么使用事物,要么使用lua脚本(公司也不支持lua,因为lua也是事务性的,而公司是sharding的redis集群),全部被否定

看来只能多检测一会了
程序流程图,假设我们1s中之内只能请求20次


SouthEast.jpg


步骤
1 使用incr命令得到一个值
2 判断值是否为1,为1则说明此次获得是key值失效之后第一次进行incr操作,这次操作需要将key设置超时时间。
但是我们这里并没有使用事务支持,当程序运行到检测value是1,还没有进行expire操作的时候,机器down机了,那么程序就只能请求20次了,
所以在每次得到value值之后,与10进行取余操作,若是10的倍数,则进行检测,如果没有设置超时时间,则进行设置
3 判断value值是否是小于20,如果小于等于20,我们认为在规定的时间内,这个线程获得了锁,如果大于20,我们认为没有获得锁,sleep一段时间后继续请求锁。

这样,我们就实现了一个没有使用事物,lua脚本的限速器

如果此方案有什么错误,或者有更加优雅的方案,还请各位多多指教。

注意
流程图中值为1和为10的倍数都需要检测ttl key,这里可以做个优化,只有10的倍数的值的进行ttl key 检测操作,1的话直接expire key。







运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-25332-1-1.html 上篇帖子: Redis Cluster 的安装和配置(2) 下篇帖子: redis-sentinel搭建redis主从故障转移
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表