|
Redis提供了通过eval命令来执行Lua脚本。下面通过几个小例子来讲述如何在Redis服务端执行Lua脚本。
1. 执行Lua脚本的几个命令如下:
命令格式说明对应Jedis客户端Jedis对象的方法之一(有更多重载方法)EVAL script numkeys key [key ...] arg [arg ...]执行Lua脚本 public Object eval(String script, int keyCount, String... params)
EVALSHA sha1 numkeys key [key ...] arg [arg ...]根据给定的 sha1 校验码,对缓存在服务器中的脚本进行求值public Object evalsha(String sha1, int keyCount, String... params)SCRIPT LOAD script将给定的脚本缓存,不执行,并返回sha1校验值public String scriptLoad(String script)SCRIPT EXISTS sha1 [sha1 ...]给定一个或多个脚本的 SHA1 校验和,返回一个包含 0 和 1 的列表,表示校验和所指定的脚本是否已经被保存在缓存当中public List scriptExists(String... sha1) SCRIPT FLUSH清除所有 Lua 脚本缓存SCRIPT KILL杀死当前正在运行的 Lua 脚本,当且仅当这个脚本没有执行过任何写操作时,这个命令才生效(如果已经执行了写操作,则需要通过shutdown nosave命令来处理) 2.通过redis-cli客户端执行Lua脚本
redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3 需要注意的是用逗号来分割key和参数,这里与在交互式模式下执行evel命令有所不同。
3.实际案例
场景一:对一个特定请求1秒钟只允许访问10次,当符合请求访问条件时,返回True,否则返回False。
Java客户端操作Redis服务,实现代码如下:
/** * 访问控制
*
* 1秒内最多可访问10次
*
* @param key
* @return
*/
public boolean isAccess(String key) {
String rkey = "acc:" + key;
long value = jedis.incr(rkey);
if (value == 1) {
jedis.expire(rkey, 1);
return true;
} else {
boolean rs = value |
|
|