java redis 限流_Redis+Lua实现限流

相比Redis事务来说,Lua脚本有以下优点

减少网络开销: 不使用 Lua 的代码需要向 Redis 发送多次请求, 而脚本只需一次即可, 减少网络传输;

原子操作: Redis 将整个脚本作为一个原子执行, 无需担心并发, 也就无需事务;

复用: 脚本会永久保存 Redis 中, 其他客户端可继续使用.

1.创建limit.lua文件

local key = KEYS[1] --限流KEY(一秒一个)

local limit = tonumber(ARGV[1]) --限流大小

local current = tonumber(redis.call(‘get‘, key) or "0")

if current + 1 > limit then --如果超出限流大小

return 0

else --请求数+1,并设置2秒过期

redis.call("INCRBY", key,"1")

redis.call("expire", key,"1")

return 1

end

2.java调用

public static boolean accquire() throws IOException, URISyntaxException {

Jedis jedis = new Jedis("127.0.0.1");

File luaFile = new File(RedisLimitRateWithLUA.class.getResource("/").toURI().getPath() + "limit.lua");

String luaScript = FileUtils.readFileToString(luaFile);

String key = "ip"; String limit = "5"; // 最大限制

List keys = new ArrayList();

keys.add(key);

List args = new ArrayList();

args.add(limit);

Long result = (Long)(jedis.eval(luaScript, keys, args)); // 执行lua脚本,传入参数

return result == 1;

}

你可能感兴趣的:(java,redis,限流)