Redis的Lua扩展
时间:2022-07-22
本文章向大家介绍Redis的Lua扩展,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
基本环境
# redis
➜ ~ redis-server -v
Redis server v=3.2.6
# lua
➜ ~ lua -v
Lua 5.2.4 Copyright (C) 1994-2015 Lua.org, PUC-Rio
参考文档:
概要
Redis从2.6版本开始引入了对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务器端执行多个Redis命令。
使用脚本的好处
- 较少网络开销。可将多个请求通过脚本的形式一次性发送,较少网络时延
- 原子操作。Redis会将整个脚本作为一个整体执行,中间不会插入其他命令。因此脚本编写过程无需担心出现竞态条件,无需使用事务
- 复用。客户端发送的脚本会永久存在Redis中。这样其他客户端可复用这一脚本而无需使用代码完成相同逻辑
使用脚本的限制
- 不支持集群。
- 原子操作。如果脚本执行耗时,会对其他操作造成影响
使用
调用Lua脚本的语法
传入脚本文件
# KEYS 与 ARGV 中间使用 “ , ” 逗号分隔,前后有空格
$ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...
* --eval,告诉redis-cli读取并运行后面的lua脚本
* path/to/redis.lua,是lua脚本的位置,也可以直接为脚本字符串。是一个Lua 5.1 script。
* KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取
* ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。
传入脚本字符串
127.0.0.1:6379> eval script numkeys key [key ...] arg [arg ...]
* eval: 将要执行脚本
* script: 脚本字符串
* numkeys: KEY参数个数
* key ... : 操作的键
* arg ... : 参数
使用示例
KEYS ARGV
# xx.lua
return {KEYS, ARGV}
➜ ~ redis-cli --eval xx.lua k1 k2 k3 , a1 a2 a3
1) 1) "k1"
2) "k2"
3) "k3"
2) 1) "a1"
2) "a2"
3) "a3"
➜ ~ redis-cli
127.0.0.1:6379> eval "redis.call('set', 'name', 'xx')" 0
(nil)
127.0.0.1:6379> eval "redis.call('get', 'name')" 0
(nil)
127.0.0.1:6379> eval "return redis.call('get', 'name')" 0
"xx"
- 区块链,不是比特币(1)
- 小程序缓存 删不删你都该知道的事儿
- 32位 or 64位:Apache CloudStack系统VM架构选择
- Apache CloudStack系统VM架构选择
- ASP.NET MVC Controller激活系统详解:IoC的应用[下篇]
- 使用Docker的Alluxio群集设置
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[中]:管道如何处理请求
- ASP.NET MVC Model元数据及其定制: 初识Model元数据
- 如何在企业中融入机器学习
- How ASP.NET MVC Works?
- 如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?
- “前.NET Core时代”如何实现跨平台代码重用 ——源文件重用
- 简析Linux主要应用领域及范围
- ASP.NET MVC Controller激活系统详解:默认实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 01 . Mysql简介及部署
- jquery点击按钮,添加一行input输入框
- 02 . Mysql基础操作及增删改查
- 03 . MysSQL权限和备份
- 04 . Mysql主从复制和Mycat读写分离
- 02 . Python之数据类型
- 05 . k8s实战之部署PHP/JAVA网站
- 拖不得了,Android11真的来了,最全适配实践指南奉上
- 03 . Python入门之运算符
- 04 . Python入门之条件语句
- vue-element的select下拉框赋值
- 女儿拿着小天才电话手表问我App启动流程
- 数据库三问—快手真题
- 新人手册系列:思考篇-稳定性&大促保障
- RecycleView三问—腾讯真题