搭建高可用的redis集群,避免standalone模式带给你的苦难

本文详细介绍了如何搭建Redis集群,包括下载Redis、配置redis.conf文件、启动Redis实例、安装Ruby及依赖包,并最终通过redis-trib.rb脚本完成集群配置。
现在项目上用redis的话,很少说不用集群的情况,毕竟如果生产上只有一台redis会有极大的风险,比如机器挂掉,或者内存爆掉,就比如我们生产环境

曾今也遭遇到这种情况,导致redis内存不够挂掉的情况,当然这些都是我们及其不能容忍的,第一个必须要做到高可靠,其次才是高性能,好了,下面我来

逐一搭建一下。

 

一:Redis集群搭建

1. 下载

   首先去官网下载较新的3.2.0版本,下载方式还是非常简单的,比如官网介绍的这样。

$ wget http://download.redis.io/releases/redis-3.2.0.tar.gz
$ tar xzf redis-3.2.0.tar.gz
$ cd redis-3.2.0
$ make

 

2. redis配置

 由于我们要做集群,而且还要redis自带的redis-trib.rb 能正常运行,我们需要在集群中开启三台master,三台slave,所以这里我需要建立6个文件

夹,而且文件夹的名称就使用端口地址的名字,比如:6389. 6380....6384。

3. config配置。

   现在directory的分布情况大致如上图,接下来要做的事情就是配置redis.conf了,在这里需要配置四个选项。。。

 

<1> port  端口地址,比如6380文件夹下面的port就是6380,

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

 

<2> cluster-enabled 和 cluster-config-file

       这个顾名思义,首先需要开启redis的cluster模式,然后配置一个cluster-config-file文件,这个文件用于存放redis的实时信息,redis会动态追加和修

改这个conf下面的内容信息,不过要记住,这个nodes-6379.conf 可以根据 端口文件夹依次配置,比如6380文件夹可以改成nodes-6380.conf这样。。。

复制代码
# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
#
cluster-enabled yes

# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system do not have
# overlapping cluster configuration file names.
#
cluster-config-file nodes-6379.conf
复制代码

 

<3> directory

      为了方便管理,我这里配置的root目录取决于在哪个文件夹,比如6380下面我的dir就是: dir ./6380/

# Note that you must specify a directory here, not a file name.
dir ./6379/

 

<4> protected-mode

      这个是redis 3.2 才追加的一个功能,从功能注释中,我们就可以发现,这个默认就是不让外界可以访问redis,所以这里我们就改为no,可以远程访问。

# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode no

 

ok,到现在为止,我们的config就修改完毕了,其他端口的文件夹也可以依次配置之~

 

二:开启redis

    到现在为止,各个端口文件夹都配置成功了,接下来准备开启了,真的好么么哒~~~,窗口太多,有点萌萌的。

 

 

接下来我们可以看一下,在6379下面是不是有生成node-6379.conf文件,比如下面:

 

三:配置redis-trib.rb

   因为redis-trib.rb是ruby写的,而我们的电脑肯定是没有ruby和一些配置依赖项,不过没关系,有强大的yum安装,一切都不是问题。

 

1. 执行replicas命令

[jack@localhost ~]$ cluster/redis-trib.rb  create --replicas 1 192.168.161.133:6379 192.168.161.133:6380 192.168.161.133:6381 192.168.161.133:6382 192.168.161.133:6383 192.168.161.133:6384
/usr/bin/env: ruby: No such file or directory
[jack@localhost ~]$ 

   可以看到ruby是没有安装的,所以下一步我们要安装ruby了。。。

 

2. 安装ruby 【一定要是管理员权限哦】

