Redis高可用—数据持久化

redis.conf redis配置文件redis.conf,用来外部启动时的配置文件,docker部署时使用的,非常方便,适用官方的镜像 立即下载

Redis的高可用从以下几个方面来保证:

  • 数据持久化
  • 主从复制
  • 自动故障恢复
  • 集群

笔者将对以上几个方面进行逐一介绍,今天这篇文章先来介绍Redis的数据持久化。

一、为什么需要持久化?

Redis是内存数据库,数据全部保存在内存中,如果实例宕机,数据将会全部丢失,Redis提供了完善的数据持久化机制,可以把数据持久化到磁盘上,方便我们进行备份和快速恢复数据。

二、Redis数据持久化方式

Redis提供了2种数据持久化方式:

  1. RDB:将内存中的数据以快照的形式保存到硬盘里,生成dump.rdb文件,该文件是一个二进制文件。因为RDB文件保存在磁盘里,即使Redis服务器进程退出,RDB文件还在,Redis服务器在启动时检测到RDB文件存在,会自动载入RDB文件,用它来还原数据库状态。
  2. AOF:AOF持久化通过保存Redis服务器执行的写命令记录数据库状态,AOF文件保存了Redis写命令请求协议,是纯文本格式,可以直接打开AOF文件查看文件内容。

注意:
1. Redis默认开启RDB持久化功能;
2. AOF默认关闭,如果手动开启了AOF持久化功能,会优先使用AOF文件来还原数据库状态,因为AOF文件的更新频率通常比RDB文件的更新频率高。
Redis启动数据加载流程

1. RDB持久化

1.1 什么时候触发RDB持久化?

触发RDB持久化的情况分为:手动触发和自动触发。

1.1.1 手动触发

手动触发命令:

  1. save:阻塞式,内存较大的实例在执行过程中会造成长时间的阻塞,期间主进程不能处理任何命令请求。
  2. bgsave:fork子进程,由子进程负责RDB文件的创建,父进程可以继续处理命令的请求。阻塞发生在fork阶段,时间较短。
1.1.2 自动触发

自动触发RDB的条件有:

  1. 使用save配置;
    配置格式:save 【seconds】 【changes】
    表示【seconds】秒内数据集存在【changes】次修改时,自动触发bgsave。
    默认配置为:
#只要以下3个条件中的任意一个满足,bgsave就会执行。
#服务器在900秒内,对数据库进行了至少1次修改
save 900 1
#服务器在300秒内,对数据库进行了至少10次修改
save 300 10
#服务器在60秒内,对数据库进行了至少10000次修改
save 60 10000

实现原理:

#serverCron服务定时器每100ms执行一次检查
if(now()-rdb_last_save_time < m(指定秒数) and rdb_changes_since_last_save>n(修改次数)){
   bgsave();
}
  1. 从节点执行全量复制操作;
  2. 执行shutdown命令时,如果没有开启AOF自动执行bgsave;
  3. debug reload命令;

注意:如果开启了自动RDB,flushall因涉及的操作较多,可能会触发自动RDB,新产生的RDB文件将为空。

1.2 redis.conf 中RDB相关配置
#RDB自动触发条件(满足任意一个就可以触发RDB)
save 900 1
save 300 10
save 60 10000
#bgsave创建快照的时候出错了(比如,fork子进程内存不足或rdb文件所在的文件夹没有写入权限),redis主进程将不再接受新的写入命令
stop-writes-on-bgsave-error yes
#对RDB文件进行压缩
rdbcompression yes 
#RDB文件名称
dbfilename dump.rdb
#对RDB进行校验
rdbchecksum yes
 #(保存目录,这里是相对目录,和redis.conf是同一个目录)
dir ./ 

1.3 RDB持久化步骤
  1. 执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回;
  2. 父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒;
  3. 父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令;
  4. 子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项。
  5. 进程发送信号给父进程表示完成,父进程更新统计信息,具体见info Persistence下的rdb_*相关选项。

注意:fork子进程时,需要生成另外一份内存,如果原来内存占用比较大,会存在内存膨胀的问题。
对于错误格式的RDB文件,可以使用redis-check-rdb 工具进行修复。

2. AOF持久化

2.1 redis.conf 中AOF相关配置
#开启AOF,默认关闭
appendonly yes
#AOF文件名称
appendfilename appendonly.aof
 #(保存目录,这里是相对目录,和redis.conf是同一个目录)
