如何使用Redis执行Lua脚本

640?wx_fmt=gif
学习更多Java干货,戳上面的
蓝色字题
关注我!

为什么要使用Lua脚本?

lua脚本有很多的优点,但是对于我来说我使用它只因为它能保证原子性。为什么它能保证原子性你就使用它呢?一个简单的例子,在我们的Java代码中,一个简单的++i都不能保证原子性更别提复杂的情况了。但是使用lua在执行几百行代码的情况下都不需要考虑高并发所带来的问题。

lua基础

  1. 创建lua脚本

  2. –单行注释。–[[多行注释,多行注释–]]

  3. 打印语句

print("Hello World!")

  1. 常见数据类型

  2. 变量

a = 5               -- 全局变量	
local b = 5         -- 局部变量

  1. 条件判断

if maxValue > limit then	
          value = limit;	
      else if	
          value = maxValue;	
      else 	
          value = 0;	
      end

  1. 循环

for i, v in ipairs(a) do	
    print(i, v)      --i是索引,且是从1开始的。v就是value了。	
end

  1. 函数

function test(n)	
    if n == 0 then	
        return 1	
    else	
        return -1	
    end	
end

看完以上几条你的基础其实已经过关了,如果仅仅在操作redis上的话就已经够了。

redis执行lua脚本

  1. 在脚本中如何与redis进行交互

local value = redis.call('GET',key);	
redis.call('SET',key,value+2);	
redis.call('DECR',key);	
redis.call('EXPIRE',key,10);

你是否看明白了呢,只需要执行redis.call命令,第一个参数放入要执行的命令,后面的参数放入命令需要的参数就ok了。

  1. 如何执行脚本呢

redis-cli --eval redis-ratelimiter-counter.lua key limit , value1 value2

上方这段命令的意思呢,其实就是告诉redis:请你启动客户端的时候帮我执行一下redis-ratelimiter-counter.lua这个文件,然后呢,执行文件的话有这么几个参数,key、limit 、 value1、value2

local key = KEYS[1];	
local limit = KEYS[2];	

	
local value1 = ARGV[1];	
local value2 = ARGV[2];

这样的话你是不是看明白了呢,逗号前后的参数是两种不同的传值方式而已。

  1. 如何在Java程序中执行lua呢

@Autowired	
   private RedisTemplate redisTemplate;	
   public void counterConsume(String key, String limit, String lrefreshInterval) {	
     DefaultRedisScript<Long> consumeRedisScript=new DefaultRedisScript();	
       consumeRedisScript.setResultType(Long.class);	
       consumeRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("script/redis-ratelimiter-tokenBucket.lua")));//加载lua脚本文件	
       List<Object> keyList = new ArrayList();	
       keyList.add(key);//通过KEYS[1]取值	
       keyList.add(limit);//通过KEYS[2]取值	
       List<Object> argvList = new ArrayList();	
       argvList.add(lrefreshInterval);//通过ARGV[1]取值	
       String result=redisTemplate.execute(redisScript,keyList,argvList).toString();	
   }

 

点击下方“阅读原文”查看源码!!!

640?wx_fmt=gif

推荐阅读

640?wx_fmt=jpeg

 点赞收藏转发好看再走呗!

640?wx_fmt=gif

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值