在redis中使用Lua脚本

脚本介绍

Redis在2.6版本中推出了脚本功能,使用Lua语言(一种“卫星语言”,能够方便地嵌入到其他语言中使用)编写脚本传到Redis中执行。在Lua脚本中可以调用大部分的Redis命令,使用脚本的好处如下:

  • 减少网络开销: 多个redis请求可以在一个脚本中一次发送一个请求,减少网络往返时延。

  • 原子操作: Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。编写脚本的
    过程中无需担心会出现竞态条件,也就无需使用事务。事务可以完成的所有功能都可以用脚本实现。

  • 复用: 客户端发送的脚本会永久存储在Redis中,其他语言开发的项目可以复用之。

代码示例

1.访问频率限制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
local times = redis.call('incr',KEYS[1])

if times == 1 then 

redis.call('expire',KEYS[1],ARGV[1])

end 

if times > tonumber(ARGV[2]) then	

return 0

end 

return 1	

#保存该脚本为test.lua,执行该脚本:

redis-cli --eval /path/test.lua key1 , 10 2

#--eval参数是告诉redis-cli读取并运行后面的Lua脚本,/path/test.jua是脚本文件的路径,key1是要操作的键,在脚本中使用KEYS[1]获取,10和2是参数,在脚本中使用ARGV[1]和ARGV[2]获得值(每10秒最多访问3次),注意空格  

—|—

2.java代码示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
//redis lua 脚本

static String luaScript = "local timeValue = redis.call('get',KEYS[1]) if timeValue < ARGV[1] then return  redis.call('mset',KEYS[1],ARGV[1],KEYS[2],ARGV[2]) end return nil";

//执行脚本

redisClient.executeLuaScript(luaScript,"key1", "key2", "value1", "value2");

//executeLuaScript方法:

public Object (String script,String key1,String key2,String avg1,String avg2) throws Exception {

        return this.execution(new JedisResultTask() {

            protected Object doExecution(Jedis jedis) {

                return jedis.eval(script,2,key1,key2,avg1,avg2);

            }

        });

    }  

—|—

3.解决抢红包高并发的问题

传送门

糖果

糖果
LUA教程

如果不小心安装错 SQL Server 为 Evaluation 的版本,要小心当超过 180 天之后,系统就会无法正常使用了 这几天遇到一个蛮特别的案例,原本收到的问题是 “维护计划” 忽然无法使用,即便是里面没有任何的Task,都无法顺利地执行。但从对方所提供的错误消...… Continue reading

PLUM NIZ静电容键盘怎么样?

Published on September 25, 2020

程序员如何选择合适的机械键盘

Published on September 18, 2020