dir ./ 

#AOF文件写入磁盘频率
appendfsync always  #每次收到写命令就立即强制写入磁盘,是最安全的。但该模式下速度也是最慢的,一般不推荐使用。
appendfsync everysec #默认方式,每秒钟强制写入磁盘一次,在性能和持久化方面做平衡,推荐该方式。
appendfsync no  #完全依赖操作系统的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不推荐。

/*AOF重写相关命令*/
#在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes
no-appendfsync-on-rewrite yes
#AOF重写触发条件
auto-aof-rewrite-percentage 100 #当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。
auto-aof-rewrite-min-size 64mb #当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。
2.2 AOF持久化步骤

AOF持久化的实现可以分为:命令追加、文件写入、文件同步3个步骤。

  1. 命名追加:服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾;
  2. 文件写入和同步:服务器定时会检查是否需要将aof_buf缓存区中的内容写入和保存到AOF文件中。是否需要文件写入是根据appendfsync 选项设置的,可以从AOF持久化的效率和安全性出发,设置appendfsync 选项的值。

注意:对于错误格式的AOF文件,先进行备份,然后采用redis-check-aof --fix命令进行修复,修复后使用diff-u对比数据的差异,找出丢失的数据,有些可以人工修改补全。

2.3 AOF重写
2.3.1 为什么AOF重写?

写命令追加到AOF文件,AOF会越来越大,占用过多的硬盘空间,并且重启之后的数据加载也会很慢,因此需要AOF重写。

2.3.2 AOF重写触发机制

触发AOF重写的方式分为:手动触发、自动触发。

  1. 手动触发:手动执行命令BGREWRITEAOF;

  2. 自动触发:通过配置redis.conf中auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size来实现,这两个条件同时满足时触发AOF。

2.3.3 AOF重写规则

AOF重写并不会对现有AOF文件进行读取和分析操作,它是通过读取服务器当前数据库状态来实现的。
因此过期的数据不会写入新AOF文件,之前针对同一个key的多个命令也会因为直接读取数据库状态由一个命令代替。并且,为避免一个key包含的数据过多导致客户端输入缓冲区溢出,重写程序在处理列表、集合、有序集合、哈希等可能包含多个元素的键时,会先判断键所包含的元素数量,如果超过配置的常量值(默认是64)了,会拆分为多个命令。

2.3.4 AOF重写步骤
  1. 执行AOF重写请求。如果当前进程正在执行AOF重写则不执行重写操作,如果进程在执行bgsave则等待执行完毕后再执行。
  2. 父进程执行fork创建子进程,开销等同于bgsave过程。
  3. (1)主进程fork操作完成后,继续响应其他命令。所有修改命令依然写入AOF缓冲区并根据appendfsync策略同步到硬盘,保证原有AOF机制正确性。
    (2)由于fork操作运用写时复制技术,子进程只能共享fork操作时的内存数据。由于父进程依然响应命令,Redis使用“AOF重写缓冲区”保存这部分新数据,防止新AOF文件生成期间丢失这部分数据。
  4. 子进程根据内存快照,按照命令合并规则写入到新的AOF文件。每次批量写入硬盘数据量由配置aof-rewrite-incremental-fsync控制,默认为32MB,防止单次刷盘数据过多造成硬盘阻塞。
  5. (1)新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息,具体见info persistence下的aof_*相关统计。
    (2)父进程把AOF重写缓冲区的数据写入到新的AOF文件。
    (3)使用新AOF文件替换老文件,完成AOF重写。

3. RDB和AOF对比

  1. RDB性能高于AOF:
    ● 采用二进制方式存储数据,数据文件比较小,加载快速;
    ● 存储的时候是按照配置中的save策略来存储,每次都是聚合很多数据批量存储,写入的效率很好,而AOF则一般都是工作在实时存储或者准实时模式下,相对来说存储的频率高,效率却偏低。
  2. AOF数据安全性高于RDB:
    ● 存储是基于累计批量的思想,也就是说在允许的情况下,累计的数据越多那么写入效率也就越高,但数据的累计是靠时间的积累完成的,那么如果在长时间数据不写入RDB,但Redis又遇到了崩溃,那么没有写入的数据就无法恢复了,但是AOF方式偏偏相反,根据AOF配置的存储频率的策略可以做到最少的数据丢失和较高的数据恢复能力。
    二者选择的标准,就是性能和数据安全性之间的一个权衡。

