1.为什么要实现lua脚本
redis单一命令可以保证原子性,但是多个命令组合起来就不能保证原子性。比如先incry后
expire,incry命令是不能设置key的过期时间的,但是在工作中经常会设置incry key的过期时间,但是要保证原子性,所以引入lua脚本,同时lua脚本也可以实现分布式锁。
2.实践中遇到的坑
先贴代码
public Long incrEx(String key, Long defaultExpire){ final String script = "local visitNum = redis.call('incr', KEYS[1])" + "if visitNum == 1 then " + " redis.call('expire', KEYS[1], ARGV[1])" + "end " + "return visitNum;"; // 指定 lua 脚本,并且指定返回值类型 DefaultRedisScript redisScript = new DefaultRedisScript<>(); redisScript.setResultType(Long.class); redisScript.setScriptText(script); RedisSerializer<String> stringRedisSerializer = redisTemplate.getStringSerializer(); List<String> keys = new ArrayList<>(); keys.a