Redis中使用lua脚本限流
一、什么是lua
lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 https://www.runoob.com/lua/lua-tutorial.html
二、Redis使用lua的好处
- 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延
- 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。
- 复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。
三、限流示例
local key = KEYS[1]local period = ARGV[1]
local limit= ARGV[2]
local times = redis.call("incr",key)
if times == 1 then
redis.call("expire",KEYS[1], period)
end
if times > tonumber(limit) then
return 0
end
return 1
@Test
public void testLua() throws Exception {
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<Long>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis/limit.lua")));
redisScript.setResultType(Long.class);
while (true) {
//表示1s 内最多访问3次
//key [key ...],被操作的key,可以多个,在lua脚本中通过KEYS[1], KEYS[2]获取
//arg [arg ...],参数,可以多个,在lua脚本中通过ARGV[1], ARGV[2]获取。
Long count = (Long) redisTemplate.execute(redisScript, Arrays.asList("test"), 1, 3);
if (count == 0) {
System.out.println("超过流量限制");
}else{
System.out.println("正常请求");
}
TimeUnit.MILLISECONDS.sleep(100);
}
}
以上是 Redis中使用lua脚本限流 的全部内容, 来源链接: utcz.com/z/515852.html