Redis Lua脚本

     Lua脚本,是一种轻量级的脚本语言。 设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua脚本的应用也很多,比如Nginx+Lua实现的 OpenResty,Redis+Lua配合使用(Redisson中大量使用了Lua脚本),使用Lua脚本开发的各种插件(我们公司灰度环境的规则匹配)等等。而我们这次在设计用户领取限制时,使用了Redis+Lua来实现。
     Lua脚本具有以下好处:
         1、减少网络开销:Lua脚本在执行的时候,是先发送到Redis服务器的,然后在服务器上执行脚本。多个命令和业务逻辑都封装到脚本里,一次性提交到服务器。
          2、 原子性操作 :我们都知道redis在执行命令时是单线程的,但是每个命令之间就存在并发的情况,就存在先查询再操作时,两个命令没办法保证线程安全。但使用Lua脚本时,redis把这个脚本操作当成是一个命令,那么这个脚本中的多条操作也就保证了原子性。( 注意:只保证原子性,不是事务
    Lua脚本的简单使用:
         1、命令行使用:
            redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...
               --eval,告诉redis-cli读取并运行后面的lua脚本
            path/to/redis.lua,是lua脚本的位置
            KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取
            ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。
              注意: KEYS和ARGV中间的 ',' 两边的空格,不能省略
         2、在脚本中调用redis命令:
             redis.call('set', 'foo', 'bar')
           local value=redis.call('get', 'foo') --value的值为bar
           redis.call函数的返回值就是Redis命令的执行结果
        3、redis执行脚本命令:
               EVAL语法:   eval script numkeys key [key ...] arg [arg ...]

            通过key和arg这两类参数向脚本传递数据,它们的值在脚本中分别使用KEYS和ARGV两个表类型的全局变量访问。

               script : 是lua脚本
               numkeys :表示有几个key,分别是KEYS[1],KEYS[2]...,如果有值,从第numkeys+1个开始就是参数值,ARGV[1],ARGV[2]...
               注意: EVAL命令依据参数numkeys来将其后面的所有参数分别存入脚本中KEYS和ARGV两个table类型的全局变量。当脚本不需要任何参数时,也不能省略这个参数(设为0)
                 EVALHASH、SCRIPT LOAD、SCRIPT KILL 、SCRIPT FLUSH等命令大家就自行学习吧。
                 当然,redis的各种客户端(jedis、redisson等)也都对这些命令有封装,直接使用就可以了。
    
    最后 ,虽然Lua脚本有这么多优点,但是也不能乱用,使用的时候要注意:
    1、Lua脚本可以在redis单机模式、主从模式、Sentinel集群模式下正常使用,但是无法在分片集群模式下使用。(脚本操作的key可能不在同一个分片)
    2、Lua脚本中尽量避免使用循环操作(可能引发死循环问题),尽量避免长时间运行。
    3、redis在执行lua脚本时,默认最长运行时间时5秒,当脚本运行时间超过这一限制后,Redis将开始接受其他命令但不会执行(以确保脚本的原子性,因为此时脚本并没有被终止),而是会返回“BUSY”错误。

你可能感兴趣的:(Java相关)