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

redis数据安全与性能保障

数据安全与性能保障

  • 1、持久化
    • 1.1 快照持久化
    • 1.2 AOF持久化
    • 1.3 重写/压缩AOF文件
  • 2、复制
    • 2.1 Redis复制的启动过程
    • 2.2 主从链
  • 3、处理系统故障
    • 3.1 验证快照文件和AOF文件
  • 4、事务
    • 4.1 java中的redis事务使用

如有侵权,请联系~
如有错误,也欢迎批评指正~
本篇文章大部分是来自学习《Redis实战》的笔记

1、持久化

redis提供了两种方式进行持久化到磁盘。一种是快照【RDB】:他可以将某一时刻的所有数据都保存到磁盘中;另一种是只追加文件【AOF】:把写命令保存到磁盘中。这两种持久化方式可以单独使用某一种,也可以同时使用。

1.1 快照持久化

redis可以通过创建快照获取内存中某一时刻的数据副本,可以对快照进行备份存储到磁盘或者将备份复制到其他的服务器上从而创建一样的数据。但是在新的快照文件创建保存完之前,只有redis、操作系统或者硬件有一个崩溃,那么最近的快照之后的数据将会丢失。

创建快照的方式:

  • 客户端向redis服务端发起bgsave命令。redis服务端会fork一个子进程负责将快照写入磁盘,父进程则继续处理命令
  • 客户端向redis服务端发起save命令。redis服务端在快照没有创建完之前不会执行其他的请求。这种方式不常用,只有内存不足的情况下或者阻塞等待持久化也没事的情况
  • 用户设置了save配置选项。例如 save 60 1000,60秒内有1000次写入的条件满足之后,redis就会自动触发bgsave命令
  • redis收到shutdown命令关闭服务器的请求时,会执行save命令,阻塞所有客户端,save命令执行完毕之后就会关闭服务器
  • 当一个redis服务器连接另一个redis服务器,通过向对方发送sync命令进行复制的时候,如果主服务器没有正在或者刚执行完的bgsave操作,主服务器就会执行bgsave命令

基于上述说的rdb会存在最近一次数据丢失的问题,因此,rdb这种方式不适用于那种不能接受数据丢失的应用,只适合丢失一部分数据也不会造成问题。

redis的rdb文件每次写入都会把之前的rdb从磁盘中删除么?

会的。RDB持久化过程中关于文件写入的大致流程:

  1. 创建临时文件:当触发RDB快照保存操作时,Redis不会直接覆盖现有的RDB文件,而是首先创建一个临时文件来存储新的数据库快照。这个临时文件通常命名为类似于dump.rdb.tmp。
  2. 数据写入临时文件:Redis会将当前内存中的所有数据序列化并写入到上述提到的临时文件中。这一步确保了即使在写入过程中出现错误或中断,原有的RDB文件也不会被破坏或丢失。
  3. 替换旧文件:一旦所有的数据都被成功写入临时文件并且文件关闭后,Redis才会尝试用这个新生成的临时文件去替换原来的RDB文件。这种替换通常是通过操作系统级别的重命名操作完成的,这样可以保证原子性,即要么完全更新为新版本,要么保持不变。
  4. 清理工作:如果替换过程顺利完成,则原有的RDB文件会被移除;而如果由于某些原因导致替换失败(例如权限问题),那么临时文件会被保留下来,但原始的RDB文件仍然可用,从而确保了数据的安全性和一致性。

1.2 AOF持久化

AOF持久化就是将写命令追加到AOF文件的末尾,Redis到时候只需要重放一次AOF的命令即可恢复所有数据。针对于持久化的频率,可以通过appendfsync选项配置进行设置。如下是appendfsync的值:

选项同步频率
alwaysredis的每个写入命令都会同步的写入到磁盘,这样会严重降低redis的速度,
增加磁盘的写入频率从而降低磁盘的寿命
everysec每秒同步一次,显示的将多个写命令同步到磁盘。综合性能和数据安全,推荐使用
no同步的时机完全交给操作系统来控制

