redis与docker

Redis 单机安装示例

目录结构

[root@centos01 simple]# pwd
/data/redis/simple
[root@centos01 simple]# tree
.
├── db
│   ├── appendonly.aof
│   ├── dump.rdb
│   ├── redis.conf
│   └── redis.log
├── redis.conf
└── redis.log

准备

#新建数据目录和配置目录
cd /data/redis/simple
mkdir db
touch redis.conf
touch redis.log

配置

  • 配置redis.conf 官方配置全解 http://download.redis.io/redis-stable/redis.conf
#编辑配置文件 vim /data/redis/simple/redis.conf

bind 0.0.0.0
port 6379

loglevel notice
logfile /data/redis.log

save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb

stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

dir /data

protected-mode yes
requirepass 123456

appendonly yes
  • 配置说明
bind 0.0.0.0					##改为0.0.0.0 允许外部访问
port 6379						##配置端口,默认6379

loglevel notice					##日志级别
logfile /data/redis.log			##日志保存位置

save 900 1						##表示900s内有1条写入,就产生快照(进行一次备份)
save 300 10  					##表示300s内有10条写入,就产生快照(进行一次备份)
save 60 10000					##可通过redis-cli>save/bgsave手动触发持久化
dbfilename dump.rdb				##数据文件名

stop-writes-on-bgsave-error yes	##如果持久化出错,主进程是否停止写入
rdbcompression yes				##是否压缩
rdbchecksum yes					##导入时是否检查

dir /data						##切换到data目录,/data是redis默认工作目录

protected-mode yes				##保护模式,默认为yes 
requirepass password			##redis客户端登录密码

appendonly yes					##开启AOF持久化,默认为关闭的,生产环境建议打开
------------------------AOF配置-------------------------
# 是否开启aof
appendonly yes

# 文件名称
appendfilename "appendonly.aof"

# 同步方式
appendfsync everysec

# aof重写期间是否同步
no-appendfsync-on-rewrite no

# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 加载aof时如果有错如何处理
# yes表示如果aof尾部文件出问题,记录到log并继续执行。no表示提示写入等待修复后写入
aof-load-truncated yes 

# 文件重写策略
aof-rewrite-incremental-fsync yes

安装

  • 下载镜像
#下载redis
docker pull redis:5.0
  • docker 安装命令
docker run -d \
-p 6379:6379 \
-v /data/redis/simple/db:/data \
-v /data/redis/simple/redis.conf:/data/redis.conf \
-v /data/redis/simple/redis.log:/data/redis.log \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--name group_redis_simple_1 redis:5.0 \
redis-server /data/redis.conf

----------------------------命令说明------------------------------

##将主机的6379端口关联到容器的6379端口
-p 6379:6379

##将主机中当前目录下的/data/redis/simple挂载到容器内的/data
-v /data/redis/simple:/data

##通过redis-server启动,并指定配置文件为redis.conf
redis-server /data/redis.conf

其他

  • 远程连接工具
RedisDesktopManager
  • 命令行进入redis容器
1、登录进入redis
docker exec -it group_redis_simple_1 /bin/bash

2、redis-cli登录
root@3aec3195595f:/data# redis-cli

3、简单命令操作
127.0.0.1:6379> keys *
127.0.0.1:6379> set aa 111
127.0.0.1:6379> get aa

Redis 升级方案

  • https://blog.csdn.net/huang_wu_yao_xin/article/details/83988728

  • 主从

通过配置--slaveof 127.0.0.1 6379 实现

通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 
。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。