复制代码
[jack@localhost ~]$ sudo
usage: sudo [-D level] -h | -K | -k | -V
usage: sudo -v [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-u user
            name|#uid]
usage: sudo -l[l] [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-U user
            name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C fd] [-D level] [-g
            groupname|#gid] [-p prompt] [-u user name|#uid] [-g groupname|#gid]
            [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C fd] [-D level] [-g
            groupname|#gid] [-p prompt] [-u user name|#uid] file ...
[jack@localhost ~]$ su
Password: 
jacsu: incorrect password
[jack@localhost ~]$ yum install ruby
Loaded plugins: fastestmirror, refresh-packagekit, security
You need to be root to perform this command.
[jack@localhost ~]$ jack
bash: jack: command not found
[jack@localhost ~]$ su
Password: 
[root@localhost jack]# yum install ruby
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirror.bit.edu.cn
 * updates: mirror.bit.edu.cn
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package ruby.x86_64 0:1.8.7.374-4.el6_6 will be installed
--> Processing Dependency: ruby-libs = 1.8.7.374-4.el6_6 for package: ruby-1.8.7.374-4.el6_6.x86_64
--> Processing Dependency: libruby.so.1.8()(64bit) for package: ruby-1.8.7.374-4.el6_6.x86_64
--> Running transaction check
---> Package ruby-libs.x86_64 0:1.8.7.374-4.el6_6 will be installed
--> Processing Dependency: libreadline.so.5()(64bit) for package: ruby-libs-1.8.7.374-4.el6_6.x86_64
--> Running transaction check
---> Package compat-readline5.x86_64 0:5.2-17.1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                Arch         Version                   Repository  Size
================================================================================
Installing:
 ruby                   x86_64       1.8.7.374-4.el6_6         base       538 k
Installing for dependencies:
 compat-readline5       x86_64       5.2-17.1.el6              base       130 k
 ruby-libs              x86_64       1.8.7.374-4.el6_6         base       1.7 M

Transaction Summary
================================================================================
Install       3 Package(s)

Total download size: 2.3 M
Installed size: 7.8 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): compat-readline5-5.2-17.1.el6.x86_64.rpm          | 130 kB     00:00     
(2/3): ruby-1.8.7.374-4.el6_6.x86_64.rpm                 | 538 kB     00:00     
(3/3): ruby-libs-1.8.7.374-4.el6_6.x86_64.rpm            | 1.7 MB     00:02     
--------------------------------------------------------------------------------
Total                                           747 kB/s | 2.3 MB     00:03     
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>
 Package: centos-release-6-5.el6.centos.11.1.x86_64 (@anaconda-CentOS-201311272149.x86_64/6.5)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : compat-readline5-5.2-17.1.el6.x86_64                         1/3 
  Installing : ruby-libs-1.8.7.374-4.el6_6.x86_64                           2/3 
  Installing : ruby-1.8.7.374-4.el6_6.x86_64                                3/3 
  Verifying  : compat-readline5-5.2-17.1.el6.x86_64                         1/3 
  Verifying  : ruby-libs-1.8.7.374-4.el6_6.x86_64                           2/3 
  Verifying  : ruby-1.8.7.374-4.el6_6.x86_64                                3/3 

Installed:
  ruby.x86_64 0:1.8.7.374-4.el6_6                                               

Dependency Installed:
  compat-readline5.x86_64 0:5.2-17.1.el6  ruby-libs.x86_64 0:1.8.7.374-4.el6_6 

Complete!
[root@localhost jack]# 
复制代码

 

3. 安装rubygems

     接着我们再次运行 replicas命令,看看会怎么样。。。 

[root@localhost jack]# cluster/redis-trib.rb  create --replicas 1 192.168.161.133:6379 192.168.161.133:6380 192.168.161.133:6381 192.168.161.133:6382 192.168.161.133:6383 192.168.161.133:6384
cluster/redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
    from cluster/redis-trib.rb:24
[root@localhost jack]# 

     结果苦逼了,还是报错,看提示貌似是少了一个rubygems,这次我们还是通过yum安装。

复制代码
[root@localhost jack]# yum install -y rubygems
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirror.bit.edu.cn
 * updates: mirror.bit.edu.cn
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package rubygems.noarch 0:1.3.7-5.el6 will be installed
--> Processing Dependency: ruby-rdoc for package: rubygems-1.3.7-5.el6.noarch
--> Running transaction check
---> Package ruby-rdoc.x86_64 0:1.8.7.374-4.el6_6 will be installed
--> Processing Dependency: ruby-irb = 1.8.7.374-4.el6_6 for package: ruby-rdoc-1.8.7.374-4.el6_6.x86_64
--> Running transaction check
---> Package ruby-irb.x86_64 0:1.8.7.374-4.el6_6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch           Version                    Repository    Size
================================================================================
Installing:
 rubygems          noarch         1.3.7-5.el6                base         207 k
Installing for dependencies:
 ruby-irb          x86_64         1.8.7.374-4.el6_6          base         317 k
 ruby-rdoc         x86_64         1.8.7.374-4.el6_6          base         381 k

Transaction Summary
================================================================================
Install       3 Package(s)

Total download size: 905 k
Installed size: 3.0 M
Downloading Packages:
(1/3): ruby-irb-1.8.7.374-4.el6_6.x86_64.rpm             | 317 kB     00:00     
(2/3): ruby-rdoc-1.8.7.374-4.el6_6.x86_64.rpm            | 381 kB     00:00     
(3/3): rubygems-1.3.7-5.el6.noarch.rpm                   | 207 kB     00:00     
--------------------------------------------------------------------------------
Total                                           625 kB/s | 905 kB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : ruby-irb-1.8.7.374-4.el6_6.x86_64                            1/3 
  Installing : ruby-rdoc-1.8.7.374-4.el6_6.x86_64                           2/3 
  Installing : rubygems-1.3.7-5.el6.noarch                                  3/3 
  Verifying  : ruby-rdoc-1.8.7.374-4.el6_6.x86_64                           1/3 
  Verifying  : ruby-irb-1.8.7.374-4.el6_6.x86_64                            2/3 
  Verifying  : rubygems-1.3.7-5.el6.noarch                                  3/3 

Installed:
  rubygems.noarch 0:1.3.7-5.el6                                                 

Dependency Installed:
  ruby-irb.x86_64 0:1.8.7.374-4.el6_6    ruby-rdoc.x86_64 0:1.8.7.374-4.el6_6   

Complete!
[root@localhost jack]# 
复制代码

 

4. 安装redis驱动

 

   还是继续不死心,我们继续运行replicas命令命令。

[root@localhost jack]# cluster/redis-trib.rb  create --replicas 1 192.168.161.133:6379 192.168.161.133:6380 192.168.161.133:6381 192.168.161.133:6382 192.168.161.133:6383 192.168.161.133:6384
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
    from cluster/redis-trib.rb:25
[root@localhost jack]# 

 

卧槽,还是有问题,这次貌似是一个gem_original_require没有安装,当然这个一般是说ruby版本太老了,所以现在亲要么升级ruby版本,要么直接安装

ruby的redis驱动。

[root@localhost jack]# gem install redis
Successfully installed redis-3.3.0
1 gem installed
Installing ri documentation for redis-3.3.0...
Installing RDoc documentation for redis-3.3.0...

 

6. 运行replicas命令

   终于貌似所有的依赖我们都解决了,接下来就可以真的执行了,真是一把辛酸泪啊。。。操。。。

复制代码
[root@localhost jack]# cluster/redis-trib.rb  create --replicas 1 192.168.161.133:6379 192.168.161.133:6380 192.168.161.133:6381 192.168.161.133:6382 192.168.161.133:6383 192.168.161.133:6384
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.161.133:6379
192.168.161.133:6380
192.168.161.133:6381
Adding replica 192.168.161.133:6382 to 192.168.161.133:6379
Adding replica 192.168.161.133:6383 to 192.168.161.133:6380
Adding replica 192.168.161.133:6384 to 192.168.161.133:6381
M: fdae457e803e2e04a7c549c69b44a2beefdae3bc 192.168.161.133:6379
   slots:0-5460 (5461 slots) master
M: 74285cee0fa65e64b443ecc630e447a8a65ee9f8 192.168.161.133:6380
   slots:5461-10922 (5462 slots) master
M: 14ed067a1b85044325d5800fa8479a6b4e41a10c 192.168.161.133:6381
   slots:10923-16383 (5461 slots) master
S: c50b1ff1fe3a00b16703f3b5705d2dafe046240b 192.168.161.133:6382
   replicates fdae457e803e2e04a7c549c69b44a2beefdae3bc
S: 8f7bd92f7ffb48e327820693a5820b5be7ea5556 192.168.161.133:6383
   replicates 74285cee0fa65e64b443ecc630e447a8a65ee9f8
S: 4a85ed078b4c99afad7f3a9a8df09082c681a649 192.168.161.133:6384
   replicates 14ed067a1b85044325d5800fa8479a6b4e41a10c
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.161.133:6379)
M: fdae457e803e2e04a7c549c69b44a2beefdae3bc 192.168.161.133:6379
   slots:0-5460 (5461 slots) master
M: 74285cee0fa65e64b443ecc630e447a8a65ee9f8 192.168.161.133:6380
   slots:5461-10922 (5462 slots) master
M: 14ed067a1b85044325d5800fa8479a6b4e41a10c 192.168.161.133:6381
   slots:10923-16383 (5461 slots) master
M: c50b1ff1fe3a00b16703f3b5705d2dafe046240b 192.168.161.133:6382
   slots: (0 slots) master
   replicates fdae457e803e2e04a7c549c69b44a2beefdae3bc
M: 8f7bd92f7ffb48e327820693a5820b5be7ea5556 192.168.161.133:6383
   slots: (0 slots) master
   replicates 74285cee0fa65e64b443ecc630e447a8a65ee9f8
M: 4a85ed078b4c99afad7f3a9a8df09082c681a649 192.168.161.133:6384
   slots: (0 slots) master
   replicates 14ed067a1b85044325d5800fa8479a6b4e41a10c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost jack]# 
