Redis架构篇 - Redis与Lua脚本

news/2024/4/26 2:53:24/文章来源:https://blog.csdn.net/qq_34561892/article/details/129160662

在Redis中使用lua

在 Redis 中使用 lua,有如下三个优点:

  • 可以批量执行命令。一次性发送多个命令,减少网络开销。
  • 原子性。Redis将整个lua脚本作为一个整体执行,保证了原子性。
  • 可以复用命令。对于复杂的命令组合,可以放到文件中,从而实现命令复用。

1、在Redis中可以使用eval命令执行lua脚本

eval 命令的语法格式如下:

EVAL script numkeys [key [key ...]] [arg [arg ...]]
  • script:表示 lua 脚本内容
  • numKeys:表示全局变量 KEYS 的数量,如果没有全局变量 KEYS,则为 0
  • key…:(可选参数)表示参数,下标从 1 开始
  • value…:(可选参数)表示参数值,下标从 1 开始
eval "return 'hello world'" 0

2、lua脚本中也可以调用Redis命令

语法格式:

redis.call(command, key [, param ...])
  • command:Redis 命令,记得外层使用单引号
  • key:被操作的键
  • param:被操作的键对应的值
eval "redis.call('set', 'hello', 'world')" 0
eval "redis.call('set', KEYS[1], ARGV[1])" 1 hello world

3、Redis执行lua文件

比如 hello.lua 文件的内容如下:

local value = redis.call('exists', KEYS[1])
if (value ~= 0) thenvalue = tonumber(redis.call('get', KEYS[1]))
else 	value = 1
end
value = value * tonumber(ARGV[1])
redis.call('set', KEYS[1], value)
return value

然后在 Redis 中执行该文件:

redis-cli -h 10.211.55.11 -p 6379 -a 123 --eval "hello.lua" hello , 2

注意空格

5 秒限制访问 10 次(成功返回 1;失败返回 0)

local num = redis.call('incr', KEYS[1])
if tonumber(num) == 1 thenredis.call('expire', KEYS[1], ARGV[1])return 1
elseif tonumber(num) > tonumber(ARGV[2])return 0
else return 0
end

然后在 Redis 中执行该文件:

redis-cli -h 10.211.55.11 -p 6379 -a 123 --eval ip_limit.lua app:ip:limit:192.168.0.106 , 5 10

注意空格

缓存lua脚本

在 lua 脚本内容比较长的情况下,如果每次调用脚本都需要将整个脚本传给 Redis 服务端,会产生比较大的网络开销。

为了解决这个问题,Redis 可以缓存 lua 脚本并生成 SHA1 摘要码,后续可以直接使用这个摘要码来执行 lua 脚本。

语法格式

SCRIPT LOAD <script>
EVALSHA <sha1> <numkeys> [key [key ...]] [arg [arg ...]]

比如执行一个输出 hello 的脚本。

script load "return 'hello'"
evalsha "1b936e3fe509bcbc9cd0664897bbe8fd0cac101b" 0

再比如实现自乘 2 的功能。

local curVal = redis.call('get', KEYS[1])
if curVal == false thencurVal = 0
else curVal = tonumber(curVal)
end
curVal = curVal * tonumber(ARGV[1])
redis.call('set', KEYS[1], curVal)
return curVal

然后把这个脚本变成单行,语句之间用分号分割。

local curVal = redis.call('get', KEYS[1]); if curVal == false then curVal = 0 else curVal = tonumber(curVal) end; curVal = curVal * tonumber(ARGV[1]); redis.call('set', KEYS[1], curVal); return curVal

接着调用 script load 命令,缓存这个lua脚本。

script load "local curVal = redis.call('get', KEYS[1]); if curVal == false then curVal = 0 else curVal = tonumber(curVal) end; curVal = curVal * tonumber(ARGV[1]); redis.call('set', KEYS[1], curVal); return curVal" 
evalsha "1b936e3fe509bcbc9cd0664897bbe8fd0cac101c" 1 num 2

脚本超时

执行如下命令会导致其它命令进入等待状态。

eval "while true do end" 0

Redis 对于脚本执行有一个超时时间,默认 5 秒(lua-time-limit 5000)。超过 5 秒,其它客户端的命令不会再等待,而是直接返回“BUSY”错误。该脚本过了 5 秒超时时间并不会停止执行。

