了解Redis的Lua脚本简易使用

Redis的事务是弱事务,而且Redis提供的计算能力也不够强大,所以Redis在2.6版本后提供了Lua脚本的支持,而Lua脚本除了有更强大的计算能力,还能保证操作的原子性,因此如果碰到高并发场景,需要保证数据一致性,那么使用Lua脚本就恰到好处了。

Redis运行Lua的两种方法

  1. 直接发送Lua到Redis服务器执行
  2. 把Lua发送到Redis,然后Redis对Lua脚本做缓存,返回一个SHA1的32位编码回来,之后只需要发送SHA1和相关的参数给Redis就可以执行了。

第二种方案为什么选择返回SHA1的32位编码来执行方法

因为如果使用第二种方案,要把Lua发送到Redis,自然是要通过网络,而如果Lua脚本很长,那么网络传输时间就会变长,而通常情况下,Redis的执行速度是比网络的传递速度快的,为了平衡速度,提高系统性能,所以需要减少网络传输的内容,那么传递32位编码和参数,需要传递的消息自然就少了许多。

Spring提供了RedisScript接口,方便开发者调用Lua脚本。

先看看RedisScript接口有什么方法,如下:

public interface RedisScript<T> {
   //该方法用来获取脚本的SHA1
    String getSha1();
   //用来获取返回类型
    @Nullable
    Class<T> getResultType();
   //用来获取脚本字符串
    String getScriptAsString();
}

然后看看RedisScript接口的实现类有哪些?发现只有一个默认实现类DefaultRedisScript,那么接下来使用DefaultRedisScript来完成一个简易的Lua脚本,代码demo如下:

@GetMapping("/testLua")
@ResponseBody
public Map<String, Object> testLua() {
    DefaultRedisScript redisScript = new DefaultRedisScript();
    //设置返回类型,这步必须要设置
    redisScript.setResultType(String.class);
    //设置脚本
    redisScript.setScriptText("return 'Hello World'");
    //获取到字符串序列化器
    RedisSerializer<String> stringRedisSerializer = redisTemplate.getStringSerializer();
    //执行
    Object result = redisTemplate.execute(redisScript, stringRedisSerializer, stringRedisSerializer, null);
    Map<String, Object> map = new HashMap<>();
    map.put("data", result);
    return map;
}

浏览器访问该接口,结果如下:
在这里插入图片描述
可以成功返回脚本结果。

你可能感兴趣的:(Spring,Boot)