三、参考文献

  1. https://zhuanlan.zhihu.com/p/111306444
  2. 《Redis设计与实现》
瑞萨芯片串口配置,基于RL78芯片的串口使用配置 在这里隆重给大家介绍瑞萨编辑器CS+ for CA 的自动生成代码功能,只需要配置几个参数,就可以得到你想要的串口配置了,我现在已经忘记怎么手动配置寄存器了,哈哈。选择设置,此时将端口设置成功接下来设置时钟,根据自己的芯片所需设置相应的时钟,自己芯片是什么时钟查看数据手册和原理图可以找到。瑞萨芯片的串口配置其实和ST芯片的串口配置差不多,只是ST芯片的中文数据手册比较多,就更好配置了,找到所需要的串口配置IO口,此时将UART0 配置为引脚P61和P62,瑞萨芯片的串口配置竟然要配置串口。 阅读详情

相关推荐

请叫我鱼拆,2024扫地机器人的第一次拆机

从背面可以看出,这个机器人是两轮差速模型,两个驱动轮,一个万向轮,驱动轮位于机器人中心位置,这样原地旋转的圆心就是机器人的中心。可以看到设备已经连接,但是没有办法进shell,厂家应该有做了安全保护之类的,有知道从这个口可以登录系统办法的小伙伴可以后台留言。但这台机器人一直报警说,机器人轮子离地,小鱼 估计是防跌落模块有问题,误触发了,所以打算先拆机看看。接着小鱼试了下,机器可以开机,然后给他重新配置wifi,连上 米家。Allwinner,全志的片子,不知道哪个型号的,看产品id,应该支持adb。

生活不止眼前的苟且 3900

redis的持久化

Redis 的持久化机制主要是通过内部的方式来实现的,而不是直接将数据写入到外部数据库(如 MySQL)。下面将详细介绍 Redis 的默认持久化机制,以及如何通过编程的方式将 Redis 数据手动同步到 MySQL。

2301_76723322的博客 1542

大语言模型(LLM)在组合优化中的新突破:LLM-LNS与FunSearch性能对比

本文深入探讨了大语言模型(LLM)在组合优化中的创新应用,重点对比了LLM-LNS与FunSearch两种方法的性能差异。研究表明,LLM-LNS在物流路径规划、资源调度等场景中展现出显著优势,其双层自演化架构能有效平衡探索与利用,相比传统方法提升效率约43%。文章还提供了实践选择指南,帮助开发者根据具体需求选用合适的技术方案。

weixin_42526415的博客 398

Redis之Redis集群、持久化到mysql、与mysql数据同步

Redis集群、Redis持久化及Redis同步数据库数据

qq_42343557的博客 3807

【迁移学习综述】

迁移学习的目标是将某个领域或任务上学习到的知识应用到不同的但相关的领域或问题中。迁移学习的研究来源于一个观测:人类可以将以前的学到的知识应用于解决新的问题,更快的解决问题或取得更好的效果。迁移学习被赋予这样一个任务:从以前的任务当中去学习知识(knowledge)或经验,并应用于新的任务当中。换句话说,迁移学习目的是从一个或多个源任务(source tasks)中抽取知识、经验,然后应用于一个目标领域(target domain)当中去。

afadgas的博客 4311

Vivado报错-4 [Routed 35-3424] SLL Assignment failed ILP VU19P

Vivado报错[Routed 35-3424] SLL Assignment failed ILP VU19P

weixin_39896700的博客 1404

Redis07-RDB和AOF(未完待续)

Redis 持久化 Redis 提供了不同级别的持久化方式: RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大. 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式. 你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入

次第花开 436

ShardingSphere 5.3 系列Spring 配置升级指南 | Spring Cloud 47