1.3 重写/压缩AOF文件

Redis的AOF持久化有很多优点:可以将持久化的窗口降低到1秒,并且持久化的时间短。但是缺点也很明显:虽然redis不断运行,写入命令越来越多,导致aof文件不断增加,占用空间大;当机器重启或者增加从节点进行还原数据集也会很慢。

为了解决这个问题,redis提供了bgwriteaof命令。这个命令会通过移除 AOF 文件中的冗余命令来重写(rewrite )AOF文件,使 AOF文件的体积变得尽可能地小。Redis会创建一个子进程,然后由子进程负责对AOF文件进行重写。可以通过auto-aof-rewrite-percentage和auto-aof-rewrite-min-size两个选项进行控制压缩重写AOF文件的频率。

可以参考文献:redis相关问题

除了持久化到磁盘以外,对持久化的文件进行备份也是有必要的,例如备份到不同的服务器上。

2、复制

复制可以让其他服务器拥有一个不断地更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读请求。

在从服务器上配置slaveof host port,redis服务器就可以根据IP和端口号连接主服务器。

2.1 Redis复制的启动过程

从服务器连接主服务器的步骤:
在这里插入图片描述
在进行主从复制的时候,主服务器仍然对外提供服务,处理请求命令。如果服务器的内存不足创建子进程或者缓冲区,或者带宽不足,可能会影响请求的效率。一般主服务器的内存只使用50%~65%,留30%~45%的内存用作创建子进程和缓存区。

如果有多个从服务器连接同一个主服务器的时候:

  • 前一个从服务器第三步还没执行完,则这个服务器也会使用同一个rdb文件和缓冲区
  • 如果前一个已经执行完第五步,那么这个新连接就从第一步开始

大部分情况,我们期望尽可能减少Redis复制所需要的工作,尽可能同时。但是如果同步多个服务器可能会占用大量的带宽,从而影响主服务器接受请求命令。

哨兵模式:在切换主服务器的时候也会涉及到复制问题。
在这里插入图片描述

2.2 主从链

创建多个从服务器可能会造成网络不可用,原因如上带宽问题,因此诞生了主从链。从服务器对从服务器进行复制在操作上和从服务器对主服务器进行复制的唯一区别在于:如果从服务器X拥有从服务器Y,那么当从服务器X在执行步骤4时,它将断开与从服务器Y的连接,导致从服务器Y需要重新连接并重新同步(resync)。

当读请求的重要性明显高于写请求的重要性,并且读请求的数量远远超出一台Redis 服务器 可以处理的范围时,用户就需要添加新的从服务器来处理读请求。随着负载不断上升,主服务器 可能会无法快速地更新所有从服务器,或者因为重新连接和重新同步从服务器而导致系统超载。 为了缓解这个问题,用户可以创建一个由Redis 主从节点(master/slavenode)组成的中间层来分担主服务器的复 制工作:
在这里插入图片描述

3、处理系统故障

3.1 验证快照文件和AOF文件

无论是快照持久化还是AOF持久化,都提供了在遇到系统故障时进行数据恢复的工具。Redis提供了两个命令行程序redis-check-aof和redis-check-dump,它们可以在系统故障发生之后,检查AOF文件和快照文件的状态,并在有需要的情况下对文件进行修复。

程序修复AOF文件的方法非常简单:它会扫描给定的AOF文件,寻找不正确或者不完整的命令,当发现第一个出错命令的时候,程序会删除出错的命令以及位于出错命令之后的所有命令,只保留那些位于出错命令之前的正确命令。在大多数情况下,被删除的都是AOF文件末尾的不完整的写命令。

目前并没有办法可以修复出错的快照文件。尽管发现快照文件首个出现错误的地方是有可能的,但因为快照文件本身经过了压缩,而出现在快照文件中间的错误有可能会导致快照文件的剩余部分无法被读取。

4、事务

