纯粹无聊写的,没啥大用,本来是想保证原子性,但是写完发现虽然内部逻辑保证了但是,调用时还是会无法保证原子性,实际完全可以写在java里然后加个分布式锁优雅解决,不过既然写了直接删了太可惜了,存起来纪念下吧
String lua =
"local lastTimekey=KEYS[1]\n" +
"local speedkey=ARGV[1]\n" +
//获取该渠道桶的初始参数
"local lastTimevalue=redis.call('get',lastTimekey)\n" +
"local speedvalue=redis.call('get',lastTimekey)\n" +
//兼容第一次注水的情况
"if(lastTimevalue) then\n" +
"else\n" +
" lastTimevalue=0\n" +
"end\n" +
//计算允许注水的数量
"local allowNum=(ARGV[2]-lastTimevalue)/1000*speedvalue\n" +
//判断允许数量是否大于当前需要注水的数量
"if(allowNum>tonumber(ARGV[3])) then\n" +
" redis.call('set',lastTimekey,tonumber(ARGV[2]))" +
" return 'true'" +
"else\n" +
" return 'false'\n" +
"end\n" +
"return 'false'";
String res = RedisFactory.defaultClient()
.eval(lua, 1, "testlastTime", "testspeed", new Date().getTime() + "", "20").toString();