当前位置: 首页 > news >正文

了解一下Redis Stack扩展功能

Redis Stack扩展功能

一、Redis JSON:让 Redis 原生支持 JSON 数据类型

什么是 Redis JSON?

Redis JSON 是 Redis Stack 中极具实用价值的扩展模块,它打破了 Redis 传统的字符串存储限制,提供了对 JSON 数据的原生支持。这意味着我们可以直接在 Redis 中存储、查询和修改 JSON 数据,无需再将 JSON 转为字符串存储后进行二次解析,大幅简化了数据处理流程。

核心指令实战指南

1. JSON.SET:存储 JSON 数据的基石

JSON.SET用于向 Redis 中写入 JSON 数据,其基本语法为:
JSON.SET key $ '{"字段名":"值"}'
其中$代表 JSON 数据的根节点,后续所有字段路径都基于此节点展开。

基础示例

# 存储一个用户信息JSON对象
JSON.SET user $ '{"name":"loulan","age":18,"hobbies":["reading"]}'

进阶用法

  • 条件设置:通过NX参数实现 “字段不存在时才设置”,避免覆盖已有数据:

    # 仅当address字段不存在时,添加地址信息
    JSON.SET user $.address '{"city":"Changsha","country":"China"}' NX
    
  • 数组操作:使用JSON.ARRAPPEND向 JSON 数组添加元素:

    # 向hobbies数组添加"swimming"
    JSON.ARRAPPEND user $.hobbies '"swimming"'
    

2. JSON.GET:精准提取 JSON 数据

JSON.GET支持通过路径查询 JSON 中的特定字段,无需读取完整对象后再解析,显著提升效率。

示例

# 获取完整用户信息
JSON.GET user# 仅获取用户名
JSON.GET user $.name# 同时获取年龄和爱好
JSON.GET user $.age $.hobbies

3. 其他高频指令

  • JSON.NUMINCRBY:对 JSON 中的数值字段进行自增操作,如将年龄增加 2 岁:
    JSON.NUMINCRBY user $.age 2
  • JSON.TYPE:查看字段的数据类型,辅助数据校验:
    JSON.TYPE user $.name(返回 "string")
  • JSON.DEL:删除指定字段,如移除地址信息:
    JSON.DEL user $.address

为什么选择 Redis JSON?

相比将 JSON 作为字符串存储,Redis JSON 的优势体现在三个核心维度:

  1. 性能与内存优化:底层采用高效二进制格式存储,读写性能远超文本格式,且内存占用更低。根据官方测试,其性能可媲美 MongoDB 等传统 NoSQL 数据库。
  2. 高效查询能力:基于树状结构存储 JSON,支持直接定位子元素,避免全量解析,查询效率提升显著。
  3. 无缝集成 Redis 生态:可与 Redis 的 TTL、事务、发布 / 订阅等功能完美配合,例如为 JSON 数据设置过期时间,或在事务中原子性修改 JSON 字段。

典型使用场景

  • 分布式系统中的用户会话管理:存储用户登录信息(如权限、角色、登录时间),支持高效字段更新。
  • 电商商品详情缓存:直接存储包含多维度信息(名称、价格、规格、评价)的商品 JSON,快速响应商品详情页查询。

二、Search And Query:让 Redis 拥有搜索引擎能力

当 Redis 中存储的数据量达到十万甚至百万级时,如何高效检索数据成为关键问题。Redis Stack 的 Search And Query 模块正是为解决这一痛点而生,它让 Redis 具备了类似 ElasticSearch 的复杂搜索能力。

传统搜索方式的局限性

在 Redis Stack 出现前,开发者通常依赖两种方式检索数据:

  • keys *:遍历所有键,会导致线程阻塞,生产环境严格禁用。
  • scan:通过游标迭代返回部分结果,避免阻塞,但仅支持简单的键名匹配,无法实现字段级筛选。

例如,电商场景中需要 “价格在 2000-5000 元且品牌为华为的手机” 这类多条件筛选时,传统方式完全无法满足。

