赞
踩
一、Lua脚本的作用
在使用Redis的过程中,发现有些时候需要原子性去操作Redis命令,而redis的lua脚本正好可以实现这一功能。因为所有的lua脚本在Redis实例中共用同一个Lua解释器,某一个lua脚本在被执行的时候,其他lua脚本无法执行。因此对于其他lua脚本而言,一个lua脚本要么不可见,要么就已经执行完了。而这恰恰是原子性的定义。
比如: 扣减库存操作、限流操作等等。Redis的pipelining
虽然也可以一次执行一组命令,但是如果在这一组命令的执行过程中,需要根据上一步执行的结果做一些判断,则无法实现。
二、如何使用Lua脚本
Redis中使用的是 Lua 5.1
的脚本规范,同时我们编写的脚本的时候,不需要定义 Lua 函数。同时也不能使用全局变量等等。
1.写Lua脚本的格式:
2.将脚本加载到redis中
- 127.0.0.1:6379> script load "return tonumber(KEYS[1])+1"
- "ef424d378d47e7a8b725259cb717d90a4b12a0de"
3.执行lua脚本
可以通过eval执行Lua脚本,也可以通过evalsha执行上一步通过script load
加载脚本后获取的hash值。 通过evalsha
执行的好处是可以节省带宽。如果我们的lua脚本比较长,程序在执行的时候将lua脚本发送到redis服务器则可能耗费的带宽多,如果发送的是hash值的话,则耗费的带宽少。
- 127.0.0.1:6379> evalsha ef424d378d47e7a8b725259cb717d90a4b12a0de 1 100
- (integer) 101
4.其他常用语句
- //判断脚本是否在redis服务器缓存中
- 127.0.0.1:6379> script load "return tonumber(KEYS[1])+1"
- "ef424d378d47e7a8b725259cb717d90a4b12a0de"
- 127.0.0.1:6379> script exists ef424d378d47e7a8b725259cb717d90a4b12a0de
- 1) (integer) 1
- 127.0.0.1:6379> script exists not-exists-sha1
- 1) (integer) 0
- //清空服务器上的脚本缓存
- 127.0.0.1:6379> script exists ef424d378d47e7a8b725259cb717d90a4b12a0de
- 1) (integer) 1
- 127.0.0.1:6379> script flush
- OK
- //杀死正在运行的脚本
- 127.0.0.1:6379> script kill
注意:
只读脚本
。shutdown nosave
命令。默认超时时间为
5分钟
,可以通过redis.config
配置文件的lua-time-limit
配置项修改。5.Lua和Redis数据类型转换
Lua
的数据类型和Redis
的数据类型存在一对一的转换关系,如果将Redis类型转换成Lua类型,然后在转换成Redis类型,那么结果和初试值是一致的。
6.lua脚本中输出日志
这个一般调试我们的脚本的时候比较有用。输出在redis-server上。
redis.log(loglevel,message)
loglevel的取值范围:
redis.LOG_DEBUG
redis.LOG_VERBOSE
redis.LOG_NOTICE
redis.LOG_WARNING
7.1s内限流5次的代码示例
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。