Lua在Redis中入门应用

最近在完成一个功能需要用到Redis,然后要用Lua脚本语言来实现,来总结一下它的简单使用。

什么是Lua脚本语言?

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。引用于https://www.runoob.com/lua/lua-tutorial.html

其中Redis中内置了对Lua脚本语言的支持,Lua脚本在Redis上能起到什么作用,首先我们来学习下Redis的提交命令,假如有一个场景是Redis中存有一个变量,访问一次就自增。当然,Redis也有提供原子自增的方法,这里不考虑,只是举一个例子。

那么我们这个时候需要发送两个命令

但是这样可能不会达到我们预期的结果,因为Redis是基于Reactor模型,单线程接收Client发送的事件放入队列,然后事件分派处理器从队列中取出事件进行处理,所以单个命令是原子性,但在多个命令的时候却不能保证了,若另一个client发送修改该变量的时候,该命令可能在前者执行set命令之前处理,就会导致达不到预期的结果。

怎么解决呢,Redis有提供事务,通过MUTLI开始事务 EXEC进行提交事务,事务中的命令先存到一个缓存中,当输入EXEC后所有命令才会执行,其中这个事务跟Mysql中事务有点不一样,当某个命令执行失败之后,其他命令还是会执行,并且不会回滚。

Lua在Redis中入门应用_第1张图片

所以这就是需要Lua脚本的原因,它能保证执行多个命令的有序性。

Lua入门应用

Lua的语法,可以参考这个https://www.jb51.net/article/136109.htm;

在Lua中可以通过,redis.call() redis.pcall()进行跟Redis进行交互。

在redis-cli中,通过eval指令执行Lua

也可以写成lua脚本文件再执行,但是不能在redis-cli进行执行,会报(error) ERR Error compiling script (new function): user_script:2: '=' expected near 'end'的错。(还是可能我执行的姿势有问题?求大佬指导)

Lua在Redis中入门应用_第2张图片

若Lua脚本比较长,每次发送给Redis,如果要网络传输的话会比较慢怎么办?

redis就提供一个lua脚本缓存机制,当第一次发送会返回一个对该脚本的散列值给客户端并将该脚本存起来,下次发这个散列值给redis就会找到对应的脚本执行,减少网络传输的时间。

 

 

你可能感兴趣的:(Lua在Redis中入门应用)