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
---rate.limiting:127.0.0.1是要操作的键,可以再脚本中用KEYS[1]获取,10和3是参数,在脚本中能够使用ARGV[1]和ARGV[2]获得
---将访问频率限制为每10秒最多3次,当小于3时返回1,否则返回0
@Test
public void testLua() throws Exception {
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<Long>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis/limit2.lua")));
redisScript.setResultType(Long.class);
while (true) {
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/515833.html