1. 在整理Lua脚本之前,我以为Lua脚本会非正常有用,但是当我翻尚硅谷的笔记时却发现Redis集群下着实不可用这个Lua脚本。于是我这里简单的做一个小小整理。不以重点学习

Redis中的LUA脚本语法

LUA脚本语法可以去菜鸟教程。这里点出官方文档强调的几点
image.png

  • Lua脚本中不应该定义函数
  • Lua脚本不允许全局变量
  • 入参【key ..】可以通过KEYS[1]、KEYS[2]…方式取,以1位基准,
  • 入参[arg….]可以通过ARGV用来取value的个数,基数也是1。
  • 脚本中调用Redis命令可以通过 redis.call()和redis.pcall
  • 通过脚本设置key时,要选择 [key…]命令行中传过来的

    写几个LUA脚本

    1.通过LUA脚本设置两对key-value

    1. eval "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2]) return 1" 2 name age gx 1

    image.png

    2.取key=age的值,并把age的值+1,设置给weakAge

    1. eval "local nowAge = redis.call('get',KEYS[1]) redis.call('set',KEYS[2],nowAge+1) return 1" 2 age weakAge

    image.png

    call和pcall的区别

    1. eval "redis.call('set','call',1) redis.call('get2','name') redis.call('set','call',2)" 0
    1. eval "redis.pcall('set','pcall',1) redis.pcall('get2','name') redis.pcall('set','pcall',2)" 0

    image.png

  • call:会清除的报给你哪行错误,且前面成功的就成功了,后面不会执行

  • pcall:错了也会继续走,且不一定会告诉你是哪行有问题

    脚本缓存

    每次都用eval 然后一大串字符串脚本,总是会有点烦的。所以Redis每次都会把运行过的脚本缓存。下次运行只需要指定其SHA1校验和,redis就能知道是哪个脚本了

获取校验和

  1. eval 'return redis.sha1hex(ARGV[1])' 0 "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2]) return 1"

127.0.0.1:6379> eval ‘return redis.sha1hex(ARGV[1])’ 0 “redis.call(‘set’,KEYS[1],ARGV[1]) redis.call(‘set’,KEYS[2],ARGV[2]) return 1” “fb55d4a79a90a0cae651b150227128be584651f0”

用校验和执行

  1. evalsha fb55d4a79a90a0cae651b150227128be584651f0 2 key1 key2 1 2

image.png

关闭Redis后再执行

image.png

  • 就没有了,因为脚本是缓存在内存中的。

    清空所有脚本缓存

    1. script flush

    总结

    这篇文章是通过粗略浏览官方文档和Lua脚本语言而写的一些关于Redis中Lua脚本的用法。皮毛而已,但是下次遇到Lua脚本时,总不会有这是什么玩意的想法。
    个人感觉Lua脚本用处不大。

    参考资料

  • http://redis.cn/commands/eval.html

  • https://www.runoob.com/lua/lua-tutorial.html