Redis的事务以特定的命令MULTI为开始,之后跟着多个命令,最后以EXEC命令结束。
事务示例:

WATCH key1
MULTI
SET key1 newValue
SET key2 newValue
EXEC

以下是这些命令的简要说明:

  1. MULTI 命令
    MULTI 命令用于标记一个事务块的开始。在执行了 MULTI 命令之后,所有的 Redis 命令都会被记录到一个待执行的队列中,但不会立即执行,而是等待 EXEC 命令的执行。

  2. EXEC 命令
    EXEC 命令用于执行所有之前通过 MULTI 命令放入队列中的命令。如果事务中的所有命令都被正确执行,那么 EXEC 命令会返回一个数组,包含了所有命令的返回值。如果事务在执行过程中遇到错误(例如语法错误),则整个事务会被放弃,之前的命令都不会被执行。

  3. DISCARD 命令
    DISCARD 命令用于取消一个事务,它清空之前通过 MULTI 命令放入队列中的所有命令。如果在一个事务已经开始但还没有调用 EXEC 或 DISCARD 的情况下发生错误,可以调用 DISCARD 来放弃事务。

  4. WATCH 命令
    WATCH 命令是一个乐观锁,用于在事务执行前监视一个或多个键。如果在 EXEC 执行时,被监视的键至少有一个已经被其他客户端改变,则整个事务不会执行,EXEC 命令将返回 nil 表示事务失败。这通常用于在并发环境下保证数据的一致性。

