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

news2024/9/20 18:47:50

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

目前已经更新到了:

  • 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应用脚本
  • 数据库插件

下载安装

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

EVAL

EVAL script numkeys key [key ...] arg [arg ...]

上述参数说明:

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

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

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

编写一个脚本

vim /opt/wzk/test01.lua

写入如下内容

return redis.call('set',KEYS[1],ARGV[1])

保存后,执行Shell命令

./redis-cli --eval /opt/wzk/test01.lua name , kangkang

在这里插入图片描述

脚本测试2

编写脚本

vim /opt/wzk/test02.lua

写入如下内容

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

保存后,执行Shell命令

./redis-cli --eval /opt/wzk/test02.lua list

执行的结果如下图:
在这里插入图片描述

案例1:原子计数器

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

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:检查并设置值

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

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:列表的批量插入

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:获取并删除键值对

local key = KEYS[1]
local value = redis.call('GET', key)

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

return value

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

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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运维团队如何借助分布式部署提升监控效率与可靠性

随着企业IT基础设施的日益复杂和分布式架构的广泛应用,传统的监控解决方案已经难以满足现代运维团队的需求。在这样的背景下,分布式部署作为一种新型的监控架构,以其灵活性、可扩展性和高可用性,成为了运维团队提升监控效率与可靠…

uni-app pinia搭建

1.新建store文件 新建index.js,代码: // import { // createPinia // } from pinia //const store createPinia() import * as Pinia from pinia const pinia Pinia.createPinia() export * from "./modules/user" export * from ".…

MATLAB算法实战应用案例精讲-【数模应用】Kappa一致性检验(附MATLAB、python和R语言代码实现)

目录 前言 算法原理 Kappa系数 什么是一致性检验? 如何完成一致性检验? (一)ICC组内相关系数 (二)Kappa一致性系数 (三)Kendall W 协调系数 (四)Bland-Altman图 检验一致性方法 SPSS SPSSAU 一、案例介绍 二、问题分析 三、软件操作及结果解读 四、结…

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.8云原生架构

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

【BUG】已解决:ValueError: All arrays must be of the same length

ValueError: All arrays must be of the same length 目录 ValueError: All arrays must be of the same length 【常见模块错误】 【解决方案】 问题原因 解决方法 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰&…

Transformer论文理解

学习一个东西之前首先要明白要去了解什么? 概念(组成),性质,特点,作用(用处) 概念: transformer是一种自然语言处理(NLP)和其他序列到序列(seq2seq)任务&…

大数据技术--实验01-Hadoop的安装与使用【实测可行】

使用下面表中的软件版本进行配置: 准备好后,按照下面的步骤进行配置。 配置VMware网络 在VMWare主界面,点击“编辑”>“虚拟网络编辑”菜单进入虚拟网卡参数设置界面。选择VMnet8条目,点击“NAT设置”按钮后可以看到我们的VM…

遇到not allow unquoted fieldName怎么办

前言 Exception in thread "main" com.alibaba.fastjson2.JSONException: not allow unquoted fieldName, offset 2, character , line 1, column 3, fastjson-version 2.0.25 { "data":null, "code":200, "msg":"成功"…

使用Django Rest Framework构建API

Django Rest Framework (DRF) 是一个强大且灵活的工具集,用以构建Web API。它基于Django,一个非常流行的Python Web框架。在本文中,我们将深入探讨如何使用DRF来构建一个高效、结构化的API。 目录 使用Django Rest Framework构建API 一、环…

c#Action委托和Func委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Action委托 {internal class Program{static void PrintString(){Console.WriteLine("hello world.");}static void PrintInt(int …

我的Google Vertex AI实践经验分享

我的Google Vertex AI实践经验分享 前言 作为一名忙碌的开发者,我时常希望能减少睡眠时间以完成更多工作。在这个过程中,我尝试了多种方法,并设计了多个概念验证项目。本文分享了我在使用Google的生成式AI服务Vertex AI时的实践经验。需要注…

秋招突击——7/22——复习{堆——前K个高频元素}——新作{回溯——单次搜索、分割回文串。链表——环形链表II,合并两个有序链表}

文章目录 引言复习堆堆——前K个高频元素个人实现复习实现二参考实现 新作单词搜索个人实现参考实现 分割回文串个人实现参考实现 环形链表II个人实现参考实现 两个有序链表个人实现 总结 引言 又是充满挑战性的一天,继续完成我们的任务吧!继续往下刷&a…

学习React(状态管理)

随着你的应用不断变大,更有意识的去关注应用状态如何组织,以及数据如何在组件之间流动会对你很有帮助。冗余或重复的状态往往是缺陷的根源。在本节中,你将学习如何组织好状态,如何保持状态更新逻辑的可维护性,以及如何…

【SpingCloud】客户端与服务端负载均衡机制,微服务负载均衡NacosLoadBalancer, 拓展:OSI七层网络模型

客户端与服务端负载均衡机制 可能有第一次听说集群和负载均衡,所以呢,我们先来做一个介绍,然后再聊服务端与客户端的负载均衡区别。 集群与负载均衡 负载均衡是基于集群的,如果没有集群,则没有负载均衡这一个说法。 …

CSS:顶部导航栏固定位置、分类标题栏、底部提示文案固定位置

一、效果图 页面body的css代码 body {position: absolute;width: 100%;height: 100vh;padding: 0;margin: 0;top: 0;left: 0;bottom: 0;background-color #eee;/* overflow: auto;overflow-y: scroll; *//* ::-webkit-scrollbar {display: none;} */ }.content-root {width: 1…

python多进程加速函数运行

python多进程运行可以使函数运行在程序主进程以外,减少主进程的调用,并且可以加速子进程的运行速度   为了测试多进程的加速效果,我们可以通过创建一个包含计算密集型任务的函数,并使用多进程来并行执行这些任务。我们将对比单进…

Telegram曝零日漏洞,可伪装成视频攻击安卓用户

ESET Research在一个地下论坛上发现了一个针对Android Telegram的零日漏洞广告。 ESET将该漏洞命名为“EvilVideo”,并将其报告给Telegram,Telegram于7月11日更新了该应用程序。 EvilVideo允许攻击者发送恶意的有效载荷,这些载荷以视频文件…

《白话机器学习的数学》第2章——学习回归

2.1设置问题 1.机器学习所做的事情正是从数据中进行学习,然后给出预测值。 2.2定义模型 1.一次函数的表达式: 其中θ叫做参数。 在统计学领域,人们常常使用 θ 来表示未知数和推测值。采用 θ加数字下标的形式,是为了防止当未知数…

熟悉set/map了解KV模型和pair结构

set基本介绍 set是key模型,本质是确定一个 元素在不在此容器中,也就是说 set中存储的是一个单一数据 1. set是按照一定次序存储元素的容器 2. 在set中,元素的value也标识它(value就是key,类型为T), 并且每个value必须是唯一的。set中的元素不…

PHP教程001:PHP介绍和环境配置

文章目录 1、php是什么2、php能做什么3、php程序执行流程4、需要什么基础5、环境介绍5.1、WEB环境5.2、环境集成包3、phpStudio软件下载 1、php是什么 通用:跨平台,如windows、Linux、MacOS开源免费服务器端脚本语言 2、php能做什么 可以快速动态的生…