Redis-Lua脚本

1. 简介

1.1 概念

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

1.2 优势

  1. 减少网络开销:在Redis操作需求需要向Redis发送5次请求,而使用脚本功能完成同样的操作只需要发送一个请求即可,减少了网络往返时延。
  2. 原子操作: Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说就是在编写脚本的过程中无需担心会出现竞态条件,也就无需使用事务。事务可以完成的所有功能都可以用脚本来实现。
  3. 复用:客户端发送的脚本会永久存储在Redis中,这就意味着其他客户端(可以是其他语言开发的项目)可以复用这一脚本而不需要使用代码完成同样的逻辑。

1.3 劣势

  1. Nil字符问题
  2. 没有好的垃圾回收机制

2. Lua基础

2.1 Lua基础类型

数据类型 描述
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)
Boolean 包含两个值:false和true
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个"关联数组"(associative arrays)

2.2 Lua相关命令

  • 执行lua脚本:EVAL script numkeys key [key …] arg [arg …]
    在这里插入图片描述

  • 执行lua脚本:EVALSHA sha1 numkeys key [key …] arg [arg …]

  • 查看指定的脚本是否已经被保存在缓存当中:SCRIPT EXISTS sha1 [sha1 …]

  • 从脚本缓存中移除所有脚本:SCRIPT FLUSH

  • 杀死当前正在运行的 Lua 脚本:SCRIPT KILL

  • 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本:SCRIPT LOAD script

Lua的变量分为全局变量和局部变量。全局变量无需声明就可以直接使用,默认值是nil。

3. Lua脚本应用场景

3.1 laravel+Redis-lua脚本-限流漏桶算法

说明:漏桶算法的实现思路比较简单,水(请求)先流入到桶中,然后桶以一定的速度出水(接口有响应速率),当水流过大时(访问频率超过设置的阈值),系统服务就会拒绝请求。强行限制系统单位时间内访问的请求量。

漏桶算法有两个关键变量:桶的大小和出水速率,他们共同决定了单位时间内系统能接收的最大请求量。因为漏桶算法中桶的大小和出水速率是固定的参数。

你可能感兴趣的:(Redis,redis)