4.1 java中的redis事务使用

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;public class RedisOptimisticLockExample {public static void main(String[] args) {try (Jedis jedis = new Jedis("localhost", 6379)) {String key = "balance";int valueToAdd = 10;// 监视键"balance"jedis.watch(key);int currentBalance = Integer.parseInt(jedis.get(key));if (currentBalance < 100) {// 开启事务Transaction transaction = jedis.multi();transaction.incrBy(key, valueToAdd);// 提交事务if (transaction.exec() != null) {System.out.println("事务执行成功,余额增加了:" + valueToAdd);} else {System.out.println("事务执行失败,可能是监视的键发生了变化。");}} else {System.out.println("当前余额已足够,无需增加。");}// 取消监视键jedis.unwatch();} catch (Exception e) {e.printStackTrace();}}
}

相关文章:

redis数据安全与性能保障

数据安全与性能保障 1、持久化1.1 快照持久化1.2 AOF持久化1.3 重写/压缩AOF文件 2、复制2.1 Redis复制的启动过程2.2 主从链 3、处理系统故障3.1 验证快照文件和AOF文件 4、事务4.1 java中的redis事务使用 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎…...

llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3

llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3 1. LLAMA_VOCAB_PRE_TYPE_DEEPSEEK3_LLM2. static const std::map<std::string, llm_chat_template> LLM_CHAT_TEMPLATES3. LLM_CHAT_TEMPLATE_DEEPSEEK_3References 不宜吹捧中国大语言模型的同时&#xff0c;又去贬低美国大语言…...

【图文详解】lnmp架构搭建Discuz论坛

安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…...

一文读懂fgc之cms

一文读懂 fgc之cms-实战篇 1. 前言 线上应用运行过程中可能会出现内存使用率较高&#xff0c;甚至达到95仍然不触发fgc的情况&#xff0c;存在内存打满风险&#xff0c;持续触发fgc回收&#xff1b;或者内存占用率较低时触发了fgc&#xff0c;导致某些接口tp99&#xff0c;tp…...

Agent 高频知识汇总:查漏补缺参考大全

Agent 高频问题汇总 一、基础概念类 &#xff08;一&#xff09;请解释 Agent 的概念及其主要特点 Agent 是一种能够感知所处环境&#xff0c;并基于感知信息做出决策、采取行动以实现特定目标的实体。它既可以是简单的规则基系统&#xff0c;也能是复杂的智能体&#xff0c…...

毕业设计--具有车流量检测功能的智能交通灯设计

摘要&#xff1a; 随着21世纪机动车保有量的持续增加&#xff0c;城市交通拥堵已成为一个日益严重的问题。传统的固定绿灯时长方案导致了大量的时间浪费和交通拥堵。为解决这一问题&#xff0c;本文设计了一款智能交通灯系统&#xff0c;利用车流量检测功能和先进的算法实现了…...

fatal error C1083: ޷[特殊字符]ļ: openssl/opensslv.h: No such file or directory

一、环境 1. Visual Studio 2017 2. edk2&#xff1a;202305 3. Python&#xff1a;3.11.4 二、 fatal error C1083: ޷&#xbfab0;ļ: openssl/opensslv.h: No such file or directory 上图出现这个警告&#xff0c;不用管。 出现Done&#xff0c;说明编译成功。 执行上…...

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…...

论文阅读(十六):利用线性链条件随机场模型检测阵列比较基因组杂交数据的拷贝数变异

1.论文链接&#xff1a;Detection of Copy Number Variations from Array Comparative Genomic Hybridization Data Using Linear-chain Conditional Random Field Models 摘要&#xff1a; 拷贝数变异&#xff08;CNV&#xff09;约占人类基因组的12%。除了CNVs在癌症发展中的…...

7.抽象工厂(Abstract Factory)

抽象工厂与工厂方法极其类似&#xff0c;都是绕开new的&#xff0c;但是有些许不同。 动机 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工作&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。 假设案例 假设…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础组件实现)

目录 基础组件实现 如何将图像和文字显示到OLED上 如何绘制图像 如何绘制文字 如何获取字体&#xff1f; 如何正确的访问字体 如何抽象字体 如何绘制字符串 绘制方案 文本绘制 更加方便的绘制 字体附录 ascii 6x8字体 ascii 8 x 16字体 基础组件实现 我们现在离手…...

负荷预测算法模型

1. 时间序列分析方法 时间序列分析方法是最早被用来进行电力负荷预测的方法之一&#xff0c;它基于历史数据来构建数学模型&#xff0c;以描述时间与负荷值之间的关系。这种方法通常只考虑时间变量&#xff0c;不需要大量的输入数据&#xff0c;因此计算速度快。然而&#xff…...

Flutter Candies 一桶天下

| | | | | | | | 入魔的冬瓜 最近刚入桶的兄弟&#xff0c;有责任心的开发者&#xff0c;对自己的项目会不断进行优化&#xff0c;达到最完美的状态 自定义日历组件 主要功能 支持公历&#xff0c;农历&#xff0c;节气&#xff0c;传统节日&#xff0c;常用节假日 …...

android Camera 的进化

引言 Android 的camera 发展经历了3个阶段 &#xff1a; camera1 -》camera2 -》cameraX。 正文 Camera1 Camera1 的开发中&#xff0c;打开相机&#xff0c;设置参数的过程是同步的&#xff0c;就跟用户实际使用camera的操作步骤一样。但是如果有耗时情况发生时&#xff0c;会…...

HarmonyOS简介:应用开发的机遇、挑战和趋势

问题 更多的智能设备并没有带来更好的全场景体验 连接步骤复杂数据难以互通生态无法共享能力难以协同 主要挑战 针对不同设备上的不同操作系统&#xff0c;重复开发&#xff0c;维护多套版本 多种语言栈&#xff0c;对人员技能要求高 多种开发框架&#xff0c;不同的编程…...

反向代理模块b

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…...

C++并发:设计基于锁的并发数据结构

&#xff08;上一篇主要讲了底层逻辑&#xff0c;比较晦涩难懂&#xff0c;这一章讲解数据结构设计&#xff09; 对于并发场景&#xff0c;数据保护的形式主要如下&#xff1a; 1 采用独立互斥和外部锁 2 专门为并发访问自行设计的数据结构 1 并发设计的内涵 互斥保护数据结…...

数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)

一、资源下载 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 2.划分训练集和测试集 3.应用模型 4.结果分析 一、资源下载 点击下载数据集 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 虽然决策树已经构建,但对于大多数初学者或…...

leetcode 844 比较含退格的字符串

leetcode 844 比较含退格的字符串 题目描述 给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&#xff0c;返回 true 。# 代表退格字符。 注意&#xff1a;如果对空文本输入退格字符&#xff0c;文本继续为空。 示例 1&#…...

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…...

10.6 LangChain提示工程终极指南:从基础模板到动态生成的工业级实践

LangChain提示工程终极指南:从基础模板到动态生成的工业级实践 关键词: LangChain提示模板、动态Prompt生成、少样本学习、结构化输出、Prompt工程 一、Prompt Engineering 的本质:用设计模式重构大模型交互 传统Prompt的局限性: 硬编码文本:修改需求需重构代码缺乏结构…...

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域发展迅猛&#xff0c;大语言模型&#xff08;LLMs&#xff09;为通用人工智能&#xff08;AGI&#xff09;的发展开辟了道路。OpenAI 的 o1 模型表现非凡&#xff0c;它引入的创新性推理时缩放技术显著提升了推理能力…...

联想拯救者R720笔记本外接显示屏方法,显示屏是2K屏27英寸

晚上23点10分前下单&#xff0c;第二天上午显示屏送到&#xff0c;检查外包装没拆封过。这个屏幕左下方有几个按键&#xff0c;按一按就开屏幕、按一按就关闭屏幕&#xff0c;按一按方便节省时间&#xff0c;也支持阅读等模式。 显示屏是 &#xff1a;AOC 27英寸 2K高清 100Hz…...

编译安装PaddleClas@openKylin(失败,安装好后报错缺scikit-learn)

编译安装 前置需求&#xff1a; 手工安装swig和faiss-cpu pip install swig pip install faiss-cpu 小技巧&#xff0c;pip编译安装的时候&#xff0c;可以加上--jobs64来多核编译。 注意先升级pip版本&#xff1a;pip install pip -U pip3 install faiss-cpu --config-s…...

传输层协议TCP与UDP:深入解析与对比

传输层协议TCP与UDP&#xff1a;深入解析与对比 目录 传输层协议TCP与UDP&#xff1a;深入解析与对比引言1. 传输层协议概述2. TCP协议详解2.1 TCP的特点2.2 TCP的三次握手与四次挥手三次握手四次挥手 2.3 TCP的流量控制与拥塞控制2.4 TCP的可靠性机制 3. UDP协议详解3.1 UDP的…...

《解码AI大模型涌现能力:从量变到质变的智能跃迁》

在当今科技飞速发展的时代&#xff0c;人工智能大模型的涌现能力成为了众人瞩目的焦点。从ChatGPT与用户的流畅对话&#xff0c;到GPT-4在复杂任务中的出色表现&#xff0c;这些大模型仿佛一夜之间解锁了超乎想象的技能&#xff0c;那么&#xff0c;这种神奇的涌现能力究竟是如…...

【数据结构】_C语言实现带头双向循环链表

目录 1. 单链表与双链表 1.1 单链表的结构及结点属性 1.2 双链表的结构及结点属性 2. 单链表与双链表的区别 3. 双链表的实现 3.1 List.h 3.2 List.c 3.3 Test_List.c 注&#xff1a;部分方法的实现细节注释 1. 双链表结点前驱、后继指针域的初始化 2. 各种增、删结…...

优盘恢复原始容量工具

买到一个优盘&#xff0c;显示32mb&#xff0c;我见过扩容盘&#xff0c;但是这次见到的是缩容盘&#xff0c;把2g的容量缩成32MB了&#xff0c;首次见到。。用芯片查询工具显示如下 ChipsBank(芯邦) CBM2199E 使用以下工具&#xff0c;恢复原始容量。。 其他CMB工具可能不行…...

JVM的GC详解

获取GC日志方式大抵有两种 第一种就是设定JVM参数在程序启动时查看&#xff0c;具体的命令参数为: -XX:PrintGCDetails # 打印GC日志 -XX:PrintGCTimeStamps # 打印每一次触发GC时发生的时间第二种则是在服务器上监控:使用jstat查看,如下所示&#xff0c;命令格式为jstat -gc…...

反转单向链表以及单链表添加节点、遍历单链表

反转1个单向链表 /*** 节点类*/ class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val val;}Overridepublic String toString() {return "ListNode{" "val" val ", next" next };} }借助一个pre来存储每…...