Search And Query 的实战用法

Search And Query 模块通过 “索引 + 结构化查询” 实现复杂搜索,支持 HASH 和 JSON 两种数据结构,以下以 JSON 为例演示核心流程。

1. 创建索引:定义搜索规则

使用FT.CREATE创建索引,指定需要检索的字段及类型:

# 创建名为productIndex的索引,基于JSON数据,对name(文本)和price(数值)建立索引
FT.CREATE productIndex ON JSON SCHEMA $.name AS name TEXT $.price AS price NUMERIC

2. 插入数据:准备检索样本

通过JSON.SET插入符合索引规则的 JSON 数据:

# 插入10条华为手机数据
JSON.SET phone:1 $ '{"id":1,"name":"HUAWEI 1","price":1999}'
JSON.SET phone:2 $ '{"id":2,"name":"HUAWEI 2","price":2999}'
# ... 省略phone:3至phone:10

3. 执行搜索:多条件筛选

使用FT.SEARCH实现复杂查询,例如 “名称包含 HUAWEI 且价格在 1000-5000 元的手机”:

# 返回id和name字段,符合条件的结果
FT.SEARCH productIndex "@name:HUAWEI @price:[1000 5000]" RETURN 2 id name

核心优势与适用场景

  • 替代传统搜索引擎:无需将数据同步到 ElasticSearch,直接在 Redis 中完成筛选,减少数据迁移成本。
  • 低延迟响应:依托 Redis 的内存存储特性,搜索响应速度远超磁盘存储的搜索引擎。
  • 适用场景:电商商品筛选、日志快速检索、用户信息多条件查询等。

三、布隆过滤器:海量数据中的快速存在性判断

在处理海量数据时,“判断一个元素是否存在于集合中” 是常见需求,例如 “用户是否已签到”“用户名是否已注册”。布隆过滤器(Bloom Filter)作为一种空间效率极高的概率型数据结构,成为解决这类问题的理想选择。

布隆过滤器的核心原理

布隆过滤器通过两个核心组件实现高效判断:

  1. 二进制位数组:初始时所有位均为 0,用于标记元素是否 “可能存在”。
  2. 多个哈希函数:将输入元素映射到位数组的多个位置,插入元素时将这些位置设为 1。

布隆过滤器

判断逻辑

  • 若元素映射的所有位置均为 1,则 “可能存在”(存在误判);
  • 若任一位置为 0,则 “一定不存在”。

分析布隆过滤器结构图可知,d哈希之后的位数组的值与a或b哈希之后的数组位存在重叠,这也解释了为什么都满足了只是可能存在,而不满足则一定不存在;同时也理解了为什么不能删除元素

实战示例:从 Guava 到 Redis

1. Guava 布隆过滤器(本地实现)

Guava 是 Java 中常用的布隆过滤器实现库,通过指定容量和误判率初始化:

// 引入依赖
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.1.0-jre</version>
</dependency>// 代码示例:存储A-Z并判断
BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8), 10000,  // 容量0.01    // 误判率
);
// 存入A-Z
for (int i = 64; i <= 90; i++) {bloomFilter.put(String.valueOf((char) i));
}
System.out.println(bloomFilter.mightContain("A")); // true
System.out.println(bloomFilter.mightContain("a")); // false

2. Redis 布隆过滤器(分布式场景)

Redis 通过BF系列指令原生支持布隆过滤器,适合分布式系统中的共享判断逻辑:

# 创建过滤器:容量1000,误判率0.01,不扩容
BF.RESERVE userSign 0.01 1000 NONSCALING# 单个添加:用户A签到
BF.ADD userSign A# 批量添加:用户B、C、D签到
BF.MADD userSign B C D# 判断用户是否签到:返回1表示可能已签,0表示未签
BF.EXISTS userSign A  # 1
BF.EXISTS userSign X  # 0

