大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (正在更新...)

章节内容

上一节我们完成了如下的内容:

  • Redis功能扩展
  • Redis发布/订阅模式
  • Redis 事务相关
  • Redis 为什么是弱事务
  • 等等

背景介绍

这里是三台公网云服务器,每台 2C4G,搭建一个大数据的学习环境,供我学习。

之前已经在 VM 虚拟机上搭建过一次,但是没留下笔记,这次趁着前几天薅羊毛的3台机器,赶紧尝试在公网上搭建体验一下。

  • 2C4G 编号 h121
  • 2C4G 编号 h122
  • 2C2G 编号 h123

Lua 介绍

简介一下

Lua是一个轻量小巧的脚本语言,用标准的C语言编写并且开源。

应用场景有:

  • 游戏开发
  • 独立应用脚本
  • Web应用脚本
  • 数据库插件

下载安装

shell 复制代码
# 下载页面
http://www.lua.org/download.html
# 下载地址
https://www.lua.org/ftp/lua-5.4.7.tar.gz

EVAL

shell 复制代码
EVAL script numkeys key [key ...] arg [arg ...]

上述参数说明:

  • script:一段Lua脚本程序,它会被运行在Redis服务器的上下文中
  • numkeys:用于指定键名参数的个数
  • key:从eval的第三个参数开始算起,使用了numkeys个键,表示在脚本中所用到的那些Redis键。
  • arg:可以在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似 ARGV[1]、ARGV[2]等

我们可以通过这样的方式来调用它:

shell 复制代码
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

redis.call

  • 返回值就是Redis命令执行的返回值
  • 如果出错,会返回出错信息,不继续执行

redis.pcall

  • 返回值就是Redis命令执行的返回值
  • 如果出错,会记录错误信息,继续执行

EVALSHA

eval命令要求你在每次执行脚本的时候都发送一次脚本主体(Script Body)

Redis有一个内部缓存机制,因此它不会每次都重新编译脚本。为了减少贷款消耗,Redis实现了 EVALSHA,它接收的第一个参数不是脚本,而是脚本的 SHA1校验。

Script命令

  • Script Flush 清除所有脚本缓存
  • Script Exists 根据给定的脚本校验和,检查指定脚本是否存在于缓存脚本中
  • Script Load 将一个脚本装入脚本缓存 返回SHA1摘要 但并不立即运行
  • Script Kill 杀死当前正在运行的脚本

脚本测试1

编写一个脚本

shell 复制代码
vim /opt/wzk/test01.lua

写入如下内容

lua 复制代码
return redis.call('set',KEYS[1],ARGV[1])

保存后,执行Shell命令

shell 复制代码
./redis-cli --eval /opt/wzk/test01.lua name , kangkang

脚本测试2

编写脚本

shell 复制代码
vim /opt/wzk/test02.lua

写入如下内容

lua 复制代码
local key=KEYS[1]
local list=redis.call("lrange",key,0,-1);
return list;

保存后,执行Shell命令

shell 复制代码
./redis-cli --eval /opt/wzk/test02.lua list

执行的结果如下图:

案例1:原子计数器

脚本将实现将键的值+1,然后返回更新的值:

lua 复制代码
local key = KEYS[1]
local increment = tonumber(ARGV[1])

local current = tonumber(redis.call('GET', key) or 0)
local new_value = current + increment
redis.call('SET', key, new_value)

return new_value

案例2:检查并设置值

如果键的值等于给定的旧值,则将其设置为新值

lua 复制代码
local key = KEYS[1]
local old_value = ARGV[1]
local new_value = ARGV[2]

if redis.call('GET', key) == old_value then
    redis.call('SET', key, new_value)
    return 1
else
    return 0
end

案例3:列表的批量插入

lua 复制代码
local key = KEYS[1]
local elements = {}

for i = 1, #ARGV do
    table.insert(elements, ARGV[i])
end

redis.call('LPUSH', key, unpack(elements))
return redis.call('LRANGE', key, 0, -1)

案例3:获取并删除键值对

lua 复制代码
local key = KEYS[1]
local value = redis.call('GET', key)

if value then
    redis.call('DEL', key)
end

return value

案例4:哈希表字段的批量设置

lua 复制代码
local key = KEYS[1]

for i = 1, #ARGV, 2 do
    redis.call('HSET', key, ARGV[i], ARGV[i+1])
end

return redis.call('HGETALL', key)
相关推荐
2401_840192277 分钟前
k8s的crd、operator、cr分别是什么?
运维·分布式·kubernetes·prometheus
实习僧企业版12 分钟前
从“抢人”到“识人”,回归匹配本质
大数据·人工智能·雇主品牌·招聘技巧
SEO_juper19 分钟前
谷歌本地 GEO 权重拆解,全域 SEO 落地实操
大数据·网络·ai·seo·跨境电商·geo·跨境电商独立站
Irene199126 分钟前
大数据开发面试常问的 Linux 命令 总结
大数据·linux
GIOTTO情28 分钟前
大数据技术应用:媒介投放全域舆情风控与数据优化解决方案
大数据
跨境卫士苏苏1 小时前
经营变量持续增加之下跨境团队如何减少月度计划偏差
大数据·人工智能·内容运营·亚马逊·跨境
eastyuxiao1 小时前
能源电力领域的数字孪生应用场景有哪些
大数据·人工智能·智慧城市·能源·数字孪生
环流_1 小时前
Redis中string类型的应用场景
数据库·redis·缓存
倔强的石头_1 小时前
拒绝被复杂报表拖垮!HTAP场景下“标量子查询消除”硬核调优指南
数据库
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年5月13日
大数据·人工智能·python·信息可视化·语言模型·自然语言处理