我们就拿购物车举例子
现在有5个东西免费送,我们只能选择1个
例如 可乐 美年达 香蕉 苹果 薯片
我们选择后就放进redis里面
然后我们不能选重复,只能选不同
Lua脚本
我们redis使用lua脚本的时候,会传两个参数进去
一个是List<String>类型,一个是Object【】类型
KEYS【】对应的是List类型 ARGV【】对应的是Object【】类型
-- 购物车的东西是一样的,不需要修改
if (redis.call('get', KEYS[1]) == ARGV[1]) then
return 0
elseif (redis.call('get', KEYS[1]) ~= '') then
-- 购物车的东西是不一样的,需要修改
-- 先删除
redis.call('del', KEYS[1])
--然后重新设置购物车
redis.call('set', KEYS[1], ARGV[1])
elseif (redis.call('get', KEYS[1]) == '') then
--购物车为空,直接添加
redis.call('set', KEYS[1], ARGV[1])
end
return 0
静态代码块读取Lua脚本,减少IO流
案例
我们首先往购物车里面添加苹果
然后使用execute()方法调用Lua脚本
然后传参数进去
此时我们的lua脚本用的是ARGV【1】
对应的是香蕉
我们使用后,发现redis里面变成香蕉了
如果我们像变成其他,那么在lua脚本中的ARGV【】参数里面改数字就好了
测试类代码
package com.example.admin;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
public class RedisTest {
//为了防止每次加载都读取lua文件产生大量IO流,所以我们弄成静态代码块直接就读取好
private static final DefaultRedisScript UNLOCK_SCKIP;
static {
UNLOCK_SCKIP=new DefaultRedisScript<>();
UNLOCK_SCKIP.setLocation(new ClassPathResource("unlock.lua"));
}
@Autowired
StringRedisTemplate stringRedisTemplate;
@Test
void add(){
stringRedisTemplate.opsForValue().set("购物车", "苹果");
}
@Test
void change(){
//苹果,香蕉,可乐,美年达,薯片
List<String> list=new ArrayList<>();
list.add("购物车");
//调用LUA脚本
stringRedisTemplate.execute(
UNLOCK_SCKIP,
list,
"香蕉","苹果","可乐","美年达","薯片"
);
}
}