如何使用Redis执行Lua脚本

亦凉 2024-04-18 20:18 149阅读 0赞

640?wx\_fmt=gif

学习更多Java干货,戳上面的

蓝色字题

关注我!

为什么要使用Lua脚本?

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

lua基础

  1. 创建lua脚本
  2. –单行注释。–[[多行注释,多行注释–]]
  3. 打印语句

    print(“Hello World!”)

  4. 常见数据类型

  5. 变量

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

  6. 条件判断

    if maxValue > limit then

    1. value = limit;
    2. else if
    3. value = maxValue;
    4. else
    5. value = 0;
    6. end
  7. 循环

    for i, v in ipairs(a) do

    1. print(i, v) --i是索引,且是从1开始的。v就是value了。

    end

  8. 函数

    function test(n)

    1. if n == 0 then
    2. return 1
    3. else
    4. return -1
    5. 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

  1. local key = KEYS[1];
  2. local limit = KEYS[2];
  3. local value1 = ARGV[1];
  4. local value2 = ARGV[2];

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

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

    @Autowired
    private RedisTemplate redisTemplate;
    public void counterConsume(String key, String limit, String lrefreshInterval) {

    1. DefaultRedisScript<Long> consumeRedisScript=new DefaultRedisScript();
    2. consumeRedisScript.setResultType(Long.class);
    3. consumeRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("script/redis-ratelimiter-tokenBucket.lua")));//加载lua脚本文件
    4. List<Object> keyList = new ArrayList();
    5. keyList.add(key);//通过KEYS[1]取值
    6. keyList.add(limit);//通过KEYS[2]取值
    7. List<Object> argvList = new ArrayList();
    8. argvList.add(lrefreshInterval);//通过ARGV[1]取值
    9. String result=redisTemplate.execute(redisScript,keyList,argvList).toString();

    }

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

640?wx\_fmt=gif

推荐阅读

  • Java进阶路线
  • 无套路免费技术干货

640?wx\_fmt=jpeg

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

640?wx\_fmt=gif

发表评论

表情:
评论列表 (有 0 条评论,149人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot + Redis 执行lua脚本

    1、背景 有时候,我们需要一次性操作多个 Redis 命令,但是 这样的多个操作不具备原子性,而且 Redis 的事务也不够强大,不支持事务的回滚,还无法实现命令之间的逻

    相关 redis执行Lua脚本

    Lua 是一个小巧的脚本语言。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua脚本可以很容易的被C/C++代码调用,也可以反过来调