当前位置:   article > 正文

在Redis中使用Lua脚本_redis执行lua脚本

redis执行lua脚本

一、Lua脚本的作用

  在使用Redis的过程中,发现有些时候需要原子性去操作Redis命令,而redis的lua脚本正好可以实现这一功能。因为所有的lua脚本在Redis实例中共用同一个Lua解释器某一个lua脚本在被执行的时候,其他lua脚本无法执行。​​​​​​​因此对于其他lua脚本而言,一个lua脚本要么不可见,要么就已经执行完了。而这恰恰是原子性的定义。

比如: 扣减库存操作、限流操作等等。Redis的pipelining虽然也可以一次执行一组命令,但是如果在这一组命令的执行过程中,需要根据上一步执行的结果做一些判断,则无法实现。

二、如何使用Lua脚本

  Redis中使用的是 Lua 5.1 的脚本规范,同时我们编写的脚本的时候,不需要定义 Lua 函数。同时也不能使用全局变量等等。

1.写Lua脚本的格式:

2.将脚本加载到redis中

  1. 127.0.0.1:6379> script load "return tonumber(KEYS[1])+1"
  2. "ef424d378d47e7a8b725259cb717d90a4b12a0de"

3.执行lua脚本

  可以通过eval执行Lua脚本,也可以通过evalsha执行上一步通过script load加载脚本后获取的hash值。 通过evalsha 执行的好处是可以节省带宽。如果我们的lua脚本比较长,程序在执行的时候将lua脚本发送到redis服务器则可能耗费的带宽多,如果发送的是hash值的话,则耗费的带宽少。

  1. 127.0.0.1:6379> evalsha ef424d378d47e7a8b725259cb717d90a4b12a0de 1 100
  2. (integer) 101

4.其他常用语句

  1. //判断脚本是否在redis服务器缓存中
  2. 127.0.0.1:6379> script load "return tonumber(KEYS[1])+1"
  3. "ef424d378d47e7a8b725259cb717d90a4b12a0de"
  4. 127.0.0.1:6379> script exists ef424d378d47e7a8b725259cb717d90a4b12a0de
  5. 1) (integer) 1
  6. 127.0.0.1:6379> script exists not-exists-sha1
  7. 1) (integer) 0
  8. //清空服务器上的脚本缓存
  9. 127.0.0.1:6379> script exists ef424d378d47e7a8b725259cb717d90a4b12a0de
  10. 1) (integer) 1
  11. 127.0.0.1:6379> script flush
  12. OK
  13. //杀死正在运行的脚本
  14. 127.0.0.1:6379> script kill

注意:

  • 该命令只可以杀死正在运行的 只读脚本
  • 对于修改了数据的脚本,无法使用此命令杀死,只能使用shutdown nosave命令。
  • 脚本执行的默认超时时间为 5分钟,可以通过redis.config配置文件的lua-time-limit配置项修改。
  • 脚本即使到达了超时时间,也不会停止执行,因为这违反了Lua脚本的原子性。

 5.Lua和Redis数据类型转换

   Lua的数据类型和Redis的数据类型存在一对一的转换关系,如果将Redis类型转换成Lua类型,然后在转换成Redis类型,那么结果和初试值是一致的。

  • Redis integer reply -> Lua number
  • Redis bulk reply -> Lua string
  • Redis multi bulk reply -> Lua table (may have other Redis data types nested)
  • Redis status reply -> Lua table with a single ok field containing the status
  • Redis error reply -> Lua table with a single err field containing the error
  • Redis Nil bulk reply and Nil multi bulk reply -> Lua false boolean type

 6.lua脚本中输出日志

  这个一般调试我们的脚本的时候比较有用。输出在redis-server上。

redis.log(loglevel,message)

loglevel的取值范围:

  • redis.LOG_DEBUG
  • redis.LOG_VERBOSE
  • redis.LOG_NOTICE
  • redis.LOG_WARNING

7.1s内限流5次的代码示例

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/487507
推荐阅读
相关标签
  

闽ICP备14008679号