0%

redis之EVAL命令

原子性是关系型数据库事务的四大特性之一,指的是一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。对于Redis而言,命令的原子性指的是一个操作的不可以再分,操作要么执行,要么不执行。

一、介绍

      As we all know,Redis的单个命令是能保证原子性的,因为本身是单线程。然而在有些场景下往往需要同时执行多个命令来保证业务,多个命令的时候Redis就无法保证原子性了。此时一般的解决方案大概有几种,要么看能否合并多个命令变为一个,要么通过事务实现,要么就通过lua脚本实现,当然还有别的实现方案,此处就不做深入讨论。对于Redis,Eval命令就是使用Lua解释器执行脚本。

二、使用

  1. 语法eval script numkeys key [key ...] arg [arg ...]

    • script:参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。
    • numkeys:用于指定键名参数的个数。
    • key [key …]:从EVAL命令后的第三个参数开始算起,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组获取,用1为基址的形式访问(KEYS[1],KEYS[2]以此类推)。
    • arg [arg …]:附加参数,在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似。
  2. 使用

    • 全部参数:eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 arg1 arg2
    • 部分参数:eval "for i=1,512 do redis.call('RPUSH',KEYS[1],i)end" 1 list_key
    • 部分参数:eval "for i=1,513 do redis.call('HSET',KEYS[1],i,i+1)end" 1 my_hash

三、参考

  1. 参考一