在 `5.3.0` 版本以前,`ShardingSphere-JDBC` 同时支持 `Java API`、`YAML`、`Spring Boot Starter` 和 `Spring Namespace` 等配置方式。 - 当新增或更新 API 时,需要调整多项配置文件,工作量大 - 社区需要维护多重配置文档和示例 - `Spring Bean` 生命周期管理容易受到项目其他依赖的影响,比如 `PostProcessor` 无法正常执行 - `Spring Boot Starter` 和 `Spring N

gmHappy 2万+

redis持久化到mysql的方案_Redis持久化方案

1Redis持久化方案Redis是一个内存数据库,为了保证数据的持久性,它提供了两种持久化方案:lRDB方式(默认)lAOF方式1.1RDB方式1.1.1介绍lRDB是Redis默认采用的持久化方式。lRDB方式是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。lRedis会在指定的情况下触发快照1.符合自定义配置的快照规则2.执行...

weixin_26907223的博客 643

【异常】安装OpenClaw遇到 Windows环境pnpm安装node-llama-cpp postinstall生命周期脚本执行失败完整解决方案

摘要: Windows环境下使用pnpm安装node-llama-cpp时,postinstall脚本执行失败(错误码3221225477),主要因缺少C++编译工具链或预构建二进制下载失败。解决方案: 基础排查:确保管理员权限、Node.js ≥18、路径无中文; 安装编译工具:推荐Visual Studio的“C++桌面开发”组件或windows-build-tools; 环境变量配置:强制CPU模式+国内镜像(NODE_LLAMA_CPP_FORCE_CPU=true,镜像地址替换为国内源); pnp

奶爸的编程之路,也就一周冷个三天 603

28、数字电路测试与半导体内存测试全解析

本文全面解析了数字电路中的顺序电路测试生成方法与半导体内存测试技术。内容涵盖顺序电路中的故障检测、多重观察测试、可驱动性分析、伪组合电路测试及初始化问题,并深入探讨了内存技术发展、故障模型、测试流程与未来趋势。重点介绍了DRAM、SRAM等主流内存类型的特点,以及制造和使用过程中面临的永久性与非永久性故障挑战,提出了基于故障模型的高效测试策略与优化方案。

go5gopher的博客 119

redis持久化到mysql的方案_redisDB

软件简介基于redis和mysql的数据持久化方案redis运行时连接数据库 cache失效时同步读mysql, 数据修改时候通过消息队列通知DB线程写mysql reids.conf增加几个配置选项mysql_hostmysql_portmysql_usermysql_pwdmysql_dbnamepersistence_mmap_file: 消息列队指定的mmap映射文件write_threa...

weixin_39524959的博客 241

数据分析案例-电脑笔记本价格数据可视化分析3

本文基于Kaggle笔记本数据集(1303条记录,13个变量),使用Python进行数据可视化分析。通过自定义函数预处理了CPU频率、内存类型等关键特征,利用Seaborn和Matplotlib绘制了品牌分布、内存类型占比、价格影响因素等可视化图表。研究发现:1)Dell和Lenovo市场份额最大;2)SSD是主流存储类型;3)高RAM配置普遍采用SSD;4)Intel处理器占据绝对优势。分析揭示了不同品牌、配置与价格的关系,为消费者购买决策和市场策略制定提供了数据支持。

m0_64336780的博客 1万+

【分布式微服务云原生】《Redis 数据持久化与高可用高并发实战指南》

内容详情数据持久化机制RDB、AOF、混合持久化高可用高并发策略主从复制、哨兵模式、Redis 集群、优化配置、监控告警、运维维护Java 代码示例Jedis 连接 Redis 进行数据操作和配置持久化、主从复制流程图RDB、AOF、主从复制流程策略对比不同策略的特点、优势和劣势对比。

Dylaniou的博客 1235

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Redis高可用的原因 (一) -- 数据持久化

Redis持久化机制

luoyuhhh的博客 1076

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Redis数据库(二)——Redis高可用、持久化及性能管理

Redis数据库(二)——Redis高可用、持久化及性能管理一、Redis 高可用主要的高可用技术二、Redis 持久化1、持久化的功能2、两种持久化方式3、RDB 和 AOF 的区别①、RDB②、AOF③、RDB和AOE同时使用三、RDB 持久化1、触发条件```①、手动触发``````②、自动触发``````③、其他自动触发机制```2、```执行流程```3、```启动时加载```四、AOF 持久化1、```开启AOF```2、```执行流程```①、命令追加(append)②、文件写入(write)

想成功,靠自己 920

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《K8s中部署Redis集群:高可用与数据持久化方案》

此方案通过StatefulSet保证Pod标识稳定性,配合持久化存储和集群模式,实现99.95%可用性,满足生产环境需求。

jsgdfgxjsgdjxc的博客 269

Redis底层实现原理之数据接收同步和高可用持久化机制

文章总结了Redis在接收客户端处理流程,主从间数据同步处理,各节点的持久化机制和哨兵集群的高可用相关核心知识点

Armyyyyy丶的博客 804

使用Redis高可用和持久化的特性存储Session数据实战教程

浏览器输入http://192.168.4.53/test.php,访问测试。以上就是使用redis存储session数据全部教程了!确认 Session 存储到 Redis 4.0.8。需安装php-devel、php-pear。适配Redis 4.0的扩展版本。phpredis扩展。

2201_75959303的博客 409

Redis非关系型数据库—Redis高可用、持久化及性能管理

Redis非关系型数据库—Redis高可用、持久化及性能管理Redis高可用简介高可用技术Redis持久化持久化的功能两种持久化方式RDB持久化简介触发条件手动触发自动触发其他自动触发机制执行流程启动时加载AOF 持久化简介开启AOF执行流程命令追加(append)文件写入(write)和文件同步(sync)文件重写(rewrite)文件重写的流程启动时加载RDB和AOF的优缺点RDB持久化AOF持久化Redis的性能管理查看Redis内存使用内存碎片率内存使用率内回收key Redis高可用 简介 在w

Yusheng9527的博客 671

Redis数据安全性深度解析:从持久化到集群高可用

本文系统介绍了Redis的性能测试、持久化机制及高可用方案。通过redis-benchmark工具进行性能压测,分析RDB和AOF持久化方案的优缺点及配置细节。详细讲解了主从复制、哨兵集群和Redis Cluster三种高可用架构的实现原理、配置方法和监控指标,包括故障转移流程、槽位管理、Gossip协议等关键技术。针对不同业务场景,给出了数据安全方案选型建议和生产环境最佳实践,如监控告警配置、备份策略和安全加固措施。最后总结了Redis各版本的数据安全特性演进,并展望了云原生、AI集成等未来发展趋势。

alonewolf_99的博客 671

Redis数据库高可用之RDB和AOF持久化

【redis基础】

Lsssss123的博客 417

Redis数据库的高可用、持久化和性能管理

redis1.高可用持久化Redis提供两种方式进行持久化RDB持久化触发条件主从复制哨兵集群 1.高可用 在web服务器中,攻克用只是服务器可以正常访问的时间,衡量的标准是在多少时间内提供正常服务,但是在Redis中,实现高可用技术主要包括持久化、主从复制、哨兵和集群。 持久化 持久化是最简单的高可用方法,主要作用是数据备份,将数据存储在硬盘中,保证数据不会因为进程退出而丢失。 持久化的功能:redis是内存数据库,数据库都是存储在内存中,为了避免服务器发生故障等原因导致redis进程异常退出后数据会永

weixin_56422027的博客 191

Redis 持久化与高可用:如何配合主从复制保障数据安全

Redis 的持久化与主从复制是保障数据高可用和安全的核心机制,二者协同工作可形成多层防护。:异步复制下主从数据存在毫秒级延迟,金融场景需业务层校验(如写后读主节点)。

2501_93876446的博客 859

Redis 的三个核心问题 —— 线程模型、数据持久化、高可用

首先要明白redis是一个数据库 Redis 是一个内存数据库, 所有数据基本上都存在于内存当中, 会定时以追加(AOF)或者快照(RDB) 的方式刷新到硬盘中. 由于Redis 是一个内存数据库, 所以读取写入的速度是非常快的, 所以经常被用来做数据, 页面等的缓存。 线程模型: Redis 只有单线程吗? Redis 是单线程的,主要是指 Redis 的网络 I/O 线程,键值对的 set() get() 等读写操作,Redis 的持久化、集群同步等操作,则是由另外的线程来执行。 Redis 采用单线

tototototoo的博客 400

利用 Redis 的持久化和高可用特性存储 Session 数据,同时保留 Cookie 在客户端存储轻量信息的功能。

Redis 替代 Memcached 后,解决了传统 Session 存储的跨服务器共享与数据丢失问题;其 AOF/RDB 持久化机制确保服务重启后数据不丢失,且支持主从架构,相比 Memcached 可用性与可靠性更优。

2409_89160717的博客 1092
上一篇: Redis数据结构篇
下一篇: Redis高可用—主从复制
章鱼小丸子5
博客等级 码龄11年 5粉丝 4原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值