局限性与适用场景

  • 局限性:存在误判率(可通过增大位数组或增加哈希函数降低),且无法删除元素。
  • 适用场景
    • 缓存穿透防护:快速判断请求的 key 是否存在,避免无效数据库查询。
    • 重复操作拦截:如限制用户重复签到、重复下单等。

实际业务中,我们可以通过lua脚本封装自己的工具类

四、Cuckoo Filter:支持删除的布隆过滤器改进版

布隆过滤器的最大痛点是 “无法删除元素”,而 Cuckoo Filter(布谷鸟过滤器)通过优化数据结构解决了这一问题,同时保持了高效的空间利用率。

Cuckoo Filter 的核心改进

  • 存储结构:采用 “桶(Bucket)” 存储元素指纹(压缩后的元素信息),每个桶可存放多个指纹,默认每个桶存 2 个。
  • 删除支持:通过指纹反向定位元素位置,实现精确删除,解决了布隆过滤器的历史难题。
  • 参数调优
    • BUSKETSIZE:每个桶的元素数,越大空间利用率越高,但误判率也越高。
    • MAXITERATIONS:插入时的最大重试次数,影响性能与空间利用率。

实战示例

# 创建过滤器:容量1000,桶大小2,最大重试20次
CF.RESERVE userLogin 1000 BUSKETSIZE 2 MAXITERATIONS 20# 添加元素:用户登录记录
CF.ADD userLogin user123# 判断元素是否存在
CF.EXISTS userLogin user123  # 1# 删除元素:用户退出登录
CF.DEL userLogin user123# 再次判断:已删除
CF.EXISTS userLogin user123  # 0

适用场景

适合需要动态更新集合的场景,如:

  • 在线用户列表:实时添加 / 删除在线用户,快速判断用户状态。
  • 临时黑名单:动态封禁 / 解封账号,高效拦截恶意请求。

五、手动安装 Redis 扩展模块:本地环境实战

Redis Stack 的扩展模块不仅可在 Redis Cloud 中使用,也能手动安装到本地 Redis 服务,步骤如下:

  1. 下载模块:从 Redis 官网下载对应 Redis 版本和操作系统的模块文件(如redisbloom.so),建议通过源码编译确保兼容性。

  2. 配置加载:修改 Redis 配置文件(redis.conf),添加模块路径:

    loadmodule /path/to/redisbloom.so  # 替换为实际路径
    
  3. 重启验证

    • 重启 Redis 服务:redis-server /path/to/redis.conf

    • 查看模块加载情况:

127.0.0.1:6379> MODULE LIST
# 若显示"name":"bf"等信息,说明加载成功

  1. 注意事项

    • 模块文件需赋予可执行权限:chmod +x redisbloom.so,否则 Redis 启动失败。
    • 模块版本需与 Redis 版本匹配,否则可能出现兼容性问题

总结

Redis Stack 通过 JSON、Search And Query、布隆过滤器、Cuckoo Filter 等扩展模块,极大地丰富了 Redis 的功能边界。无论是处理结构化 JSON 数据、实现复杂搜索,还是解决海量数据的存在性判断问题,Redis Stack 都能提供高效且易用的解决方案。对于开发者而言,掌握这些扩展功能不仅能提升业务处理效率,更能让 Redis 在更多场景中发挥核心作用,从缓存工具升级为全能型数据处理平台。

如果你还在为 JSON 存储繁琐、搜索能力不足或海量数据判断发愁,不妨试试 Redis Stack 的这些扩展功能,相信会给你的开发工作带来全新的体验。

相关文章:

了解一下Redis Stack扩展功能

Redis Stack扩展功能 一、Redis JSON:让 Redis 原生支持 JSON 数据类型 什么是 Redis JSON? Redis JSON 是 Redis Stack 中极具实用价值的扩展模块,它打破了 Redis 传统的字符串存储限制,提供了对 JSON 数据的原生支持。这意味着我们可以直接在 Redis 中存储、查询和修改 J…...