ZZNUOJ(C/C++)基础练习1021——1030(详解版)

目录 1021 : 三数求大值 C语言版 C版 代码逻辑解释 1022 : 三整数排序 C语言版 C版 代码逻辑解释 补充 &#xff08;C语言版&#xff0c;三目运算&#xff09;C类似 代码逻辑解释 1023 : 大小写转换 C语言版 C版 1024 : 计算字母序号 C语言版 C版 代码逻辑总结…...

Linux学习笔记——系统维护命令

一、进程管理 1、ps命令&#xff08;查&#xff09; 来自process缩写&#xff0c;显示当前的进程状态。包括&#xff1a;进程的号码&#xff0c;发起者&#xff0c;系统资源&#xff0c;使用占比&#xff0c;运行状态等等。 语法格式&#xff1a;ps 参数 实例&#x…...

Harbor 部署

harbor镜像仓库搭建 版本v2.10.3 文章目录 一. docker 安装 harbor1. harbor 配置http访问1.1 下载harbor二进制包1.2 修改配置文件1.3 运行1.4 访问 2.【可选】harbor 配置https访问2.1 自签证书2.1 修改配置文件2.3 修改hosts文件2.4 运行2.5 访问 二. k8s 安装harbor1 .安装…...

three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)

春节忙完一轮&#xff0c;总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论&#xff0c;所以像相机矩阵推导这种网上已经很多优质文章的内容&#xff0c;笔者就一笔带过。 然而关于负缩放&#xf…...

