# Redis 入门到精通(五)-- redis 持久化(2)

#AI发展下的伦理挑战,应当如何应对?#

Redis 入门到精通(五)-- redis 持久化(2)

一、redis 持久化–save 配置与工作原理

1、RDB 启动方式:反复执行保存指令,忘记了怎么办?不知道数据产生了多少变化,何时保存?

采用 redis 自动执行。

  • 谁:redis服务器发起指令(基于条件)。
  • 什么时间:满足条件。
  • 干什么事情:保存数据。

2、RDB 启动方式 ——save 配置

  • 1)配置: save second changes

  • 2)作用:满足限定时间范围内key的变化数量达到指定数量即进行持久化。

  • 3)参数:

    second:监控时间范围。
    changes:监控key的变化量。

  • 4)位置:在 conf 文件中进行配置。

  • 5)范例:

    save 900 1
    save 300 10
    save 60 10000

3、修改 /conf/redis-6379.conf 配置文件,添加 redis 自动执行 save 指令相关配置。指定配置文件,启动 redis 服务,


# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 查看 redis 服务是否后台启动成功:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24153     1  0 01:03 ?        00:00:21 redis-server *:6379
root     24402  1538  0 08:41 pts/3    00:00:00 grep --color=auto redis-
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 杀死 redis 服务进程 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# kill -s 9 24153
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24404  1538  0 08:42 pts/3    00:00:00 grep --color=auto redis-
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 修改 conf/redis-6379.conf 配置文件,添加 redis 自动执行 save 指令相关配置。
vim conf/redis-6379.conf 

# 添加如下配置(每102个变化就自动保存):
save 10 2

# 删除 data 目录下的其他 dump.rdb 文件 
rm -rf data/dump*

# 指定配置文件,启动 redis 服务:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6379.conf


# 客户端执行 save 后,再次查看 dump-6379.rdb 文件内容:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data

