1.1 EVAL script numkeys key [key ...] arg [arg ...] html
numkeys 是key的个数,后边接着写key1 key2... val1 val2....,举例
redis
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 val1 val2 1) "key1" 2) "key2" 3) "val1" 4) "val2"
1.2 SCRIPT LOAD script 编程
把脚本加载到脚本缓存中,返回SHA1校验和。但不会立马执行,举例缓存
127.0.0.1:6379> SCRIPT LOAD "return 'hello world'" "5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
1.3 EVALSHA sha1 numkeys key [key ...] arg [arg ...] 安全
根据缓存码执行脚本内容。举例网络
127.0.0.1:6379> SCRIPT LOAD "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" "a42059b356c875f0717db19a51f6aaca9ae659ea" 127.0.0.1:6379> EVALSHA "a42059b356c875f0717db19a51f6aaca9ae659ea" 2 key1 key2 val1 val2 1) "key1" 2) "key2" 3) "val1" 4) "val2"
1.4 SCRIPT EXISTS script [script ...] dom
经过sha1校验和判断脚本是否在缓存中编程语言
1.5 SCRIPT FLUSH 函数
清空缓存lua
127.0.0.1:6379> SCRIPT LOAD "return 'hello jihite'" "3a43944275256411df941bdb76737e71412946fd" 127.0.0.1:6379> SCRIPT EXISTS "3a43944275256411df941bdb76737e71412946fd" 1) (integer) 1 127.0.0.1:6379> SCRIPT FLUSH OK 127.0.0.1:6379> SCRIPT EXISTS "3a43944275256411df941bdb76737e71412946fd" 1) (integer) 0
1.6 SCRIPT KILL
杀死目前正在执行的脚本
减小网络开销:多个请求经过脚本一次发送,减小网络延迟
原子操做:将脚本做为一个总体执行,中间不会插入其余命令,无需使用事务
复用:客户端发送的脚本永久存在redis中,其余客户端能够复用脚本
可嵌入性:可嵌入JAVA,C#等多种编程语言,支持不一样操做系统跨平台交互
直接在redis-cli中直接写lua脚本,这样很是不方便编辑,一般状况下咱们都是把lua script放到一个lua文件中,而后执行这个lua脚本,
示例:活跃用户判断:判断一个游戏用户是否属于活跃用户,若是符合标准,则活跃用户人数+1
if redis.call("EXISTS",KEYS[1]) == 1 then return redis.call("INCRBY",KEYS[1],ARGV[1]) else return nil end
存储位置:
/Users/jihite/activeuser.lua
执行
$ redis-cli --eval /Users/jihite/activeuser.lua user , 1 (integer) 1 127.0.0.1:6379> get user "1" 127.0.0.1:6379> exit $ redis-cli --eval /Users/jihite/activeuser.lua user , 1 (integer) 2 $ redis-cli 127.0.0.1:6379> get user "2" 127.0.0.1:6379> exit $ redis-cli --eval /Users/jihite/activeuser.lua user , 4 (integer) 6
如生成随机数这一命令,若是在master上执行完后,再在slave上执行会不同,这就破坏了主从节点的一致性
为了解决这个问题, Redis 对 Lua 环境所能执行的脚本作了一个严格的限制 —— 全部脚本都必须是无反作用的纯函数(pure function)。全部刚才说的那种状况压根不存在。Redis 对 Lua 环境作了一些列相应的措施:
math
表原有的 math.random 函数和 math.randomseed 函数,新的函数具备这样的性质:每次执行 Lua 脚本时,除非显式地调用 math.randomseed
,不然 math.random
生成的伪随机数序列老是相同的。https://www.runoob.com/redis/redis-scripting.html (基本使用)
https://www.cnblogs.com/Don/articles/5731856.html (实例)
http://www.javashuo.com/article/p-hrpnzniu-kh.html
https://redisbook.readthedocs.io/en/latest/feature/scripting.html#lua (安全性)