复制代码

从上面可以看到,trib程序告知我们是否用 6379,6380,6381 作为主, 6382,6383,6384作为从。。然后我就恩准了。。就这样我们的集群

就创建好了,好了,这篇就讲到这里,也不是特别复杂吧~~~

 

<think>我们讨论的是Spring Boot中如何配置Redis的两种模式:单机(Standalone)和集群(Cluster)。在Spring Boot中,我们通常使用application.yml(或application.properties)来配置Redis连接。 首先,确保你的项目中已经引入了Spring Data Redis的依赖。对于Maven项目,依赖如下: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 下面分别给出单机模式集群模式的配置。 1. Redis单机模式配置(Standalone): 在application.yml中,配置如下: ```yaml spring: redis: host: localhost # Redis服务器地址 port: 6379 # Redis服务器端口 database: 0 # 使用的数据库索引(默认为0) password: # Redis服务器的访问密码,如果没有设置密码则可以不填 # 以下是一些可选的连接池配置(使用lettuce作为客户端) lettuce: pool: max-active: 8 # 连接池最大连接数(使用负值表示没有限制) max-idle: 8 # 连接池中的最大空闲连接 min-idle: 0 # 连接池中的最小空闲连接 max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制) ``` 2. Redis集群模式配置(Cluster): Redis集群模式需要配置多个节点。在application.yml中,配置如下: ```yaml spring: redis: cluster: nodes: # Redis集群节点(必须配置至少一个节点) - 192.168.0.1:7000 - 192.168.0.1:7001 - 192.168.0.2:7000 - 192.168.0.2:7001 - 192.168.0.3:7000 - 192.168.0.3:7001 max-redirects: 3 # 在集群中执行命令的最大重定向次数 password: your_password # 如果集群有密码,这里配置密码(如果没有则省略) # 连接池配置同样适用于集群模式 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1ms ``` 注意:在集群模式下,`spring.redis.host`和`spring.redis.port`配置将不起作用,因为集群节点由`spring.redis.cluster.nodes`指定。 另外,Spring Boot 2.x版本默认使用Lettuce作为Redis客户端(与Jedis相比,Lettuce是线程安全的,并且支持异步和响应式编程)。如果你需要使用Jedis,可以排除Lettuce并引入Jedis依赖,但配置方式类似。 配置完成后,Spring Boot会自动配置RedisTemplate和StringRedisTemplate,你可以在代码中注入它们来操作Redis。 示例代码:使用RedisTemplate操作Redis ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @Component public class RedisExample { private final RedisTemplate<String, Object> redisTemplate; @Autowired public RedisExample(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } public void setKey(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object getKey(String key) { return redisTemplate.opsForValue().get(key); } } ``` 注意:RedisTemplate默认使用JdkSerializationRedisSerializer,这意味着键和值会被序列化为字节流。如果你希望使用字符串序列化,可以考虑使用StringRedisTemplate,它专门用于处理字符串。 如果使用StringRedisTemplate: ```java @Component public class RedisStringExample { private final StringRedisTemplate stringRedisTemplate; @Autowired public RedisStringExample(StringRedisTemplate stringRedisTemplate) { this.stringRedisTemplate = stringRedisTemplate; } public void setKey(String key, String value) { stringRedisTemplate.opsForValue().set(key, value); } public String getKey(String key) { return stringRedisTemplate.opsForValue().get(key); } } ``` 解释: 上述配置和代码示例展示了如何在Spring Boot中配置Redis的单机模式集群模式,并提供了简单的操作示例。在单机模式中,我们只需要配置主机和端口;在集群模式中,我们需要配置多个节点。同时,连接池的配置是通用的,可以根据需要调整。 注意:在集群模式下,如果某个节点不可用,Lettuce客户端会自动尝试重定向到其他节点。配置中的`max-redirects`指定了最大重定向次数。 相关问题: §§相关问题§§: 1. 如何在Spring Boot中配置Redis哨兵模式(Sentinel)? 2. 如何自定义RedisTemplate的序列化方式? 3. Spring Data Redis支持哪些Redis客户端(例如Lettuce和Jedis)?它们有什么区别? 4. 在Redis集群模式下,如何处理节点故障和自动重连? </think> ### Spring Boot 中 Redis 单机与集群模式配置详解 在 Spring Boot 中,Redis 的单机(Standalone)和集群(Cluster)模式通过 `application.yml` 文件配置。以下是详细配置方案: --- #### 1. Redis 单机模式Standalone)配置 ```yaml spring: redis: host: 127.0.0.1 # Redis 服务器地址 port: 6379 # Redis 端口(默认6379) password: yourpassword # 访问密码(没有则省略) database: 0 # 数据库索引(0-15) timeout: 3000 # 连接超时时间(毫秒) lettuce: # 使用 Lettuce 连接池(默认) pool: max-active: 8 # 最大活跃连接数 max-idle: 8 # 最大空闲连接数 min-idle: 0 # 最小空闲连接数 max-wait: -1ms # 最大等待时间(-1 表示无限等待) ``` **配置说明**: - `host/port`:Redis 服务地址和端口 - `password`:密码保护(生产环境必填) - `lettuce.pool`:连接池参数(Spring Boot 2.x 默认使用 Lettuce 客户端) - **依赖**:无需额外依赖,Spring Boot Starter Data Redis 已包含 --- #### 2. Redis 集群模式(Cluster)配置 ```yaml spring: redis: password: yourpassword # 集群密码(所有节点相同) cluster: nodes: # 集群节点列表(至少3主) - 192.168.1.101:6379 - 192.168.1.102:6379 - 192.168.1.103:6379 - 192.168.1.104:6379 - 192.168.1.105:6379 - 192.168.1.106:6379 max-redirects: 3 # 最大重定向次数(默认5) lettuce: cluster: refresh: adaptive: true # 自动更新集群拓扑(推荐开启) pool: # 连接池配置(同单机模式) max-active: 16 max-idle: 8 min-idle: 4 ``` **关键配置项**: - `nodes`:必须包含所有主从节点地址(至少6个节点,3主3从) - `refresh.adaptive`:集群拓扑动态刷新(节点变化时自动更新) - `max-redirects`:MOVED/ASK 重定向最大次数 --- ### 验证配置 使用 `RedisTemplate` 测试连接: ```java @SpringBootTest public class RedisConnectionTest { @Autowired private RedisTemplate<String, String> redisTemplate; @Test void testConnection() { redisTemplate.opsForValue().set("test_key", "Hello Redis"); String value = redisTemplate.opsForValue().get("test_key"); System.out.println("Value from Redis: " + value); // 输出: Hello Redis } } ``` --- ### 注意事项 1. **集群模式要求**: - Redis 版本 ≥ 3.0 - 至少配置 3 个主节点(生产环境推荐 3 主 3 从) - 所有节点需使用相同密码 2. **客户端选择**: - Lettuce(默认):支持异步、响应式编程,性能更好 - Jedis:可替换 Lettuce(需排除 Lettuce 依赖) 3. **动态拓扑更新**: - 集群模式下务必开启 `adaptive` 刷新 - 避免节点变更导致连接失败 --- ### 配置建议 ```yaml # 最佳实践配置模板(集群模式) spring: redis: password: securePass123! cluster: nodes: - redis-node1:6379 - redis-node2:6379 - redis-node3:6379 - redis-node4:6379 - redis-node5:6379 - redis-node6:6379 lettuce: cluster: refresh: adaptive: true period: 2000 # 主动刷新间隔(毫秒) pool: max-active: 32 # 根据并发量调整 max-wait: 1000ms # 避免长时间阻塞 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值