开源的瓷砖式图像板系统Pinry

简介 什么是 Pinry &#xff1f; Pinry 是一个开源的瓷砖式图像板系统&#xff0c;旨在帮助用户轻松保存、标记和分享图像、视频和网页。它提供了一种便于快速浏览的格式&#xff0c;适合喜欢整理和分享多种媒体内容的人。 主要特点 图像抓取和在线预览&#xff1a;支持从网页…...

LabVIEW透镜多参数自动检测系统

在现代制造业中&#xff0c;提升产品质量检测的自动化水平是提高生产效率和准确性的关键。本文介绍了一个基于LabVIEW的透镜多参数自动检测系统&#xff0c;该系统能够在单一工位上完成透镜的多项质量参数检测&#xff0c;并实现透镜的自动搬运与分选&#xff0c;极大地提升了检…...

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器&#xff0c;网卡绑定有2个ip地址&#xff0c;分别为&#xff1a; A&#xff1a;192.168.111.201 B&#xff1a;192.168.111.202 在这台服务器请求目标地址 C&#xff1a;192.168.111.203 时必须使用B作为源地址才能访问目标地址C&#xff0c;在这台服务器默认…...

反向代理模块jmh

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当…...

安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.掌握LinearLayout、RelativeLayout、FrameLayout等布局的综合使用。 2.掌握ImageView、TextView、EditText、CheckBox、Button、RadioGroup、RadioButton、ListView、RecyclerView等控件在项目中的…...

RubyFPV开源代码之系统简介

RubyFPV开源代码之系统简介 1. 源由2. 工程架构3. 特性介绍&#xff08;软件&#xff09;3.1 特性亮点3.2 数字优势3.3 使用功能 4. DEMO推荐&#xff08;硬件&#xff09;4.1 天空端4.2 地面端4.3 按键硬件Raspberry PiRadxa 3W/E/C 5. 软件设计6. 参考资料 1. 源由 RubyFPV以…...

