1. 首页
  2. IT资讯

Redis持久化的几种方式 – RDB深入解析

“u003Cpu003E上一篇 | 一千行 MySQL 学习笔记u003Cu002Fpu003Eu003Cpu003ERedis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhUKJ8zZkYch” img_width=”614″ img_height=”366″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003ERedis 持久化也是 Redis 和 Memcached 的主要区别之一,因为 Memcached 不具备持久化功能。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E1.持久化的几种方式u003Cu002Fh1u003Eu003Cpu003ERedis 持久化拥有以下三种方式:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003E快照方式u003Cu002Fstrongu003E(RDB, Redis DataBase)将某一个时刻的内存数据,以二进制的方式写入磁盘;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003E文件追加方式u003Cu002Fstrongu003E(AOF, Append Only File),记录所有的操作命令,并以文本的形式追加到文件中;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Cstrongu003E混合持久化方式u003Cu002Fstrongu003E,Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能简单数据丢失的风险。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E因为每种持久化方案,都有特定的使用场景,让我们先从 RDB 持久化说起吧。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E2.RDB简介u003Cu002Fh1u003Eu003Cpu003ERDB(Redis DataBase)是将某一个时刻的内存快照(Snapshot),以二进制的方式写入磁盘的过程。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E3.持久化触发u003Cu002Fh1u003Eu003Cpu003ERDB 的持久化触发方式有两类:一类是手动触发,另一类是自动触发。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrong toutiao-origin=”span”u003E1)手动触发u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E手动触发持久化的操作有两个:u003Ccodeu003Esaveu003Cu002Fcodeu003E和u003Ccodeu003Ebgsaveu003Cu002Fcodeu003E,它们主要区别体现在:是否阻塞 Redis 主线程的执行。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrong toutiao-origin=”span”u003E① save 命令u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E在客户端中执行 u003Ccodeu003Esaveu003Cu002Fcodeu003E命令,就会触发 Redis 的持久化,但同时也是使 Redis 处于阻塞状态,直到 RDB 持久化完成,才会响应其他客户端发来的命令,所以u003Cstrongu003E在生产环境一定要慎用u003Cu002Fstrongu003E。u003Cu002Fpu003Eu003Cpu003Eu003Ccodeu003Esaveu003Cu002Fcodeu003E命令使用如下:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhUKg25zSbJt” img_width=”1080″ img_height=”274″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003E从图片可以看出,当执行完 u003Ccodeu003Esaveu003Cu002Fcodeu003E命令之后,持久化文件u003Ccodeu003Edump.rdbu003Cu002Fcodeu003E的修改时间就变了,这就表示u003Ccodeu003Esaveu003Cu002Fcodeu003E成功的触发了 RDB 持久化。u003Ccodeu003Esaveu003Cu002Fcodeu003E命令执行流程,如下图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhUL23rlUcU1″ img_width=”440″ img_height=”566″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrong toutiao-origin=”span”u003E② bgsave 命令u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003Ebgsave(background save)既后台保存的意思, 它和 u003Ccodeu003Esaveu003Cu002Fcodeu003E命令最大的区别就是u003Ccodeu003Ebgsaveu003Cu002Fcodeu003E会 fork 一个子进程来执行持久化,整个过程中只有在 fork 子进程时有短暂的阻塞,当子进程被创建之后,Redis 的主进程就可以响应其他客户端的请求了,相对于整个流程都阻塞的u003Ccodeu003Esaveu003Cu002Fcodeu003E命令来说,显然u003Ccodeu003Ebgsaveu003Cu002Fcodeu003E命令更适合我们使用。u003Ccodeu003Ebgsaveu003Cu002Fcodeu003E命令使用,如下图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhULK1c7kXhV” img_width=”488″ img_height=”194″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003Eu003Ccodeu003Ebgsaveu003Cu002Fcodeu003E执行流程,如下图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhULcDyaAxqL” img_width=”562″ img_height=”848″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrong toutiao-origin=”span”u003E2)自动触发u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E说完了 RDB 的手动触发方式,下面来看如何自动触发 RDB 持久化?RDB 自动持久化主要来源于以下几种情况。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrong toutiao-origin=”span”u003E① save m nu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003Eu003Ccodeu003Esave m nu003Cu002Fcodeu003E是指在 m 秒内,如果有 n 个键发生改变,则自动触发持久化。参数 m 和 n 可以在 Redis 的配置文件中找到,例如,u003Ccodeu003Esave601u003Cu002Fcodeu003E则表明在 60 秒内,至少有一个键发生改变,就会触发 RDB 持久化。自动触发持久化,本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次u003Ccodeu003Ebgsaveu003Cu002Fcodeu003E命令。注意:当设置多个 save m n 命令时,满足任意一个条件都会触发持久化。例如,我们设置了以下两个 save m n 命令:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Esave 60 10u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Esave 600 1u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E当 60s 内如果有 10 次 Redis 键值发生改变,就会触发持久化;如果 60s 内 Redis 的键值改变次数少于 10 次,那么 Redis 就会判断 600s 内,Redis 的键值是否至少被修改了一次,如果满足则会触发持久化。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrong toutiao-origin=”span”u003E② flushallu003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003Eu003Ccodeu003Eflushallu003Cu002Fcodeu003E命令用于清空 Redis 数据库,在生产环境下一定慎用,当 Redis 执行了u003Ccodeu003Eflushallu003Cu002Fcodeu003E命令之后,则会触发自动持久化,把 RDB 文件清空。执行结果如下图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhUX2CykTOIn” img_width=”466″ img_height=”210″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h4″u003Eu003Cstrong toutiao-origin=”span”u003E③ 主从同步触发u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E在 Redis 主从复制中,当从节点执行全量复制操作时,主节点会执行 u003Ccodeu003Ebgsaveu003Cu002Fcodeu003E命令,并将 RDB 文件发送给从节点,该过程会自动触发 Redis 持久化。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E4.配置说明u003Cu002Fh1u003Eu003Cpu003E合理的设置 RDB 的配置,可以保障 Redis 高效且稳定的运行,下面一起来看 RDB 的配置项都有哪些?u003Cu002Fpu003Eu003Cpu003ERDB 配置参数可以在 Redis 的配置文件中找见,具体内容如下:u003Cu002Fpu003Eu003Cpreu003Eu003Colu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E# RDB 保存的条件u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Esave u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E9001u003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Esave u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E30010u003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Esave u003Cstrong toutiao-origin=”span” class=”highlight-text”u003E6010000u003Cu002Fstrongu003Eu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E# bgsave 失败之后,是否停止持久化数据到磁盘,yes 表示停止持久化,no 表示忽略错误继续写文件。u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Estop-writes-on-bgsave-error yesu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E# RDB 文件压缩u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Erdbcompression yesu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E# 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Erdbchecksum yesu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E# RDB 文件名u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Edbfilename u003Cstrong toutiao-origin=”span” class=”highlight-text”u003Edumpu003Cu002Fstrongu003E.rdbu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cbru003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003E# RDB 文件目录u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ccodeu003Edir .u002Fu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Folu003Eu003Cu002Fpreu003Eu003Cpu003E其中比较重要的参数如下列表:u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E① save 参数u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E它是用来配置触发 RDB 持久化条件的参数,满足保存条件时将会把数据持久化到硬盘。默认配置说明如下:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003Esave 900 1:表示 900 秒内如果至少有 1 个 key 值变化,则把数据持久化到硬盘;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Esave 300 10:表示 300 秒内如果至少有 10 个 key 值变化,则把数据持久化到硬盘;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Esave 60 10000:表示 60 秒内如果至少有 10000 个 key 值变化,则把数据持久化到硬盘。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E② rdbcompression 参数u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E它的默认值是 u003Ccodeu003Eyesu003Cu002Fcodeu003E表示开启 RDB 文件压缩,Redis 会采用 LZF 算法进行压缩。如果不想消耗 CPU 性能来进行文件压缩的话,可以设置为关闭此功能,这样的缺点是需要更多的磁盘空间来保存文件。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E③ rdbchecksum 参数u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E它的默认值为 u003Ccodeu003Eyesu003Cu002Fcodeu003E表示写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E5.配置查询u003Cu002Fh1u003Eu003Cpu003ERedis 中可以使用命令查询当前配置参数。查询命令的格式为:u003Ccodeu003Econfiggetxxxu003Cu002Fcodeu003E,例如,想要获取 RDB 文件的存储名称设置,可以使用u003Ccodeu003Econfiggetdbfilenameu003Cu002Fcodeu003E,执行效果如下图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhUXCFenrg3q” img_width=”692″ img_height=”244″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003E查询 RDB 的文件目录,可使用命令 u003Ccodeu003Econfiggetdiru003Cu002Fcodeu003E,执行效果如下图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhUXW1Gf8mTr” img_width=”604″ img_height=”236″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E6.配置设置u003Cu002Fh1u003Eu003Cpu003E设置 RDB 的配置,可以通过以下两种方式:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E手动修改 Redis 配置文件;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E使用命令行设置,例如,使用 u003Ccodeu003Econfigsetdir”u002Fusru002Fdata”u003Cu002Fcodeu003E就是用于修改 RDB 的存储目录。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E注意u003Cu002Fstrongu003E:手动修改 Redis 配置文件的方式是全局生效的,即重启 Redis 服务器设置参数也不会丢失,而使用命令修改的方式,在 Redis 重启之后就会丢失。但手动修改 Redis 配置文件,想要立即生效需要重启 Redis 服务器,而命令的方式则不需要重启 Redis 服务器。u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E小贴士:Redis 的配置文件位于 Redis 安装目录的根路径下,默认名称为 redis.conf。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E7.RDB 文件恢复u003Cu002Fh1u003Eu003Cpu003E当 Redis 服务器启动时,如果 Redis 根目录存在 RDB 文件 dump.rdb,Redis 就会自动加载 RDB 文件恢复持久化数据。如果根目录没有 dump.rdb 文件,请先将 dump.rdb 文件移动到 Redis 的根目录。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E验证 RDB 文件是否被加载u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003ERedis 在启动时有日志信息,会显示是否加载了 RDB 文件,我们执行 Redis 启动命令:u003Ccodeu003Esrcu002Fredis-server redis.confu003Cu002Fcodeu003E,如下图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhUXpEqZiwqq” img_width=”1080″ img_height=”209″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003E从日志上可以看出, Redis 服务在启动时已经正常加载了 RDB 文件。u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003E小贴士:Redis 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E8.RDB 优缺点u003Cu002Fh1u003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrong toutiao-origin=”span”u003E1)RDB 优点u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003ERDB 的内容为二进制的数据,占用内存更小,更紧凑,更适合做为备份文件;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ERDB 对灾难恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器进行 Redis 服务恢复;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ERDB 可以更大程度的提高 Redis 的运行速度,因为每次持久化时 Redis 主进程都会 fork 一个子进程,进行数据持久化到磁盘,Redis 主进程并不会执行磁盘 Iu002FO 等操作;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E与 AOF 格式的文件相比,RDB 文件可以更快的重启。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrong toutiao-origin=”span”u003E2)RDB 缺点u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003E因为 RDB 只能保存某个时间间隔的数据,如果中途 Redis 服务被意外终止了,则会丢失一段时间内的 Redis 数据;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003ERDB 需要经常 fork 才能使用子进程将其持久化在磁盘上。如果数据集很大,fork 可能很耗时,并且如果数据集很大且 CPU 性能不佳,则可能导致 Redis 停止为客户端服务几毫秒甚至一秒钟。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E9.禁用持久化u003Cu002Fh1u003Eu003Cpu003E禁用持久化可以提高 Redis 的执行效率,如果对数据丢失不敏感的情况下,可以在连接客户端的情况下,执行 u003Ccodeu003Econfigsetsave””u003Cu002Fcodeu003E命令即可禁用 Redis 的持久化,如下图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRiUhUYCFi06jVQ” img_width=”632″ img_height=”210″ alt=”Redis持久化的几种方式 – RDB深入解析” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E10.小结u003Cu002Fh1u003Eu003Cpu003E通过本文我们可以得知,RDB 持久化分为手动触发和自动触发两种方式,它的优点是存储文件小,Redis 启动时恢复数据比较快,缺点是有丢失数据的风险。RDB 文件的恢复也很简单,只需要把 RDB 文件放到 Redis 的根目录,在 Redis 启动时就会自动加载并恢复数据。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E11.思考题u003Cu002Fh1u003Eu003Cpu003E如果 Redis 服务器 CPU 占用过高,可能是什么原因导致的?u003Cu002Fpu003Eu003Cpu003E欢迎各位读者在评论区,写下自己的答案。u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E【END】u003Cu002Fpu003E”

原文始发于:Redis持久化的几种方式 – RDB深入解析

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/17750.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code