有两个命令可以终止脚本的执行:script kill、shutdown nosave。

但是并不是所有的 lua 脚本执行都可以用 script kill 命令终止,如果 lua 脚本执行的是对 Redis 数据进行修改操作,为了保证脚本执行的原子性,导致 script kill 命令不会终止脚本的执行。

eval "redis.call('set', 'hello', 'world') while true do end" 0

对此,可以使用 shutdown nosave 命令,直接将 Redis 服务停掉。

shutdown nosave 与 shutdown 的区别是:它不会进行持久化操作,意味着上一次快照之后的数据库修改操作都会丢失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72750.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++常用stl算法

1、头文件 这些算法通常包含在头文件<algorithm> <functional> <numeric>中。 2、常用遍历算法 for_each(v.begin(),v.end(), 元素处理函数/仿函数) 注意&#xff1a;在使用transform转存时&#xff0c;目标容器需要提取开辟合适的空间。 void printfunc(…

数学小课堂:数学的线索(从猜想到定理再到应用的整个过程)

文章目录 引言I 勾股定理1.1 勾三股四弦五1.2 数学和自然科学的三个本质差别1.3 总结引言 从猜想到定理再到应用的整个过程是数学发展和体系构建常常经历的步骤。 I 勾股定理 勾股定理: 直角三角形两条直角边的平方之和等于斜边的平方,这个定理在国外都被称为毕达哥拉斯定理…

渗透中超全的Google hack语法

inurl:Login 将返回url中含有Login的网页intitle:后台登录管理员 将返回含有管理员后台的网页intext:后台登录 将返回含有后台的网页inurl:/admin/login.php 将返回含有admin后台的网页inurl:/phpmyadmin/index.php 将返回含有phpmyadmin后台的网页site:http://baidu.com inur:…

云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM

前言&#xff1a; FusionCompute架构 (CNA、VRM) CNA(ComputingNode Agent):计算节点代理VNA虚拟节点代理&#xff0c;部署在CNA上&#xff0c;实施计算、存储、网络的虚拟化的配置管理。VRM(Virtual Resource Manager):虚拟资源管理器 VNA可以省略不安装 本次实验使用的是V…

还在用chatGPT聊天?《元宇宙2086》已开始用AIGC做漫画连载了!

ChatGPT 是由 OpenAI开发的一个人工智能聊天机器人程序&#xff0c;于 2022 年 11 月推出。该程序使用基于 GPT-3.5架构的大型语言模型并通过强化学习进行训练。 ChatGPT 目前仍以文字方式互动&#xff0c;而除了可以透过人类自然对话方式进行交互&#xff0c;还可以用于相对复…

关于微前端,你想知道的都在这!

更多请关注微前端专题 https://codeteenager.github.io/Micro-Frontends/ 介绍 微前端官网&#xff1a;https://micro-frontends.org/ 问题&#xff1a;如何实现多个应用之间的资源共享&#xff1f; 之前比较多的处理方式是npm包形式抽离和引用&#xff0c;比如多个应用项目之…

EMR Studio Workspace 访问 Github ( 公网Git仓库 )

EMR Studio Workspace访问公网Git仓库 会遇到很多问题,由于EMR Studio不能给出任何有用的错误信息,导致排查起来非常麻烦。下面总结了若干项注意事项,可以避免踩坑。如果你遇到了同样的问题,请根据以下部分或全部建议去修正你的环境,问题即可解决。本文地址:https://laur…

因子的有效性检验(IC)

使用神经网络的预测值作为因子载荷&#xff08;因子暴露&#xff0c;因子值 factor&#xff09;时&#xff0c; 我们需要知道这个因子是否是有效的&#xff0c;所以要做因子的有效性检验。 当前的学术论文给出的IC&#xff0c; rankIC 这些都是属于判断因子是否有效的metric 因…

gdb的简单练习

题目来自《ctf安全竞赛入门》1.用vim写代码vim gdb.c#include "stdio.h" #include "stdlib.h" void main() {int i 100;int j 101;if (i j){printf("bingooooooooo.");system("/bin/sh");}elseprintf("error............&quo…

面向对象的程序设计C++课堂复盘总结 C语言复习+C++基础语法