root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# cat data/dump-6379.rdb 
REDIs0008dis-ver4.0.0edis-bitsctimefed-memf-preamblerepl-id(3807de8be5a58a80693a6a91fb91d33a68ce217ap1-offsetlname
redis-6379age 0;root@WIN-20240529B1A: /usr/local/redis/redis-4.0.0root@wIN-20240529BJA:/usr/1ocal/redis/redis-4.0.0#

# 当客户端 创建1个数据时,查询 data 下,只有日志文件。
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 20
drwxr-xr-x 2 root root 4096 Jul 16 08:43 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 6899 Jul 16 08:45 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 当客户端 创建2个数据时,再次查询data 下,多了一个 dump-6379.rdb 文件。
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 24
drwxr-xr-x 2 root root 4096 Jul 16 08:51 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 7224 Jul 16 08:51 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root  186 Jul 16 08:51 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 执行2次get,数据无变化,也不会自动保存
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 24
drwxr-xr-x 2 root root 4096 Jul 16 08:51 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 7224 Jul 16 08:51 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root  186 Jul 16 08:51 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 执行2次 get,数据无变化,也不会自动保存
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 24
drwxr-xr-x 2 root root 4096 Jul 16 08:51 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 7224 Jul 16 08:51 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root  186 Jul 16 08:51 dump-6379.rdb

# 执行2次 del 和 set,数据有变化,自动保存
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 24
drwxr-xr-x 2 root root 4096 Jul 16 09:01 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 7549 Jul 16 09:01 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root  169 Jul 16 09:01 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

4、打开另一终端,连接 redis 客户端,创建的数据,测试是否自动保存。


# 启动另一客户端:

# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 指定端口号,启动 redis 客户端:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli -p 6379

# 查看所有 key 
127.0.0.1:6379> keys *

# 创建一个数据,查看服务端,不会自动保存
127.0.0.1:6379> set name redis-6379
OK

# 创建第2个数据,查看服务端,已经自动保存
127.0.0.1:6379> set age 38
OK 

# 执行2次 get,数据无变化,也不会自动保存
127.0.0.1:6379> get name
"redis-6379"
127.0.0.1:6379> get age
"38"

# 执行2次 del 和 set,数据有变化,自动保存
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> set age 33
OK
127.0.0.1:6379> 

在这里插入图片描述

5、RDB启动方式 ——save 配置原理

38-RDB启动方式save配置原理.png

6、注意事项:

  • save 配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的。
  • save 配置中对于 second 与 changes 设置通常具有互补对应关系,尽量不要设置成包含性关系。
  • save 配置启动后执行的是 bgsave 操作。

二、redis 持久化–RDB 三种启动方式对比与优缺点分析

1、RDB 三种启动方式对比

方式save指令bgsave指令
读写同步异步
阻塞客户端指令
额外内存消耗
启动新进程

2、rdb 特殊启动形式

  • 全量复制: 在主从复制中详细讲解。
  • 服务器运行过程中重启: debug reload。
  • 关闭服务器时指定保存数据:shutdown save。

默认情况下执行shutdown命令时,自动执行 bgsave(如果没有开启AOF持久化功能)。

3、RDB 优点:

  • RDB 是一个紧凑压缩的二进制文件,存储效率较高。
  • RDB 内部存储的是 redis 在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景。
  • RDB 恢复数据的速度要比 AOF 快很多。
  • 应用:服务器中每X小时执行 bgsave 备份,并将 RDB 文件拷贝到远程机器中,用于灾难恢复。

4、RDB 缺点:

  • RDB 方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据。
  • bgsave 指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能。
  • Redis 的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象。

三、redis 持久化–AOF 简介

1、RDB 存储的弊端

 存储数据量较大,效率较低,基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低。
 大数据量下的IO性能较低。
 基于fork创建子进程,内存产生额外消耗。
 宕机带来的数据丢失风险。

2、解决思路

 不写全数据,仅记录部分数据。
 降低区分数据是否改变的难度,改记录数据为记录操作过程。
 对所有操作均进行记录,排除丢失数据的风险。

3、AOF概念

 AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令
达到恢复数据的目的。与RDB相比可以简单描述为改记录数据为记录数据产生的过程。

 AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。

四、redis 持久化–AOF 持久化策略基本操作

1、AOF 写数据过程

40-AOF写数据过程.png

2、AOF 写数据三种策略 (appendfsync)

  • always(每次)
    每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用。
  • everysec(每秒)
    每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高,建议使用,也是默认配置。
    在系统突然宕机的情况下丢失1秒内的数据。
  • no(系统控制)
    由操作系统控制每次同步到AOF文件的周期,整体过程不可控。

3、AOF 功能开启


- 配置:
	appendonly yes|no

- 作用:
	是否开启AOF持久化功能,默认为不开启状态。
	
- 配置
	appendfsync always|everysec|no
	
- 作用:
	AOF 写数据策略。
	
- 配置
	appendfilename filename。
	
- 作用
	AOF持久化文件名,默认文件名未appendonly.aof,建议配置为 appendonly-端口号.aof。
	
- 配置
	dir 
	
- 作用
	AOF持久化文件保存路径,与RDB持久化文件保持一致即可。	

4、修改 /conf/redis-6379.conf 配置文件,添加 AOF持久化策略。指定配置文件,启动 redis 服务,


# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 查看 redis 服务是否后台启动成功:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24408     1  0 08:45 ?        00:00:04 redis-server *:6379
root     24426  1538  0 10:16 pts/3    00:00:00 grep --color=auto redis-

# 杀死 redis 服务进程 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# kill -s 9 24408
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24428  1538  0 10:16 pts/3    00:00:00 grep --color=auto redis-

# 修改 conf/redis-6379.conf 配置文件,添加 AOF持久化策略。
vim conf/redis-6379.conf 

# 添加如下配置
appendonly yes
appendfsync always
# appendfsync everysec
# appendfsync no

# 删除 data 目录下的其他 dump.rdb 文件 
rm -rf data/dump*

# 指定配置文件,启动 redis 服务:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6379.conf

# 查看 data 文件夹下文件列表,多出一个 appendonly.aof 文件,容量0:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 28
drwxr-xr-x 2 root root 4096 Jul 16 10:21 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 8754 Jul 16 10:21 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root    0 Jul 16 10:21 appendonly.aof
-rw-r--r-- 1 root root  169 Jul 16 09:01 dump-6379.rdb

# 客户端创建数据后,再次查看 data 文件夹下文件列表,appendonly.aof 文件,容量增大:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root 4096 Jul 16 10:21 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 8754 Jul 16 10:21 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root   63 Jul 16 10:26 appendonly.aof
-rw-r--r-- 1 root root  169 Jul 16 09:01 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root 4096 Jul 16 10:40 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 9079 Jul 16 10:40 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root   93 Jul 16 10:40 appendonly.aof
-rw-r--r-- 1 root root  186 Jul 16 10:40 dump-6379.rdb


# 执行2次 get,数据无变化,appendonly.aof 文件大小无变化
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root 4096 Jul 16 10:40 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 9079 Jul 16 10:40 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root   93 Jul 16 10:40 appendonly.aof
-rw-r--r-- 1 root root  186 Jul 16 10:40 dump-6379.rdb

# 查看 appendonly.aof 文件内容 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# cat data/appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$10
redis-6379
*3
$3
set
$3
age
$2
38


# 再次修改 conf/redis-6379.conf 配置文件,添加 AOF 持久化策略。重新测试。
vim conf/redis-6379.conf 

# 保存以下内容即可:
port 6379
daemonize yes
logfile "6379.log"

# redis 持久化 -- RDB 相关配置
# data 目录为新建目录(设置存储.rdb文件的路径)
dir /usr/local/redis/redis-4.0.0/data

# 设置本地数据库文件名:
dbfilename dump-6379.rdb
# 设置存储至本地数据库时是否压缩数据
rdbcompression yes
# 设置是否进行 RDB 文件格式校验
rdbchecksum yes

# save配置(每10秒有2次数据变化就自动保存)
save 10 2

# 添加如下配置(AOF存储功能)
# 开启AOF持久化功能
appendonly yes
# AOF写数据策略(每秒)
appendfsync everysec


5、打开另一终端,连接 redis 客户端,创建的数据,测试AOF持久化策略基本操作。


# 启动另一客户端:

# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 指定端口号,启动 redis 客户端:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli -p 6379

# 查看所有 key 
127.0.0.1:6379> keys *

# 创建一个数据,查看服务端,appendonly.aof 有数据
127.0.0.1:6379> set name redis-6379
OK

# 创建第2个数据,查看服务端,appendonly.aof 文件大小增加了
127.0.0.1:6379> set age 38
OK 

# 执行2次 get,数据无变化,appendonly.aof 文件大小无变化
127.0.0.1:6379> get name
"redis-6379"
127.0.0.1:6379> get age
"38"

# 执行2次 del 和 set,数据有变化,自动保存
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> set age 33
OK
127.0.0.1:6379> 

41-AOF持久化策略基本操作.png

五、redis 持久化–AOF 重写概念与命令执行

1、AOF 写数据遇到的问题

42-AOF写数据遇到的问题.png

2、AOF 重写

随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,Redis 引入了AOF重写机制压缩文件体积。AOF 文件重
写是将 Redis 进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结
果转化成最终结果数据对应的指令进行记录。

3、AOF重写作用

  • 降低磁盘占用量,提高磁盘利用率。
  • 提高持久化效率,降低持久化写时间,提高IO性能。
  • 降低数据恢复用时,提高数据恢复效率。

4、AOF 重写规则

  • 进程内已超时的数据不再写入文件
  • 忽略无效指令,重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。
    如 del key1、 hdel key2、srem key3、set key4 111、set key4 222 等。
  • 对同一数据的多条写命令合并为一条命令、
    如lpush list1 a、lpush list1 b、 lpush list1 c 可以转化为:lpush list1 a b c。 为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元素。

5、AOF 重写方式

  • 手动重写:
    bgrewriteaof
  • 自动重写:
    auto-aof-rewrite-min-size size
    auto-aof-rewrite-percentage percentage

6、redis 持久化操作–AOF 重写概念与命令执行

修改 /conf/redis-6379.conf 配置文件,添加 AOF持久化策略。指定配置文件,启动 redis 服务,


# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 查看 redis 服务是否后台启动成功:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24436     1  0 10:21 ?        00:00:10 redis-server *:6379
root     25004  1538  0 14:14 pts/3    00:00:00 grep --color=auto redis-

# 杀死 redis 服务进程 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# kill -s 9 24436
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     25006  1538  0 14:15 pts/3    00:00:00 grep --color=auto redis-

# 修改 conf/redis-6379.conf 配置文件,添加 AOF持久化策略。
vim conf/redis-6379.conf 

# 保存以下内容即可:
port 6379
daemonize yes
logfile "6379.log"

# redis 持久化 -- RDB 相关配置
# data 目录为新建目录(设置存储.rdb文件的路径)
dir /usr/local/redis/redis-4.0.0/data

# 设置本地数据库文件名:
dbfilename dump-6379.rdb
# 设置存储至本地数据库时是否压缩数据
rdbcompression yes
# 设置是否进行 RDB 文件格式校验
rdbchecksum yes

# save配置(每10秒有2次数据变化就自动保存)
save 10 2

# 添加如下配置(AOF存储功能)
# 开启AOF持久化功能
appendonly yes
# AOF写数据策略(每次)
appendfsync always
# 设置文件名
appendfilename appendonly-6379.aof


# 删除 data 目录下的其他文件 
rm -rf data/dump*
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# rm -rf data/appendonly.aof

# 指定配置文件,启动 redis 服务:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0#  redis-server conf/redis-6379.conf
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-    
root     25017     1  1 14:23 ?        00:00:00 redis-server *:6379
root     25022  1538  0 14:23 pts/3    00:00:00 grep --color=auto redis-

# 查看 data 文件夹下文件列表,多出一个 appendonly-6379.aof 文件,容量0:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data             
total 24
drwxr-xr-x 2 root root  4096 Jul 16 14:23 ./
drwxrwxr-x 8 root root  4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 10284 Jul 16 14:23 6379.log
-rw-r--r-- 1 root root  1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root     0 Jul 16 14:23 appendonly-6379.aof

# 客户端创建数据后,再次查看 data 文件夹下文件列表,appendonly.aof 文件,容量增大:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root  4096 Jul 16 14:30 ./
drwxrwxr-x 8 root root  4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 10609 Jul 16 14:30 6379.log
-rw-r--r-- 1 root root  1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root    95 Jul 16 14:30 appendonly-6379.aof
-rw-r--r-- 1 root root   176 Jul 16 14:30 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root  4096 Jul 16 14:30 ./
drwxrwxr-x 8 root root  4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 10609 Jul 16 14:30 6379.log
-rw-r--r-- 1 root root  1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root   131 Jul 16 14:30 appendonly-6379.aof
-rw-r--r-- 1 root root   176 Jul 16 14:30 dump-6379.rdb

# 客户端执行重写操作后,查看服务端,appendonly-6379.aof 文件大小,发现减小了。
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root  4096 Jul 16 14:32 ./
drwxrwxr-x 8 root root  4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 11350 Jul 16 14:32 6379.log
-rw-r--r-- 1 root root  1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root    59 Jul 16 14:32 appendonly-6379.aof
-rw-r--r-- 1 root root   176 Jul 16 14:30 dump-6379.rdb

7、打开另一终端,连接 redis 客户端,创建的数据,测试AOF持久化策略基本操作。


# 启动另一客户端:

# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 指定端口号,启动 redis 客户端:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli -p 6379

# 查看所有 key 
127.0.0.1:6379> keys *
(empty list or set)

# 创建一个数据,查看服务端,appendonly-6379.aof 有数据
127.0.0.1:6379> set name redis-1
OK

# 更改name值,查看服务端,appendonly-6379.aof 文件大小增加了
127.0.0.1:6379> set name redis-2
OK 

# 更改name值,查看服务端,appendonly-6379.aof 文件大小增加了
127.0.0.1:6379> set name redis-3

# 执行重写操作,查看服务端,appendonly-6379.aof 文件大小,发现减小了。
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

43-AOF持久化策略基本操作-重写操作.png

8、AOF手动重写 —— bgrewriteaof指令工作原理

 41-AOF持久化策略基本操作.png

上一节关联链接请点击:
# Redis 入门到精通(五)-- redis 持久化(1)

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

段子手-168

你的鼓励将是我你的创作最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值