博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis限频
阅读量:4449 次
发布时间:2019-06-07

本文共 1847 字,大约阅读时间需要 6 分钟。

做法

使用redis的lua脚本功能来限频

在redis中定时刷新系统时间来作为一个全局的时钟

限频脚本:

/**     * 获取令牌的lua脚本     */    public final static String SCRIPT = "local epoch = redis.call(\"hget\",KEYS[1],'Epoch');\n" +            "local currentEpoch = tonumber(ARGV[1]);\n" +            "if(epoch == false and currentEpoch ~= epoch) then\n" +            "  redis.call('hset', KEYS[1], 'Epoch',currentEpoch);\n" +            "  redis.call(\"hset\", KEYS[1],  'Count', tonumber(ARGV[2]));\n" +            "  redis.call('pexpire', KEYS[1], 2000);\n" +            "  return 1;\n" +            "end;   \n" +            "local currentCount = redis.call(\"HINCRBY\", KEYS[1],'Count', tonumber(ARGV[3]));\n" +            "if(currentCount > 0) then  \n" +            "  return 1;\n" +            "else  \n" +            "  return 2;\n" +            "end;";    /**     * 同步系统时间到redis 中的lua脚本     */    public final static String SET_SYSTEM_TIME_SCRIPT = "local clientId = redis.call(\"hget\",KEYS[1],'Client'); \n" +            "if (clientId == false or clientId == ARGV[1]) then \n" +            "   redis.call('hset', KEYS[1], 'Client', ARGV[1]);\n" +            "   redis.call('hset', KEYS[1], 'Time' ,ARGV[2]);\n" +            "   redis.call('pexpire', KEYS[1], tonumber(ARGV[3]));\n" +            "   return 1;\n" +            "end;\n" +            "return 2;";

java调用代码:

List
keys = new ArrayList
(); keys.add("JRateLimit-Key-" + source); List
args = new ArrayList
(); args.add(currentEpoch + ""); //currentEpoch是通过获取全局时钟来做的 args.add(permitsPerEpoch + ""); args.add((0 - permits) + ""); Object result = client.evalsha(LIMIT_LUA_SCRIPT_SHA, keys, args, false); //result的类型即为lua脚本中的返回值类型,Long

策略

通过redis实现全局时钟

通过一次多取几个令牌放到内存中来解决超大调用频率导致的redis请求单机ops极限问题

转载于:https://www.cnblogs.com/windliu/p/10096766.html

你可能感兴趣的文章
c# 应用事务
查看>>
优化杭州某著名电子商务网站高并发千万级大型数据库经验之- SQL语句优化(转)...
查看>>
DtCms.Model.Article.cs
查看>>
WPF——TargetNullValue(如何在绑定空值显示默认字符)
查看>>
Linux之crontab
查看>>
清除浮动
查看>>
JAVA优化建议
查看>>
Docker --- 安装MySQL
查看>>
CenOS+宝塔(模拟)上线博客项目
查看>>
Linux改变语言设置的命令
查看>>
loadrunner Vugen-Tools General-Options-Replay设置
查看>>
redis限频
查看>>
Floyd判圈算法
查看>>
接口,lambda表达式与内部类(二)
查看>>
Phabricator是什么,代码审查工具
查看>>
Java虚拟机类加载机制
查看>>
UITextView,UIWebView 直接显示html代码
查看>>
DirectX:函数可以连接任意两个filter 分类: Direct...
查看>>
Android APP开发入门教程-Button 分类: JAVA ...
查看>>
WustOJ 1575 Gingers and Mints(快速幂 + dfs )
查看>>