脚本介绍
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 redis-cli --eval /path/test.lua key1 , 10 2
|
2.java代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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"); 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.解决抢红包高并发的问题
传送门