在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库[1] (slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
  • 哨兵
使用redis-sentinel实现

当主数据库遇到异常中断服务后,开发者可以通过手动的方式选择一个从数据库来升格为主数据库,以使得系统能够继续提供服务。然而整个过程相对麻烦且需要人工介入,难以实现自动化。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
哨兵的作用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。

顾名思义,哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。

    (1)监控主数据库和从数据库是否正常运行。 
    (2)主数据库出现故障时自动将从数据库转换为主数据库。
  • 集群
redis5.0之后采用redis-cli实现
redis5.0之前基于ruby实现

即使使用哨兵,redis每个实例也是全量存储,每个redis存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。即每台redis存储不同的内容,
共有16384个slot。每个redis分得一些slot,hash_slot = crc16(key) mod 16384 找到对应slot,键是可用键,如果有{}则取{}内的作为可用键,否则整个键是可用键
集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。

修改每个实例的配置文件:

    cluster-enabled yes  --开启集群

    cluster-config-file nodes-6382.conf --集群配置文件名,每个实例配置的要不同,redis会根据文件名自动新建

Redis-Sentinel集群

集群环境搭建(1主2从)

目录结构

------------------192.168.0.10主节点服务器------------------
[root@centos01 master]# pwd
/data/redis/master
[root@centos01 master]# tree
.
├── db
│   ├── appendonly.aof
│   ├── redis.conf
│   └── redis.log
├── redis.conf
└── redis.log

------------------192.168.0.11/12从节点服务器------------------
[root@centos01 slave]# pwd
/data/redis/slave
[root@centos01 slave]# tree
.
├── db
│   ├── appendonly.aof
│   ├── redis.conf
│   └── redis.log
├── redis.conf
└── redis.log

准备

--------------主节点服务器新建文件夹与文件-------------------
cd /data/redis/master
mkdir db
touch redis.conf
touch redis.log

--------------从节点服务器新建文件夹与文件-------------------
cd /data/redis/slave
mkdir db
touch redis.conf
touch redis.log

配置

  • 官方配置全解 http://download.redis.io/redis-stable/redis.conf

  • 主节点器配置

#编辑配置文件 vim /data/redis/master/redis.conf
bind 0.0.0.0
port 6379

loglevel notice
logfile /data/redis.log

save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb

stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

dir /data

appendonly yes

slave-priority 90
#slaveof 192.168.0.10 6378
  • 从节点器配置
#编辑配置文件 vim /data/redis/slave/redis.conf
bind 0.0.0.0
port 6379

loglevel notice
logfile /data/redis.log

save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb

stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

dir /data

appendonly yes

slave-priority 90
slaveof 192.168.0.10 6379
  • 配置说明
--------------------配置说明----------------------------
#127.0.0.1只允许本机访问,改为0.0.0.0 允许外部访问
bind 127.0.0.1

#修改为 no,默认为yes 开启保护模式
将protected-mode 

#注:redis主从库搭建的时候,要么都不配置密码(这样下面这句也不需要配置),不然都需要设置成一样的密码
#是设置redis登录认证的密码, 如: redis-cli > auth 密码
requirepass password

#打开redis持久化配置, 启用AOF持久化方式, 设置为no重启数据不会保存
appendonly yes

# 设置从节点的优先级。设置成不同的优先级
slave-priority 100

#设置master服务器的ip和端口,配置文件里面指定slaveof,则不会升级为主节点
slaveof 192.168.0.10 6378

安装节点

  • 下载镜像
#下载redis
docker pull redis:5.0
  • 安装主节点
docker run -d \
-p 6379:6379 \
-v /data/redis/master/db:/data \
-v /data/redis/master/redis.conf:/data/redis.conf \
-v /data/redis/master/redis.log:/data/redis.log \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--name group_redis_master redis:5.0 \
redis-server /data/redis.conf
  • 安装从节点
docker run -d \
-p 6379:6379 \
-v /data/redis/slave/db:/data \
-v /data/redis/slave/redis.conf:/data/redis.conf \
-v /data/redis/slave/redis.log:/data/redis.log \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--name group_redis_slave redis:5.0 \
redis-server /data/redis.conf
  • 命令说明
将主机的6379端口关联到容器的6379端口
-p 6379:6379

将主机中当前目录下的/data/redis/cluster/data挂载到容器的/data
-v /data/redis/master/data:/data

其他

  • 基本命令
#用户密码验证
auth 密码

#基本信息
info

#查看主从节点信息
info Replication

# 取消主备,变更为主节点
slaveof no one

# 将192.168.0.10:6377设置为新主节点,该指令需要在当前主节点上执行
slaveof 192.168.0.10 6379 

Redis-sentinel安装

参考文献

https://blog.csdn.net/qq_28804275/article/details/80938659

https://www.jianshu.com/p/f3c6139284a6?from=timeline

目录结构

--------------192.168.0.10/11/12目录结构-------------------
[root@centos01 sentinel]# pwd
/data/redis/sentinel
[root@centos01 sentinel]# tree
.
├── db
│   ├── sentinel.conf
│   └── sentinel.log
├── sentinel.conf
└── sentinel.log

准备

--------------192.168.0.10/11/12服务器新建文件夹与文件-------------------
cd /data/redis/sentinel
mkdir db
touch sentinel.conf
touch sentinel.log

配置

  • 192.168.0.10/11/12的sentinel.conf配置
vim /data/redis/sentinel/conf/sentinel.conf

port 26000

sentinel monitor mymaster 192.168.0.10 6379 2
#sentinel auth-pass mymaster 123456

sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

logfile /data/sentinel.log

dir /data
  • sentinel.conf配置说明
port 26000 				##是sentinel节点的端口

#格式: sentinel monitor master-name ip port quorum
#mymaster		##自定义集群名
#ip				##主库ip
#port			##主库port 
#quorum			##最小投票数,小于总节点数,可以设置为总节点数-1
sentinel monitor mymaster 127.0.0.1 6379 1

# 注:redis主从库搭建的时候,要么都不配置密码(这样下面这句也不需要配置),不然都需要设置成一样的密码
sentinel auth-pass mymaster password


sentinel down-after-milliseconds 10000	#master经过10000毫秒数无法访问, 则使其处于S_DOWN状态。


sentinel failover-timeout mymaster 60000	#指定故障转移超时时间(以毫秒为单位), 默认为3分钟。

sentinel parallel-syncs 1		## 同步故障转移时的节点数,此数值越小故障转移越慢

logfile /data/sentinel.log		##日志存储位置

dir /data						##工作目录

安装

docker run -d \
-p 26000:26000 \
-v /data/redis/sentinel/db:/data \
-v /data/redis/sentinel/sentinel.conf:/data/sentinel.conf \
-v /data/redis/sentinel/sentinel.log:/data/sentinel.log \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--name group_redis_sentinel_1 redis:5.0 \
redis-sentinel /data/sentinel.conf


----------------------配置说明-----------------------------
#通过redis-sentinel启动,并指定配置文件为/conf/sentinel.conf
redis-sentinel /conf/sentinel.conf

其他

  • 连接并使用redis-sentinel API查看监控状况:
1、连接
redis-cli -p 26000 (26001 | 26002)

2、查看
sentinel master mymaster 或 sentinel slaves mymaster

Redis-Cli数据分片搭建

  • https://www.jianshu.com/p/af8eb110a873
  • https://blog.csdn.net/haerxiong/article/details/85064502
  • https://www.cnblogs.com/ivictor/p/9762394.html
  • https://www.cnblogs.com/zhoujinyi/p/11606935.html

目录结构

[root@centos01 redis]# pwd
/data/redis
[root@centos01 redis]# tree
.
├── 7000
│   ├── data
│   │   ├── appendonly.aof
│   │   ├── dump.rdb
│   │   └── nodes.conf
│   └── redis.conf
├── 7001
│   ├── data
│   │   ├── appendonly.aof
│   │   ├── dump.rdb
│   │   └── nodes.conf
│   └── redis.conf
├── 7002
│   ├── data
│   │   ├── appendonly.aof
│   │   ├── dump.rdb
│   │   └── nodes.conf
│   └── redis.conf
├── 7003
│   ├── data
│   │   ├── appendonly.aof
│   │   ├── dump.rdb
│   │   └── nodes.conf
│   └── redis.conf
├── 7004
│   ├── data
│   │   ├── appendonly.aof
│   │   ├── dump.rdb
│   │   └── nodes.conf
│   └── redis.conf
├── 7005
│   ├── data
│   │   ├── appendonly.aof
│   │   ├── dump.rdb
│   │   └── nodes.conf
│   └── redis.conf

配置

  • 编辑 redis.conf文件(3主3从,端口分别为7000、7001、7002、7003、7004、7005)
port 7000
bind 0.0.0.0
protected-mode no

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.0.13
cluster-announce-port 7000
cluster-announce-bus-port 17000
appendonly yes

--------------------------配置说明-------------------------------------
port 7000 								##节点端口
bind 0.0.0.0
protected-mode no

cluster-enabled yes 					##cluster集群模式
cluster-config-file nodes.conf 			##集群配置名
cluster-node-timeout 5000 				##超时时间
cluster-announce-ip 192.168.0.13 		##实际为各节点网卡分配ip 
cluster-announce-port 7000 				##节点映射端口
cluster-announce-bus-port 17000 		##节点总线端,等于port + 10000
appendonly yes 							##持久化模式
  • 查看所有配置信息
cat 700*/redis.conf
[root@centos01 redis]# cat 700*/redis.conf
port 7000
bind 0.0.0.0
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.0.13
cluster-announce-port 7000
cluster-announce-bus-port 17000
appendonly yes

port 7001
bind 0.0.0.0
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.0.13
cluster-announce-port 7001
cluster-announce-bus-port 17001
appendonly yes

port 7002
bind 0.0.0.0
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.0.13
cluster-announce-port 7002
cluster-announce-bus-port 17002
appendonly yes

port 7003
bind 0.0.0.0
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.0.13
cluster-announce-port 7003
cluster-announce-bus-port 17003
appendonly yes

port 7004
bind 0.0.0.0
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.0.13
cluster-announce-port 7004
cluster-announce-bus-port 17004
appendonly yes

port 7005
bind 0.0.0.0
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.0.13
cluster-announce-port 7005
cluster-announce-bus-port 17005
appendonly yes

安装

  • 分别安装6个节点
docker run -d \
-p 7000:7000 \
-p 17000:17000 \
-v /data/redis/7000/data:/data \
-v /data/redis/7000/redis.conf:/conf/redis.conf \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--sysctl net.core.somaxconn=1024 \
--name group_redis_7000 redis:5.0 \
redis-server /conf/redis.conf

docker run -d \
-p 7001:7001 \
-p 17001:17001 \
-v /data/redis/7001/data:/data \
-v /data/redis/7001/redis.conf:/conf/redis.conf \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--sysctl net.core.somaxconn=1024 \
--name group_redis_7001 redis:5.0 \
redis-server /conf/redis.conf


docker run -d \
-p 7002:7002 \
-p 17002:17002 \
-v /data/redis/7002/data:/data \
-v /data/redis/7002/redis.conf:/conf/redis.conf \
--privileged=true \
-v /etc/localtime:/etc/localtime:ro \
--sysctl net.core.somaxconn=1024 \
--name group_redis_7002 redis:5.0 \
redis-server /conf/redis.conf


docker run -d \
-p 7003:7003 \
-p 17003:17003 \
-v /data/redis/7003/data:/data \
-v /data/redis/7003/redis.conf:/conf/redis.conf \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--sysctl net.core.somaxconn=1024 \
--name group_redis_7003 redis:5.0 \
redis-server /conf/redis.conf

docker run -d \
-p 7004:7004 \
-p 17004:17004 \
-v /data/redis/7004/data:/data \
-v /data/redis/7004/redis.conf:/conf/redis.conf \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--sysctl net.core.somaxconn=1024 \
--name group_redis_7004 redis:5.0 \
redis-server /conf/redis.conf

docker run -d \
-p 7005:7005 \
-p 17005:17005 \
-v /data/redis/7005/data:/data \
-v /data/redis/7005/redis.conf:/conf/redis.conf \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--sysctl net.core.somaxconn=1024 \
--name group_redis_7005 redis:5.0 \
redis-server /conf/redis.conf

docker run -d \
-p 7006:7006 \
-p 17006:17006 \
-v /data/redis/7006/data:/data \
-v /data/redis/7006/redis.conf:/conf/redis.conf \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--sysctl net.core.somaxconn=1024 \
--name group_redis_7006 redis:5.0 \
redis-server /conf/redis.conf

docker run -d \
-p 7007:7007 \
-p 17007:17007 \
-v /data/redis/7007/data:/data \
-v /data/redis/7007/redis.conf:/conf/redis.conf \
-v /etc/localtime:/etc/localtime:ro \
--privileged=true \
--sysctl net.core.somaxconn=1024 \
--name group_redis_7007 redis:5.0 \
redis-server /conf/redis.conf

创建集群

  • 创建集群(或者先创建3个主节点,之后再给主节点添加子节点)
redis-cli --cluster create \
192.168.0.13:7000 192.168.0.13:7001 192.168.0.13:7002 \
192.168.0.13:7003 192.168.0.13:7004 192.168.0.13:7005 \
--cluster-replicas 1

----------------------创建集群成功--------------------------
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

操作节点

  • 添加节点到集群
redis-cli --cluster add-node 192.168.0.13:7006 192.168.0.13:7000
  • 新增节点添加为指定主节点的副节点
redis-cli --cluster add-node 192.168.0.13:7007 192.168.0.13:7000 --cluster-slave --cluster-master-id 92fd22324c88156a54a6d6a3d85e59a0b4bafe27


--------------------------参数说明------------------------------
--cluster-master-id 主节点id	##可以通过cluster nodes查看主节点id
  • 给新的主节点添加数据片(从其他主节点获取)
redis-cli --cluster reshard 192.168.0.13:7000
。。。
How many slots do you want to move (from 1 to 16384)? 1234
What is the receiving node ID? 92fd22324c88156a54a6d6a3d85e59a0b4bafe27
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all


##从all(其它所有主节点)分配1234个数据片到92fd22324c88156a54a6d6a3d85e59a0b4bafe27这个新的主节点

  • 删除节点
redis-cli --cluster del-node 192.168.0.13:7007 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e


--------------------------参数说明------------------------------
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e是被删除的节点id

其他

  • 查看当前集群的节点信息、 节点和槽的分配关系
cluster nodes
  • 查看当前集群的基本信息
cluster info
  • 查看节点关系
cluster slots
  • 分配槽,分配数据片所在节点

将16384个slot平均分配给6379,6380,6381三个节点。

redis-cli -p 7000 cluster addslots {0..5461}

redis-cli -p 7001 cluster addslots {5462..10922}

redis-cli -p 7002 cluster addslots {10923..16383}
  • 如果创建集群失败,则试试用这个方式(一直: Waiting for the cluster to join…)
redis-cli -p 7000 cluster meet 192.168.0.13 7001
redis-cli -p 7000 cluster meet 192.168.0.13 7002
redis-cli -p 7000 cluster meet 192.168.0.13 7003
redis-cli -p 7000 cluster meet 192.168.0.13 7004
redis-cli -p 7000 cluster meet 192.168.0.13 7005

其他分片方案

  • 基于 Twemproxy 与 Codis 的 redis 集群方案比较 https://blog.csdn.net/diligent203/article/details/84788829

  • redis的集群方案对比(Codis对比Twemproxy) https://www.jianshu.com/p/83ac498e1b2c

Twemproxy

Codis

Redis 增加其他模块

RedisBloom模块安装

  • 下载redisBloom源码并进行解压

https://github.com/RedisBloom/RedisBloom#2-use-redisbloom-with-redis-cli

  • 目录结构
[root@centos01 RedisBloom-master]# pwd
/data/redis/RedisBloom-master
[root@centos01 RedisBloom-master]# tree -L 1
.
├── contrib
├── Dockerfile
├── docs
├── LICENSE
├── Makefile
├── mkdocs.yml
├── ramp.yml
├── README.md
├── redisbloom.so
├── rmutil
├── src
└── tests
##进入下面目录,进行编译
cd /data/redis/RedisBloom-master
mkdir
  • 添加redisBloom模块
A、将redisbloom.so文件放入db目录中

[root@centos01 simple]# pwd
/data/redis/simple
[root@centos01 simple]# tree
.
├── db
│   ├── appendonly.aof
│   ├── dump.rdb
│   ├── redisbloom.so
│   ├── redis.conf
│   └── redis.log
├── redis.conf
└── redis.log

B、在配置文件中添加loadmodule /data/redisbloom.so,如下

[root@centos01 simple]# cat ./redis.conf 
loadmodule /data/redisbloom.so

bind 0.0.0.0
port 6379

C、重启redis
  • 常用命令
格式:bf.add <bloomName> <key>
bf.add myBloom uid1

格式:bf.exists <bloomName> <key>
bf.exists myBloom uid1

示例:
127.0.0.1:6379> bf.add myBloom name1
(integer) 1
127.0.0.1:6379> bf.add myBloom name2
(integer) 1
127.0.0.1:6379> bf.add myBloom name3
(integer) 1
127.0.0.1:6379> bf.exists myBloom name4
(integer) 0
127.0.0.1:6379> bf.exists myBloom name3
(integer) 1
  • 与springboot整合,采用lua脚本
写两个lua脚本:
	A、添加数据到指定名称的布隆过滤器
	B、从指定名称的布隆过滤器获取key是否存在的脚本
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Z先生09

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

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

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

打赏作者

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

抵扣说明:

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

余额充值