• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 位置: redis 中文手册 -> redis 功能命令

    脚本(Lua)

    Lua是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放。其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。因为广泛的应用于:游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件等。比如:Lua脚本用在很多游戏上,主要是Lua脚本可以嵌入到其他程序中运行,游戏升级的时候,可以直接升级脚本,而不用重新安装游戏。

    redis lua 脚本出现之前 Redis 是没有服务器端运算能力的,主要是用来存储,用做缓存,运算是在客户端进行,这里有两个缺点:

    • 如此会破坏数据的一致性,试想如果两个客户端先后获取(get)一个值,它们分别对键值做不同的修改,然后先后提交结果,最终 Redis 服务器中的结果肯定不是某一方客户端所预期的。
    • 浪费了数据传输的网络带宽。

    Redis 是高性能的 key-value 内存数据库,在部分场景下,是对关系数据库的良好补充。Redis提供了非常丰富的指令集,官网上提供了200多个命令。但是某些特定领域,需要扩充若干指令原子性执行时,仅使用原生命令便无法完成。Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执行自定义动作,获取脚本的响应数据。Redis 服务器会单线程原子性执行 lua 脚本,保证 lua 脚本在处理的过程中不会被任意其它请求打断。

    使用 Lua 脚本的好处:

    • 减少网络开销:可以将多个请求通过脚本的形式一次发送,减少网络时延和请求次数。
    • 原子性的操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。
    • 代码复用:客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本来完成相同的逻辑。
    • 速度快:与其它语言的性能比较,还有一个 JIT编译器可以显著地提高多数任务的性能;对于那些仍然对性能不满意的人,可以把关键部分使用C实现,然后与其集成,这样还可以享受其它方面的好处。
    • 可以移植:只要是有ANSI C 编译器的平台都可以编译,你可以看到它可以在几乎所有的平台上运行:从 Windows 到Linux,同样Mac平台也没问题,再到移动平台、游戏主机,甚至浏览器也可以完美使用(翻译成JavaScript)。
    • 源码小巧:20000行C代码,可以编译进182K的可执行文件,加载快,运行快。

    Redis 脚本使用 Lua 解释器来执行脚本。 Reids 通过内嵌支持 Lua 环境。执行脚本的常用命令为EVAL

    实例

    以下实例演示了 redis 脚本工作过程:

    redis> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
     
    1) "key1"
    2) "key2"
    3) "first"
    4) "second"