nainai1 发表于 2018-11-6 11:47:46

Redis中使用Lua脚本的开发思路

  Redis提供了通过eval命令来执行Lua脚本。下面通过几个小例子来讲述如何在Redis服务端执行Lua脚本。
  1. 执行Lua脚本的几个命令如下:
命令格式说明对应Jedis客户端Jedis对象的方法之一(有更多重载方法)EVAL script numkeys key arg 执行Lua脚本  public Object eval(String script, int keyCount, String... params)
EVALSHA sha1 numkeys key arg 根据给定的 sha1 校验码,对缓存在服务器中的脚本进行求值public Object evalsha(String sha1, int keyCount, String... params)SCRIPT LOAD script将给定的脚本缓存,不执行,并返回sha1校验值public String scriptLoad(String script)SCRIPT EXISTS 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
页: [1]
查看完整版本: Redis中使用Lua脚本的开发思路