Redis事务
Lua脚本
Redis事务
- redis中提供了multi和exec两个命令来使一组命令的执行能够保证事务特性,在事务中执行的命令不会马上执行,而是返回queued,当执行中出现命令错误的操作时,已执行的命令不会成功。
- 当在某些情况下,操作某个键时,需要该键在事务过程中没有被修改才执行成功时,通过watch命令来实现,如果事务过程中有对键值的修改,那么事务不会执行,下面是两个客户端下事务过程中对键修改事务未生效的演示:
- redis中实现的事务功能相对简单,毕竟其不能实现多个执行命令之间的逻辑关系计算,从而无法实现回滚操作。
Lua脚本
- Lua脚本语言,于1993年的巴西里约热内卢天主教大学的三人研究小组开发而成,其灵活的嵌入到应用程序中,从而为应用程序提供了灵活的扩展性和定制功能。
- Lua API
- redis中执行lua脚本的好处:
- lua脚本在redis中是原子执行的,执行过程中不会插入其他命令
- lua脚本可以在redis中定制出一些发开人员需要的命令,并且该命令一次加载后可多次的复用
- lua脚本可以将多条命令一次性打包执行,较少网络开销
- redis中对lua脚本的管理:
- eval script numkeys key [key …] arg [ arg …],执行lua脚本
- 命令解析:
- script:需要执行的lua脚本
- numkeys:key的数量
- key [key …]:一个或是多个key
- arg [arg …]:一个或多个参数
- 在使用是可通过 KEYS[index]和ARGV[index]来获取键和参数,值得注意的是这里的index是指的从左往右排起的第几个键或第几个参数,所以是从1开始计数的。
- 在lua脚本中可以使用redis.call或redis.pcall来执行redis中的命令,二者唯一不同的是使用call的话,如果产生报错那脚本将不在往下执行,而pcall则会继续往下执行。
- 如果脚本过长 可通过redis-cli --eval来执行脚本
- evalsha sha1 numkeys key [key …] arg [ arg …],执行script load加载后的lua脚本
- 参数解析:
- sha1:与eval不同,其脚本是直接通过命令进行传递的,但是当脚本过大的时,可能会造成redis的阻塞,而evalsha命令执行的是通过script load命令已经加载到redis实例中的lua脚本引用,通过引用而直接指向lua脚本并执行,其脚本在一次加载之后能够多次的使用。
- 其他的参数与eval相同
- script load 脚本,加载lua脚本返回SHA1的标识字符串
- redis-cli script load lua脚本或lua脚本文件
- script exists sha1 [sha1 …],判断一个或多个sha1是否存在
- script flush,清空redis中所有已被加载的lua脚本
- script kill,杀死当前正在执行的脚本
- 但是当执行的脚本正在进行写操作时,那script kill将不能杀死该脚本。
- 需要注意的是,因为在redis中执行lua脚本时是阻塞执行的,在redis中对lua脚本的执行时间设置了一个警告值:lua-time-limit,默认是5秒当执行时间超过该警告值时,其他客户端在操作数据时就会收到错误提交
- lua脚本调试
- 下载Lua编辑器ZeroBrane Studio
- 下载redis扩展包,密码为:home
- 将ZeroBrane Studio安装或解压,将拓展包放入其packages文件夹下
- 打开ZeroBrane Studio编辑器,进入project->Lua Interpreter选择redis
- 如果需要输入参数的话,进入 project-> Command Line Parameters
- 之后就可以在脚本上打断点并进行调试了