Redis Lua脚本原理

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

2.6版本之后支持嵌入Lua脚本,客户端使用Lua脚本,直接在服务器端原子的执行多条命令

Lua脚本执行过程

创建并修改Lua环境

  • 1 创建基础Lua环境
  • 2 载入函数库
  • 3 创建全局表格Lua
  • 4 替换随机函数
  • 5 创建排序辅助函数
  • 6 创建redis.pcall函数
  • 7 全局环境保护
  • 8 修改后的Lua环境保存到服务器状态的Lua属性,等待脚本执行

Redis中带有不确定性的命令:

SINTER
SUNION
SDIFF
SMEMEBERS
HKEYS
HVALS
KEYS

注意:

  • Redis提供了排序函数,使用上述命令后,会返回相同的排序结果
  • Redis确保检查创建变量时,添加local等参数,但是没有禁止修改已经存在的全局变量,因此使用时应谨慎。
  • 由于Redis使用串行化的方式执行,因此某一特定时间,只有一个脚本能被放进Lua环境里面运行。

环境协作组件

环境组件:

  • 一个是用于执行Lua脚本的伪客户端
  • 一个用于保存Lua脚本的字典。

执行Lua脚本的伪客户端

使用redis.call或者redis.pcall执行Redis命令:

  • 1 将redis.call或者redis.pcall传给伪客户端
  • 2 伪客户端将执行的命令传给执行器
  • 3 执行器执行命令,返回给伪客户端
  • 4 伪客户端把结果返回给Lua环境
  • 5 Lua环境把结果返回给redis.call或者redis.pcall函数
  • 6 redis.call或者redis.pcall返回结果给调用者

lua_scripts字典

保存Lua脚本的SHA1【校验和】checksum,值是对应的脚本。Redis会把EVAL命令执行过的脚本,或者SCRIPT LOAD加载的脚本都保存在字典中。

字典的作用:实现SCRIPT EXISTS命令;实现脚本的复制

EVAL命令的实现

  • 1 根据客户端给定的脚本,在Lua环境中定义Lua函数
  • 2 将客户端给定的脚本保存到lua_scripts字段,进一步使用
  • 3 执行刚刚在lua中定义的函数,执行客户端给定的lua脚本

通过函数保存传入的脚本好处:

  • 1 执行方便
  • 2 保持局部性
  • 3 如果定义过一次,只要使用校验和即可。

准备执行脚本:

  • 1 将EVAL命令传入的键名参数和脚本参数保存在KEYS数组和ARGV数组中
  • 2 装载超时钩子
  • 3 执行脚本函数
  • 4 移除钩子
  • 5 结果放入缓冲区
  • 5 垃圾回收

使用EVALSHA “xxx校验和”0 就可执行EVAL "return 'hello world!'" 0

脚本管理命令实现

SCRIPT FLUSH 用于清除服务器中lua有关的脚本,释放lua_scripts字典,关闭现有的lua环境,并重新创建
SCRIPT EXISTS 输入SHA1校验和,判断是否存在
SCRIPT LOAD 与EVAL相同,创建对应的lua函数,存放到字典中
SCRIPT KILL 使用钩子定期检查脚本运行时间,如果没有执行过,可以使用SCRIPT KILL杀掉;如果执行过,只能使用SHUTDOWN nosave停止服务器

脚本的复制

相同的EVALSHA复制操作,从服务器有可能找不到

本文转自博客园xingoo的博客,原文链接:Redis Lua脚本原理,如需转载请自行联系原博主。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1天前
|
监控 安全
公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
16 6
|
2月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
67 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
2月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
43 2
|
2月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
33 2
|
2月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
68 1
|
2月前
|
NoSQL Java 关系型数据库
阿里 P7二面:Redis 执行 Lua,到底能不能保证原子性?
Redis 和 Lua,两个看似风流马不相及的技术点,为何能产生“爱”的火花,成为工作开发中的黄金搭档?技术面试中更是高频出现,Redis 执行 Lua 到底能不能保证原子性?今天就来聊一聊。 
95 1
|
2月前
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
178 0
|
NoSQL Java 应用服务中间件
欲求不满之 Redis Lua 脚本的执行原理
Redis 提供了非常丰富的指令集,但是用户依然不满足,希望可以自定义扩充若干指令来完成一些特定领域的问题。Redis 为这样的用户场景提供了 lua 脚本支持,用户可以向服务器发送 lua 脚本来执行自定义动作,获取脚本的响应数据。
1281 0
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
78 6
|
28天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题