import org.redisson.api.RedissonClient;
import org.redisson.api.RScript;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class LuaScriptService {
@Autowired
private RedissonClient redissonClient;
public Long executeLuaScript(String key, Long incrementValue) {
// 获取 Lua 脚本
RScript script = redissonClient.getScript();
// 执行 Lua 脚本,返回结果
return script.eval(RScript.Mode.READ_WRITE,
"if redis.call('exists', KEYS[1]) == 1 then return redis.call('incrby', KEYS[1], ARGV[1]) else redis.call('set', KEYS[1], ARGV[1]) return ARGV[1] end",
RScript.ReturnType.INTEGER,
java.util.Collections.singletonList(key), // KEYS[1]
java.util.Collections.singletonList(String.valueOf(incrementValue)) // ARGV[1]
);
}
}
参数说明:#
- RScript.Mode.READ_WRITE:表示该脚本会修改 Redis 数据,因此我们选择
READ_WRITE 模式。 - eval() 方法的参数:
- Lua 脚本内容:要执行的 Lua 脚本字符串。
- RScript.ReturnType.INTEGER:表示返回值为整数类型。可以根据你的脚本返回类型选择其他类型(如
STRING、BOOLEAN、VOID 等)。 - KEYS:传入的 Redis 键列表。通过
java.util.Collections.singletonList(key) 传递。 - ARGV:传入的参数列表,表示脚本的输入参数。通过
java.util.Collections.singletonList(String.valueOf(incrementValue)) 传递。