redis 使用lua脚本 用两种方式
方式一
此方式支持单机及集群场景
@Resource(name = "cluster.RedisSingleTemplate")
private StringRedisTemplate stringRedisTemplate;
private static final String LUA_SCRIPT_GET_AND_DELETE =
"local current = redis.call('get', KEYS[1] )\n" +
" current = tonumber(current)\n" +
"if (current < 50) then\n" +
" current = 1525 \n" +
"end\n" +
"return current\n";
@Test
public void test(){
List<String> keys = new ArrayList<>();
keys.add("testKey");
List<String> args = new ArrayList<>();
Long result = stringRedisTemplate.execute(new RedisCallback<Long>() {
@Override
public Long doInRedis(RedisConnection connection) throws DataAccessException {
Object nativeConnection = connection.getNativeConnection();
// 集群模式
if (nativeConnection instanceof JedisCluster) {
return (Long) ((JedisCluster) nativeConnection).eval(LUA_SCRIPT_GET_AND_DELETE, keys, args);
}
// 单机模式
else if (nativeConnection instanceof Jedis) {
return (Long) ((Jedis) nativeConnection).eval(LUA_SCRIPT_GET_AND_DELETE, keys, args);
}
return 0L;
}
});
System.err.println(result);
}
方式二
此方式只支持单机场景
@Resource(name = "RedisSingleTemplate")
private StringRedisTemplate redisTemplate;
private static final String LUA_SCRIPT_GET_AND_DELETE =
"local current = redis.call('get', KEYS[1] )\n" +
" current = tonumber(current)\n" +
"if (current > 50) then\n" +
" current = 1525 \n" +
"end\n" +
"return current\n";
@Test
public void test(){
List<String> keys = new ArrayList<>();
keys.add("testKey");
RedisScript<Long> script = new DefaultRedisScript<>(LUA_SCRIPT_GET_AND_DELETE,Long.class);
Long data = redisTemplate.execute(script, keyList, "args1", "args2");
System.err.println(data);
}
redisTemplate.execute(script, keyList, “args1”, “args2”);
args1, args2为非必传参数
在LUA脚本中使用 ARGV[1] ARGV[2] 来获取使用
该博客介绍了两种在Redis中使用Lua脚本的方法,适用于单机和集群场景。方式一利用Spring的StringRedisTemplate,通过条件判断实现数据的获取与更新,能适应单机和集群模式。方式二则通过RedisScript执行lua脚本,适用于单机环境,使用ARGV参数传递额外信息。
1432

被折叠的 条评论
为什么被折叠?