Stay Hungry&#xff0c;Stay Foolish. 任何人都能写出机器能看懂的代码&#xff0c;但只有优秀的程序员才能写出人能看懂的代码。 有两种写程序的方式&#xff1a;一种是把代码写得非常复杂&#xff0c;以至于 “看不出明显的错误”&#xff1b;另一种是把代码写得非常简单&am…

DolphinScheduler第一章:环境安装

系列文章目录 DolphinScheduler第一章&#xff1a;环境安装 文章目录系列文章目录前言一、环境准备1.上传文件2.数据库配置3.配置安装文件二、集群部署1.数据部署2.部署 DolphinScheduler3. DolphinScheduler 启停命令总结前言 我们现在开始学习hadoop中的DolphinScheduler组…

Spring Cloud Nacos源码讲解(一)- Nacos源码分析开篇

Nacos源码开篇 Nacos服务注册与发现源码剖析 Nacos核心功能点 服务注册&#xff1a;Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务&#xff0c;提供自身的元数据&#xff0c;比如ip地址、端口等信息。Nacos Server接收到注册请求后&#xff0c;就会把这…

Linux基础命令-uname显示系统内核信息

前言 这个命令主要是显示系统内核的相关信息&#xff0c;一般需要查看内核信息才会使用到这个命令&#xff0c;一起来看看吧。 一 命令的介绍 uname命令来自于英文词组“Unix name”的缩写&#xff0c;其功能是用于查看系统主机名、内核及硬件架构等信息。如果不加任务参数&am…

GPT-4——比GPT-3强100倍

GPT-4——比GPT-3强100倍 当前世界上最强大的人工智能系统当属ChatGPT。推出2个月用户数就突破1亿。ChatGPT是当下最炙手可热的话题&#xff0c;科技圈几乎人人都在讨论。这边ChatGPT的热度还在不断攀升&#xff0c;另一边来自《纽约时报》的最新报道称ChatGPT即将被自家超越&…

深入浅出C++ ——二叉搜索树

文章目录一、二叉搜索树概念二、二叉搜索树操作1. 二叉搜索树的查找2. 二叉搜索树的插入3. 二叉搜索树的删除三、二叉搜索树的实现四、二叉搜索树的性能分析一、二叉搜索树概念 二叉搜索树又称二叉排序树/二次查找树&#xff0c;它是一棵空树或者是每颗子树都具有以下性质的二叉…

[qiankun]-多页签缓存

[qiankun]-多页签缓存环境功能需求多页签缓存方案方案1.主服务进行html替换方案2.微服务vnode 替换方案3.每个微服务都不卸载微服务加载方式的选择微服务的路由路径选择微服务的缓存工具微服务的容器使用tab作为微服务的挂载容器使用微服务路由作为微服务的挂载容器场景描述微服…

干货解答:如何设置Facebook Messenger 自动回复?

Facebook Messenger 自动回复消息是提升客户体验的有效方法。在本文中&#xff0c;我们将探讨设置Facebook 自动响应和不同的创建方法 Facebook 自动回复。另外&#xff0c;我们准备了一些最受欢迎的 Facebook Messenger 自动回复消息。Facebook Messenger 自动回复&#xff1a…

https加密原理详解,带你搞懂它为什么比http更安全

文章目录http的缺点对称加密非对称加密数字签名数字证书验证身份数字摘要数字签名验证内容的完整性总结http的缺点 http是超文本传输协议&#xff0c;使用http协议进行通信有如下缺点&#xff1a; http没有提供任何数据加密机制&#xff0c;数据通信使用明文通信&#xff0c;…

x86架构设备的OpenWrt的空间扩容问题

openwrt固件是squashfs-combined-efi非exf4格式 直接将原有根分区扩容 用插件是&#xff1a;fdisk,losetup,resize2fs,blkid df -h fdisk -l fdisk /dev/sda //进入fdisk分区管理工具注意fdisk后参数是磁盘名称&#xff0c;是要根据实际情况填写 fdisk /dev/sda //进入fdi…

JavaEE简单示例——<select>中的查询参数传递和结果集封装自动映射关系

简单介绍&#xff1a; 在之前我们在讲SQL映射文件中的映射查询语句的<select>标签的时候&#xff0c;对其中的四个常用属性的讲解并不是那么的透彻&#xff0c;今天就来详细的解释<select>的四个常用属性的具体含义以及<select>标签在进行查询的时候查询参数…