解锁维特比算法:探寻复杂系统的最优解密码

引言 在复杂的技术世界中&#xff0c;维特比算法以其独特的魅力和广泛的应用&#xff0c;成为通信、自然语言处理、生物信息学等领域的关键技术。今天&#xff0c;让我们一同深入探索维特比算法的奥秘。 一、维特比算法的诞生背景 维特比算法由安德鲁・维特比在 1967 年提出…...

Unity游戏(Assault空对地打击)开发(2) 基础场景布置

目录 导入插件 文件夹整理 场景布置 山地场景 导入插件 打开【My Assets】&#xff08;如果你刚进行上篇的操作&#xff0c;该窗口默认已经打开了&#xff09;。 找到添加的几个插件&#xff0c;点击Download并Import x.x to...。 文件夹整理 我们的目录下多了两个文件夹&a…...

Office / WPS 公式、Mathtype 公式输入花体字、空心字

注&#xff1a;引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 使用空心字时&#xff0c;一般不用斜体&#xff0c;取消勾选 “斜体”。 2、Mathtype 公式输入花体字、空心字 2.1 直接输…...

代码随想录算法训练营第三十九天-动态规划-213. 打家劫舍 II

与上一题基本一样&#xff0c;只不过房间形成一个环&#xff0c;就需要在首尾考虑状况多一些这不是多一些状况的问题&#xff0c;是完全不知道如何选择的问题这种状况详细分析一下就是要分成三种情况 第一种&#xff1a;不考虑首元素&#xff0c;也不考虑尾元素&#xff0c;只考…...

自然语言处理-词嵌入 (Word Embeddings)

词嵌入&#xff08;Word Embedding&#xff09;是一种将单词或短语映射到高维向量空间的技术&#xff0c;使其能够以数学方式表示单词之间的关系。词嵌入能够捕捉语义信息&#xff0c;使得相似的词在向量空间中具有相近的表示。 &#x1f4cc; 常见词嵌入方法 基于矩阵分解的方…...

Redis 数据备份与恢复

Redis 数据备份与恢复 引言 Redis 是一款高性能的键值对存储系统,广泛应用于缓存、消息队列、分布式锁等领域。为了保证数据的安全性和可靠性,定期对 Redis 数据进行备份与恢复是至关重要的。本文将详细介绍 Redis 数据备份与恢复的方法,帮助您更好地管理和维护 Redis 数据…...

【leetcode】T541 (两点反思)

解题反思 闷着头往&#xff0c;往往会写成一团浆糊&#xff0c;还推倒重来&#xff0c;谋划好全局思路再开始很重要。 熟悉C的工具库很重要&#xff0c;一开始看到反转就还想着用stack来着&#xff0c;后面突然想起来用reverse函数刚好可以用哇&#xff0c;这题也就迎刃而解了…...

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器&#xff0c;算是比较的基础容器&#xff0c;也是大家在日常开发中常用到的容器&#xff0c;因为底层用到的数据结构比较简单&#xff0c;笔者就将他们三者放到一起做下对比分析&#xff0c;介绍下基本用法&a…...

嵌入式系统|DMA和SPI

文章目录 DMA&#xff08;直接内存访问&#xff09;DMA底层原理1. 关键组件2. 工作机制3. DMA传输模式 SPI&#xff08;串行外设接口&#xff09;SPI的基本原理SPI连接示例 DMA与SPI的共同作用 DMA&#xff08;直接内存访问&#xff09; 类型&#xff1a;DMA是一种数据传输接口…...

LevelDB 源码阅读:写入键值的工程实现和优化细节

读、写键值是 KV 数据库中最重要的两个操作&#xff0c;LevelDB 中提供了一个 Put 接口&#xff0c;用于写入键值对。使用方法很简单&#xff1a; leveldb::Status status leveldb::DB::Open(options, "./db", &db); status db->Put(leveldb::WriteOptions…...