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

回到顶部