@Test
public void testLuaList() {
//key
String key="keyList";
//每次取两个
int sizeEach=2;
//先往List放7个值
List l = Arrays.asList("1", "2", "3", "4", "5", "6", "7");
redisUtil.listRightPushAll(key, l);
// ---lua 脚本---
DefaultRedisscript redisscript = new DefaultRedisscript();
// 1)指定 lua 脚本
redisscript.setscriptSource(new ResourcescriptSource(new ClassPathResource("redis/ListPopN.lua")));
// 2)指定返回类型,官方只支持4种:Long,Boolean,List,deserialized value
redisscript.setResultType(List.class);
try {
getLuaList();
List keys = Arrays.asList(key);
// 3)执行lua脚本---参数一:redisscript,参数二:key列表,参数三:arg(可多个,里面..形成数组)
List result1 = (List) redisTemplateMy.execute(redisscript, keys, sizeEach - 1);
logger.info("{}[执行结果], keys={},result1={}", TAG, keys, JSON.toJSONString(result1));
while (!result1.isEmpty() && result1.size() == sizeEach) {
getLuaList();
result1 = (List) redisTemplateMy.execute(redisscript, keys, sizeEach - 1);
logger.info("{}[本次pop获取到的结果], keys={},result1={}", TAG, keys, JSON.toJSONString(result1));
}
getLuaList();
return;
} catch (Exception e) {
e.printStackTrace();
}
}
public void getLuaList() {
//查一下最新的List值
List list = redisUtil.lGet("keyList", 0, -1);
logger.info("{}[查一下最新的List值],list={}", TAG, JSON.toJSONString(list));
}
对应的脚本,我是放在配置里,你可以放代码里
内容如下
local sizeIndex=ARGV[1]+1
local rlist = redis.call('lrange', KEYS[1],0,ARGV[1])
if #rlist == sizeIndex then
redis.call('ltrim', KEYS[1],#rlist,-1)
return rlist
else
return rlist;
end
测试demo
@Test
public void testLuaList() {
//key
String key="keyList";
//每次取两个
int sizeEach=2;
//先往List放7个值
List l = Arrays.asList("1", "2", "3", "4", "5", "6", "7");
redisUtil.listRightPushAll(key, l);
// ---lua 脚本---
DefaultRedisscript redisscript = new DefaultRedisscript();
// 1)指定 lua 脚本
redisscript.setscriptSource(new ResourcescriptSource(new ClassPathResource("redis/ListPopN.lua")));
// 2)指定返回类型,官方只支持4种:Long,Boolean,List,deserialized value
redisscript.setResultType(List.class);
try {
getLuaList();
List keys = Arrays.asList(key);
// 3)执行lua脚本---参数一:redisscript,参数二:key列表,参数三:arg(可多个,里面..形成数组)
List result1 = (List) redisTemplateMy.execute(redisscript, keys, sizeEach - 1);
logger.info("{}[执行结果], keys={},result1={}", TAG, keys, JSON.toJSONString(result1));
while (!result1.isEmpty() && result1.size() == sizeEach) {
getLuaList();
result1 = (List) redisTemplateMy.execute(redisscript, keys, sizeEach - 1);
logger.info("{}[本次pop获取到的结果], keys={},result1={}", TAG, keys, JSON.toJSONString(result1));
}
getLuaList();
return;
} catch (Exception e) {
e.printStackTrace();
}
}
public void getLuaList() {
//查一下最新的List值
List list = redisUtil.lGet("keyList", 0, -1);
logger.info("{}[查一下最新的List值],list={}", TAG, JSON.toJSONString(list));
}
3、注意项
T org.springframework.data.redis.core.RedisTemplate#execute(Redisscript, java.util.List, java.lang.Object...)