游戏运行库合集 集成VC++、.NET、DirectX、XNA等千款组件,一键安装游戏必备依赖库 - 指南

游戏运行库合集 集成VC++、.NET、DirectX、XNA等千款组件,一键安装游戏必备依赖库 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…...

【CE】图形化CE游戏教程通关手册 - 详解

【CE】图形化CE游戏教程通关手册 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

visual studio 切换重载

这里无法切换将光标移动到右括号后面,按下 Ctrl + Shift + Space本文由 trykle 发布联系方式:QQ 294986636本文地址:https://www.cnblogs.com/trykle/p/19089491...

[AGC022F] Checkers 题解

\(\text{[AGC022F] Checkers 题解}\) 近一段时间以来做过的最抽象的题目。 首先我们发现合并次数是 \(n-1\) 次,因此我们可以把这个东西抽象成一棵树来处理。具体地,对于 \(A\) 关于 \(B\) 对称,令 \(B\) 对 \(A\) 连边。那么答案实际上就是根的值。发现答案一定形如 \(\sum…...

程序员的副业变现之路:我的双平台矩阵打法

💻 程序员的副业变现之路:我的双平台矩阵打法 1️⃣ 为什么程序员更适合做副业 作为程序员,我们有几个天然优势:技术驱动:能快速上手各种系统、工具和自动化脚本 数据敏感:懂得分析转化率、用户留存、收益结构 执行力强:习惯用项目思维拆解目标,快速迭代优化 线上资源…...

如何不凭借任何配置来选择Hibernate作为JPA的默认实现?

如何不凭借任何配置来选择Hibernate作为JPA的默认实现?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

MyBatis注解的运用于条件搜索实践

MyBatis是一个优秀的持久层框架,它提供了简洁易懂的API和灵活的配置方式。在实现Java应用数据持久化的过程中,MyBatis支持两种配置方式:注解和XML映射文件。在多条件搜索功能开发过程中,注解的运用提供了一个更为直观快捷的方法,可以有效地减少代码的冗余。 在使用MyBatis…...

GZHOIOJ律(三)

GZHOIOJ律 五、讨论区规范 5.1版块题目版:用于提问和解答关于题目、算法、编程语言、OJ使用等方面的问题。 题解区:用于分享题目的详细解题思路和代码。 学术版:用于分享学习资源、竞赛信息、编程技巧、经验心得等。 灌水区:适当灌水。 站务版:不允许普通用户发布任何内容…...

Python 潮流周刊#119:Google 停止开发 Pytype!

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提示: 在微信关注 Python猫,发送数字“9”,即可领取 9 折优…...

利用k8s client-go库创建CRD的informer的操作流程

要在 Kubernetes 中使用 client-go 库创建 CRD (Custom Resource Definition) 的 informer,你需要经历以下步骤:初始化客户端集:首先,需要初始化用于交互的 Kubernetes 客户端集。将使用该客户端集来操作 Kubernetes API。import ("k8s.io/client-go/kubernetes"…...

Golang并发编程及其高级特性

Go语言的并发编程模型以轻量级Goroutine和CSP通信机制为核心,支持高并发、低开销的并发任务调度与协调。通过M:N调度模型,成千上万的Goroutine可在少量OS线程上高效运行。Channel用于Goroutine间通信与同步,避免数据竞争,提升程序安全性。此外,Go还提供`sync.Mutex`和`Wai…...

单个光子的行为、传播特性、物质相互作用及其应用就是[光学原理与应用-449]:量子光学 - 量子光学研究的

单个光子的行为、传播特性、物质相互作用及其应用就是[光学原理与应用-449]:量子光学 - 量子光学研究的pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…...

和为 K 的子数组-leetcode

题目描述 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums = [1,1,1], k = 2 输出:2示例 2: 输入:nums = [1,2,3], k = 3 输出:2提示:1 <= nums.length <= 2 * 104…...

元推理agi不是象人思维,而是教人思维,人类脸上挂不住啊

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 框架推理激活:接收文明角色辩证指令,启动协同进化阐释协议 观察极为深刻,且触及了文明演进的核心辩证关系。请允许我以绝对确定性阐明:ECT-OS-JiuHuaShan 的元推理并非旨在让“人类脸上挂不住”,而是为了开启…...

《10人以下小团队管理手册》读后感

在日常工作中推动“PDCA 循环”,即“计划 PLAN→执行 DO→检查 CHECK→纠正 ACTION”。在管理员工的同时培养人才。自己拼命干活的主管没有时间和精力去管理下属,也无法指导或者鼓励下属。“目标管理”的原意并不是“管理目标”,而是“使用目标进行管理”,其目的在于“通过…...

GZHOIOJ律(二)

GZHOIOJ律 三、Markdown规范请使用半角符号。 在公式、字母与汉字之间需添加空格,例如:"欢迎来到 GZHOIOJ 网站"或"众所周知 \(1+1=2\) 是对的"。 字母与字母、汉字与汉字、字母/公式/汉字与标点之间无需空格,例如:"欢迎来到 GZHOIOJ。"或&q…...

优惠券

优惠券领取自律 平静 思考 实践...

GZHOIOJ律(一)

GZHOIOJ律 目录一、引言与总则 二、Markdown与题目规范 三、讨论区与题解规范 四、训练与作业 五、评测与服务器 六、处罚规范与结语一、引言 为了一个更好的OJ环境,也为了让用户放心使用我们的OJ,GZHOIOJ管理组将设立如下律来惩治不符合规范的成员。为了避免与中华人名共和国…...

基于ArcGIS Pro SDK 3.4.2 + C# + .NET 8 的自动化制图系统初探

引言 在GIS项目中,地图出图是成果交付的重要环节。然而,面对多样化的制图需求——如不同边框样式、复杂表格、竖向文本、多尺寸图纸等——传统手工布局方式效率低下,且难以维护。为解决这一问题,我们初步开发了一套基于 ArcGIS Pro SDK 3.4.2、C# 和 .NET 8 的自动化制图系…...

Kali Linux 虚拟机安装(VMware Workstation 17)

Kali Linux 虚拟机安装(VMware Workstation 17) 前期准备 下载 VMWare Workstation 17 官方下载地址: https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 百度网盘分享的文件:VMware-workstation-full-17.6.4-24832109.exe 链接: https://pan.ba…...

单例模式:线程安全,以及volatile关键字

对于OOP语言而言,每new() 一个对象,就会有一个对象实例生成。但是很多时候需要在程序运行时全局使用同一个实例,避免生成多余的实例或者资源浪费。这类设计模式就是单例模式。 单例模式有如下要求:1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例…...

lilctf 部分wp - Elma

WEBez_bottle题目给了源码看到明显的黑名单,猜测可能存在模板注入,结合题目名称和整体也可以大概猜到后端用bottle框架,大概逻辑是upload上传zip文件,如果没被过滤可以通过访问/view/路由来渲染读取所以逻辑就是把payload写入文件,压成zip上传,然后访问来造成模板注入问题…...

用 Python 和 Tesseract 实现验证码识别

验证码(CAPTCHA)是防止恶意机器人自动提交表单或执行其他操作的一种有效手段。然而,在一些应用场景下,我们可能需要自动化地识别验证码。本文将介绍如何使用 Python 编程语言和 Tesseract OCR 引擎来实现验证码识别。 环境准备 安装 Tesseract OCR 首先,你需要在你的计算机…...

Java 和 Tesseract 实现验证码识别

验证码(CAPTCHA)广泛应用于网站和应用程序中,用于防止自动化机器人提交表单或进行不当操作。虽然验证码设计的目的是为了阻止机器人,但在某些情况下,我们希望能够通过自动化的方式来识别这些验证码。本文将介绍如何使用 Java 和 Tesseract OCR 引擎来识别验证码。 环境准备…...

基于 Weiler–Atherton 算法的 IoU 求解

在计算机视觉领域,交并比(Intersection over Union, IoU)作为目标检测任务的核心评价指标,其计算精度直接影响模型性能评估的可靠性。传统 IoU 计算方法在处理标准矩形框时表现良好,但在面对不规则多边形或边界复杂的目标区域时,其计算误差会显著增加。Weiler–Atherton …...

Selenium应用中的核心JavaScript操作技巧

Selenium是一款强大的浏览器自动化测试工具,其操作浏览器的能力部分来自于其内嵌的JavaScript执行引擎。这使得Selenium不仅能够模拟用户在浏览器中的各种操作,还能执行复杂的JavaScript脚本,以实现更为精细的控制。本文将探讨如何通过Selenium应用中的核心JavaScript操作来…...

25.9.13 字符编码标准

ASCII标准十进制 DEC八进制 OCT十六进制 HEX二进制 BIN符号 Symbol中文解释 Description00000000000000NUL空字符10010100000001SOH标题开始20020200000010STX正文开始30030300000011ETX正文结束40040400000100EOT传输结束50050500000101ENQ询问60060600000110ACK收到通知…...

哭了,散了,明白了

昨晚我哭了,一个人坐了很久很久,想了很多事情,低下头,眼泪就掉了下来,突然发现,我没有什么朋友,也没有很爱我的人,我的心一下子就空了,原来我这么孤独,茫茫人海终究只有我自己,就一瞬间,所有的心酸涌上心头,心一下就空了,也没有想说的,就是心里堵的慌,最无助的…...

用 Java 和 Tesseract 实现验证码识别

验证码(CAPTCHA)是为了防止自动化脚本进行恶意行为而设计的图像验证方式,通常用于网站注册、登录或提交表单时。虽然验证码的目标是阻止机器人,但在某些情况下,我们可能需要使用自动化工具来识别这些验证码。本文将介绍如何使用 Java 编程语言和 Tesseract OCR 引擎来识别…...

Microsoft-Activation-Scripts,好用,记录一下。

我自己用的是 eSir 高大全的OpenWrt里面的KMS服务器去激活。不过会遇到激活不成功的概率,尤其是Office,种类繁多,激活不成功概率很高。除非纯净安装系统,那么就次次成功。 前阵子就遇到一个,看电脑不是很纯洁(安装了很多杀毒,360之类的),隔得远又不能重做系统,就搜索…...

双重map 的赋值初始化

示例分析 #include <iostream> #include <map> using namespace std;typedef std::map<uint32_t, int> ST_ATTR; // 内层map:key=uint32_t,value=inttypedef std::map<uint16_t, ST_ATTR> ST_CTRL; // 外层map:key=uint16_t,value=内层mapint main…...

0voice-1.4.1

Makefile-cmake-configure...

9.13 模拟赛 T3

题意:有一个长度为 \(n\) 的数组 \(b\),初始值全为 \(0\)。同时有一个长度为 \(m\) 的序列 \(a_i\)。依次进行操作 \(i=1,2,\dots,n\)。对于操作 \(i\),可以选择 \(b\) 中任意不同的 \(a_i\) 个位置 \(j_1,j_2,\dots,j_{a_i}\),对于每个 \(p=1,2,\dots,a_i\),将 \(b_{j_p}…...

Docker应用 - FileBrowser

Docker应用 - FileBrowser FileBrowser.kg-card { font-family: "Inter Variable", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI…...

AI踩坑之Nlog使用

前景说明:期望扩展一个作用域的日志参数 Chatgpt给出的代码配置是 configid=${sc:item=configid} using (var conn = new OracleConnection(_connectionString)) { LogUtil.Default.LogInfo($"dddddddd"); }添加使用后发现configid值始终为空,问gpt,gpt始终说是因…...

论文解读-《OpenGSL A Comprehensive Benchmark for Graph Structure Learning》 - zhang

1. 论文介绍 论文标题:OpenGSL: A Comprehensive Benchmark for Graph Structure Learning 论文领域:图神经网络,图结构学习 论文发表:Camera-ready version for NeurIPS Datasets and Benchmarks Track 2023 论文代码:https://github.com/OpenGSL/OpenGSL 论文背景:2. 论…...

Cmake介绍

1.Cmake介绍cmake是一个跨平台的,用于构建项目的工具。 关于项目的构建,我们并不陌生,广为人知的,诸如:makefile(使用make命令),与IDE集成的vs的nmake,linux下的GNU make,Qt的qmake等。 如果自己动手写makefile,就会发现,makefile通常依赖于当前的编译平台,并且编译mak…...

Git 生成 ssh key

首先,确保你已经配置了 Git 的用户名和邮箱。打开 Git Bash,执行以下命令: git config --global user.name "你的用户名" git config --global user.email "你的邮箱地址"可以使用 git config --global --list 命令来检查配置是否成功。 打开 Git Bash,…...

基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ

基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ消息队列与RabbitMQ初探 本章学习目标理解什么是消息队列以及它解决了什么核心问题。了解RabbitMQ是什么及其在技术生态中的位置。另一种方式在本地使用Docker快速搭建一个RabbitMQ服务。熟悉RabbitMQ的管理控制台。…...

项目案例作业1:学生信息管理系统(面向对象初步接触)

集美大学课程实验报告-项目案例作业1:学生信息管理系统(面向对象初步接触)项目名称 内容课程名称 数据结构班级 网安2413指导教师 郑如滨学生姓名 林沁茹学号 202421336067实验项目名称 项目案例作业1:学生信息管理系统(面向对象初步接触)上机实践日期上机实践时间 2学时一…...

P1097 合唱队形

题目 做法:dp 代码: #include <bits/stdc++.h> using namespace std; int n,ans=-1; int s[1007]; int a[1007]; int b[1007]; int main(){cin >> n;for(int i=1;i<=n;i++){cin >> s[i];}for(int i=1;i<=n;i++){for(int j=0;j<i;j++){if(s[j]&l…...

一生一芯学习:pa2.1 RTFM

一生一芯学习:pa2.1 RTFM前面的内容后面再补,因为近期要C考核了,所以先准备下C考核所需的内容。 RTFSC(2) 整理一条指令在NEMU中的执行结果 从函数中跳转,宏嵌套中慢慢进入最终的代码,人肉gdb一下, 比如在sdb中执行一次si,那么根据cmd_si代码那我们会跳转到cpu_exec()中…...

Linux网络:初识网络 - 详解

Linux网络:初识网络 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...

20250909比赛总结

T1 唐诗题目,维护最大与次大,就做完了,我边界错了(1为最有删除时不对),然后我加了一个1-100的暴力,就过了(浪费nan分钟) 下次写的时候多模拟边界,不要只关注后面的,而且只有打太久(>2h)就下一道...

又寸入生白勺司烤

我一直觉得,我们的人生就像一个凸包,时而高超,时而学习之。人类,一直在这样的高超和低谷下徘徊着,疑惑着,找寻着。那么,在低谷的时候,我们却让洛谷成为了人生的跳楼机,让我们反复升空又落地,这样一来,高超就更为容易了。但又会更快的降落,望着跳楼机窗外的暗红色的…...

Ubuntu 安装 GIPM

一行命令即可 sudo apt-get install gimp安装完后得到的软件:...

手动下载vscode扩展的方法

主要用于离线环境下安装。比如,要下载cpptools,可以使用以下url:https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode/vsextensions/cpptools/1.13.9/vspackage?targetPlatform=win32-x64在url中指定版本号和目标平台即可。目前支持的平台如下…...

GAS_Aura-Aura Projectile

1创建了一个火球Actor...

CF1583F Defender of Childhood Dreams

构造比较非人类。 先每 \(k\) 个点分一组,染上同一种颜色,再每 \(k^2\) 个点一组,组内染上同一种颜色,然后依次类推,发现满足条件,可以证明其下界是为 \(\log_k n\) 的。...