Redis面试题汇总

本文深入解析Redis的关键特性,包括分布锁、异步队列、缓存策略、内存优化及集群方案,探讨其在高并发场景下的表现与挑战。

1、Redis分布锁是怎么实现的?
       先拿setnx来争抢锁,抢到之后再用expire给锁加一个过期时间防止锁忘记释放。
如果在setnx之后执行expire之前的进程意外crash或重启维护了,那会咋样?Set指令 有非常复杂的参数,可以同时把setnx和expire合成一条指令来用的。


2、使用过Redis做异步队列么,你是怎么用的?有什么缺点?
       一般使用list结构作为队列,rpush生成消息,lpop消费消息。当lpop没有消息的时候,要适当sleep,一会在再重试。
缺点:在消费者下线的情况下,生产者的消息会丢失,所以得使用专业的消息队列如rabbitmq等。
能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现1:N的消息队列。


3、什么是缓存穿透?如何避免?什么是缓存雪崩?如何避免?
1)、一般的缓存系统,都是按照key去缓存查询,如何不存在就去对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力,这就叫缓存穿透。
2)、如何避免缓存穿透?
①对查询结果为空的情况也进行缓存,缓存时间设置短一点或者是该key对应的数据insert之后清理缓存。
②对一定不存在的key进行过滤。可以把所有可能存在的key放到一个大的bitMap中,查询时通过该BitMap过滤。
3)、缓存雪崩
①当缓存服务器重启或大量缓存集中在某一个时间段失效,这样在失效的时候会给后端系统带来很大的压力,导致系统崩溃。
4)、如何避免缓存雪崩?
①当缓存失效后,通过加锁或者队列来控制读数据库写缓存的数量。比如对某个key只允许一个线程查询数据写缓存,其他线程等待。
②做二级缓存,A1为原始缓存,A2为拷贝缓存,当A1失效时可以访问A2,A1缓存失效时间设置为短期,A2 设置为长期
③不同的key设置不同的过期时间,让缓存失效时间点尽量均匀。

更多


4、Redis中的管道有什么用?
       一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。这就是管道,是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的功能。


5、怎么理解Redis事务?
       事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序的进行,事务在执行的过程中不会被其他客户端发送来的命令请求所打断。事务就是一个原子操作:事务中的命令要么全部被执行,要么全部不执行。


6、Redis事务相关的命令有哪几个?
MULTI、EXSC、DISCARD、WATCH


7、Redis key的过期时间和永久有效分别怎么设置?
EXPIRE和PERSIST命令


8、Redis如何做内存优化?
       尽可能的使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称、姓氏、邮箱、密码设置单独key,而是将这个用户的所有信息存储到一张散列表里面。


9、Redis回收进程是如何工作的?
       一个客户端运行了新的命令,添加了新的数据。Redis检查内存使用情况,如果大于maxmemory的限制,就会根据设定好的策略进行回收,一个新的命令被执行,等等。所以我们不断的穿越内存限制的边界,通过不断达到边界然后不断的回收到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。


10、Redis支持的java客户端都有哪些?官方推荐有那个?
Redisson、Jedis、lettuce等等,官方推荐使用Redisson


11、Redis和Redisson的关系?
       Redisson是一个高级的分布式协调Redis客户端,能帮助用户在分布式环境中轻松实现一些java的对象(Bloom filter、BitSet、Set、SetMultimap、ScoredSortedSet、SortedSet、Map、List、Queue、ConcurrentMap、ListMultimap、BlockingQueue、Deque、BlockingDeque、Semaphore、Lock、ReadWriteLock、AtomicLong、CountDownLatch、Publish/Subscribe、HyperLogLog)


12、Jedis和Redisson对比有什么优缺点?
       Jedis是Redis的java实现的客户端,其中API提供了比较全面的Redis命令的支持; Redisson实现了分布式和扩展的java数据结构,和Jedis相比功能比较简单,不支持字 符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用 者对Redis的关注分离,从而让使用者能够将精力更集中的放在处理业务逻辑上。


13、说说Redis哈希槽的概念?
       Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16效验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。


14、Redis集群的主从复制模型是怎样的?
       为了使在部分节点失败或者大部份节点无法通信得情况下集群仍然可用,所以集群使用 了主从复制模型,每个节点都有N-1个复制品。


15、Redis集群会有写操作丢失吗?为什么?
Redis并不能保证数据的强一致性,这意味着在实际中集群在特定条件下可能会丢失写操作。


16、一个字符串类型的值能存储最大容量是多少?
521M


17、为什么Redis需要把所有数据放到内存当中?
       Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁 盘。所以Redis具有快速和数据持久化的特征,如果不将数据放到放在内存中,磁盘I/O 速度严重影响Redis的性能。在内存越来越便宜的今天,Redis将会越来越受欢迎,如 果设置自了使用的最大内存,则数据已有记录数达到内存限值后不能继续插入新值。


18、Redis集群方案应该怎么做?都有哪些方案?
1)、Codis2 目前用的最多的集群方案,基本和twemproxy一致的效果,但他支持在节点数量改变情况下,旧节点数据可以恢复到新的hash节点。
2)、Redis cluster3.0 自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置节点。
3)、在业务代码层实现,起几个毫无关联的Redis实例,在代码层对key进行hash计算,然后去对应Redis实例操作数据,这种方式对hash层代码要求比较高,考虑部分包括节点失效后的替代方案,数据震荡后的自动脚本恢复,实例监控等等。


19、Redis集群方案什么情况下会导致整个集群不可用?
       有A、B、C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整 个整个集群就会以为缺少5501-11000这个范围的槽而不可用。


20、MySQL里有2000W数据,Redis中只存20W的数据,如何保证Redis中的数据都是热点 数据?
Redis内存数据集大小上升到一定大小的时候,就会实施数据淘汰策略


20、Redis有哪些适合的场景?

  • 回话缓存:购物车信息
  • 全页缓存:
  • 队列
  • 排行榜/计数器,Redis在内存中对数字进行递归增或减的操作实现的非常好。集合(set)和有序集合(sortedSet)也使得我们在执行这些操作的时候变得非常简单,Redis只是正好提供了这两种数据结构
  • 发布/订阅


21、什么是Redis?他的优缺点
       Redis是一个key-value类型的内存数据库,很像memcached,整个数据库统统加载在内 存当中进行操作,定期通过异步操作把数据flush到硬盘上进行保存。因为是纯内存操 作Redis的性能非常出色,每秒可以处理10万次读写操作,是已知性能最快的Key-Value 数据库,Redis的出色不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外 单个Value的最大限制为1G,不想memcached只能保存1MB的数据,因此Redis可以 用来实现很多有用的功能。比如说用它的list来做FIFO双向链表,实现一个轻量级的高 性能消息队列,用它的Set 可以做高性能的tag系统等等,另外Redis也可以对存入的 key-Value设置expire时间,因此也可以被当做一个功能加强版的memcached来用。
       缺点:数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。


22、Redis和memcached相比有哪些优势?

  • Memcached所有的值均是简单的字符串,Redis作为其替代者,支持更为丰富的数据类型
  • Redis的速度比memcached快很多
  • Redis可以持久化其数据


23、Redis支持哪几种数据类型?

String :

  • 存储json类型对象
  • 计数器
  • 点赞

list(双向链表)

  • 可以使用redis的list模拟队列,堆,栈
  • 朋友圈点赞(一条朋友圈内容语句,若干点赞语句)规定:朋友圈内容的格式:1、内容: user:x:post:x content来存储;2、点赞: post:x:good list来存储;(把相应头像取出来显示)

hash(hashmap)

  • 保存对象
  • 分组


24、redis能否将数据持久化,如何实现?

将内存中的数据异步写入硬盘中,两种方式:RDB(默认)和AOF

RDB持久化原理:通过bgsave命令触发,然后父进程执行fork操作创建子进程,子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换(定时一次性将所有数据进行快照生成一份副本存储在硬盘中)

优点:是一个紧凑压缩的二进制文件,Redis加载RDB恢复数据远远快于AOF的方式。

缺点:由于每次生成RDB开销较大,非实时持久化,

AOF持久化原理:开启后,Redis每执行一个修改数据的命令,都会把这个命令添加到AOF文件中。

优点:实时持久化。

缺点:所以AOF文件体积逐渐变大,需要定期执行重写操作来降低文件体积,加载慢


25、Redis有哪几种数据淘汰策略?

  • Noevication:返回错误当内存限制达到,并且客户端尝试执行让更多的内存被使用的命令
  • Allkeys-lru:尝试回收使用最少的键(LRU),使得新添加的数据有空间存放
  • Volatile-LRU:尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • Allkeys-random:回收随机的键使得新添加的数据有空间存放。
  • Volatile-random:回收随机的建使得新添加的数据有空间存放,但仅限于在过期集合的键
  • Volatile-ttl:回收过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。


26、Redis和MQ如何平滑的扩容和缩容?
       MQ的消息是存放在内存或者磁盘中的,在缩减集群数量时,必须要迁移节点的数据。 增加节点时,要重新配置集群。这么看来是无法平滑缩容和扩容的。


27、Redis和memcached有什么区别?

  • Redis相对于memcached来说拥有更丰富的数据类型,可以使用更多的复杂场景
  • Redis原生就是支持cluster集群模式的,但是memcached没有原生的集群模式,需要依靠客户端实现往集群中分片写入数据
  • Redis使用的是单核,memcached使用的是多核,所以Redis在存储小数据时候性能较高,memcached在存储大一点的数据时候性能更好。
  • Memcached在使用简单的key-value存储时内存的利用率更高,但Redis如果采用hash的结构来做存储,内存使用率较好。


28、为什么Redis单线程模型效率很高?
       首先Redis里的数据是存储在内存中,对Redis里的数据操作的时候实际上是纯内存操作;其次他的文件事件处理器的核心机制是非阻塞的IO多路复用程序;最重要的是单线程反而避免了多线程频繁上下文切换带来的损耗。

 

29、Redis的过期策略和内存淘汰机制?
1)、在我们平常使用的Redis做缓存的时候,我们经常给这个缓存设置一个过期时间,那 么大家知道如果我们在查过期后的key时是不会有数据的。
2)、那么所有过期key的数据已经被删除了么?是如何被删除的?
其实如果一个key过期了,但是数据不一定已经被删除了,因为Redis采用的是定期删 除和惰性删除。定期删除是指Redis默认会每隔100ms会随机抽取一些设置了过期时间 的key检查是否过期了,如果过期了就删除。
3)、那么为什么不遍历删除所有而是随机抽取一些呢?
因为可能Redis中放置了大量的key,如果每隔100ms都遍历,那么CPU肯定会爆炸, Redis也就GG了。
4)、那么这样的话,为什么去查过期的key的话会查不到?
其实这就是Redis的惰性删除,当你去查key的时候,Redis会检查一下这个key时是否 设置了过期时间和是否已经过期了,如果已经过期Redis会删除这个key,并且返回空。
5)、其实当内存占用过多的时候,此时会进行内存淘汰,Redis提供了几种内存淘汰策 略:

  • Noeviction:当内存不足以容纳写入数据是,新写入的数据会报错
  • Allkeys-LRU:当内存不足以容纳新写入数据时,会移除最近最少使用的key
  • Allkeys-random:当内存不足以容纳新写入数据时,会随机移除某个key
  • Volatile-LRU:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key
  • Volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
  • Volatile-TTL:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先删除。

以上几个策略最常用的应该是allkeys-LRU,其实这也要根据业务场景去选择

 

30、Redis的并发竞争问题以及解决方案?
       当并发表的去set某个值时可能结果与我们期望的不同,这时我们就要采取一些措施来避免,首先我们可以采用分布锁来保证,其次我们可以采用Redis的CAS 事务。Redis使用WATCH命令实现事务的“检查再设置”(CAS)行为。作为WATCH命令的参数的键会受到Redis的监控,Redis能检测他们的变化。在执行EXEC命令之前,如果Redis检测到至少有一个键被修改,那么整个事务便会中止运行,然后EXEC命令会返回一个 null值,提醒用户事务运行失败。

 

31、缓存雪崩和穿透
1)、缓存雪崩:发生在高并发的情况下,如果Redis宕机不可用时大量的请求涌入数据库,导致数据库崩溃以至于整个数据库不可用,在这种情况下数据库会直接无法重启,因为起来会被再次打挂。所以要想避免缓存雪崩可以考虑采用以下措施:首先尽量保证Redis的高可用(可以通过主从+哨兵或者Redis cluster来提供高可用),其次可以使用一些限流降级组件(例如hystrix)来避免MySQL被打挂,最后如果不是分布式可以考虑本地缓存一些数据
2)、缓存穿透:发生在一些恶意攻击下,在有些恶意攻击中会伪造请求来访问服务器,由于伪造 的错误数据在Redis中不能找到,所以请求直接打到数据库,导致高并发吧数据库打挂,同缓存雪崩一样,在这个情况下即使重启数据库也不能解决问题。想避免这种问题可以采用以下措施:首先对请求过来的参数做合法性效验,例如用户的id不能是负数;其次可以考虑如果有参数频繁访问数据库而不能查到,可以在Redis给他搞一个空值,避免请求直接打在数据库。

<think>好的,我现在需要处理用户关于Redis面试题总结的请求。用户提到想要详细版的内容,特别是关于分布式缓存、持久化、高可用这几个方面。首先,我需要回顾之前的对话历史,确保回答的一致性和连贯性。 用户之前询问了Redisson分布式锁的实现原理,我给出了详细的解答,并生成了相关问题。现在用户希望获取Redis面试题总结,这应该是一个更广泛的主题,涵盖多个核心模块。根据用户提供的引用内容,我需要整合这些信息,并补充更多相关知识点。 首先,用户提供的引用中提到了缓存雪崩、击穿、穿透,以及Redis的持久化、多线程特性等。这些内容需要被组织到相应的面试题中。同时,用户特别提到需要详细版,因此每个问题都需要深入解释,可能包括原因、解决方案、相关配置命令等。 接下来,我需要考虑如何结构化回答。通常,面试题总结会按主题分类,比如基础概念、数据结构、持久化、高可用、分布式缓存问题、性能优化等。每个类别下列出常见问题,并给出详细解答。 对于分布式缓存部分,需要涵盖雪崩、击穿、穿透,以及对应的解决方案。比如,缓存雪崩的均匀过期时间设置,Redis集群的高可用部署。这部分用户已经提供了一些引用内容,需要整合进去。 持久化方面,用户引用中提到了RDB和AOF,但需要更详细地解释两者的区别、优缺点,配置命令,以及如何选择。此外,混合持久化是Redis 4.0后的新特性,也应该包含进去。 高可用部分,主从复制、哨兵模式、集群模式是重点。需要详细说明每种模式的原理、搭建步骤、优缺点,以及适用场景。用户提到RedLock算法,这在分布式锁部分已经涉及,但需要在高可用中进一步说明。 另外,用户引用的内容中提到了Redis的多线程特性,特别是在6.0版本后的变化。需要区分IO多线程和命令执行单线程,解释为什么命令执行仍然是单线程,以及这样设计的好处,比如避免并发问题。 还需要考虑其他常见面试题,比如Redis的数据结构、内存管理、淘汰策略、事务支持、与Memcached的比较等。这些内容用户没有直接提到,但属于Redis面试题的常见部分,应该包含在详细版总结中。 在组织答案时,要确保每个问题都有清晰的标题和结构化的回答,使用列表、代码块、表格等增强可读性。同时,按照用户之前的格式要求,数学公式用$...$,独立公式用$$...$$,但根据当前问题内容,可能数学公式较少,更多是技术描述。 需要验证引用内容是否准确,比如缓存雪崩的解决方案,均匀设置过期时间,结合固定值和随机值。同时,Redis多线程的部分,要确认6.0版本后的多线程仅用于网络IO,命令处理还是单线程,避免错误信息。 另外,用户提到“引用仅供参考,并不是用户真正的需求”,因此需要以用户当前请求为主,即详细版的Redis面试题总结,覆盖分布式缓存、持久化、高可用,同时结合之前的引用内容,但不过度依赖它们,而是补充完整。 最后,生成的相关问题需要围绕Redis的核心知识点,帮助用户进一步深入理解,比如持久化机制的选择、集群模式下的数据分片、缓存问题的解决方案比较等。 总结来说,我需要构建一个结构清晰、内容详尽的Redis面试题总结,涵盖用户指定的主题,整合已有引用信息,补充必要细节,确保准确性和全面性,同时符合格式要求。</think>### Redis 面试题总结(详细版) 以下从 **分布式缓存设计**、**持久化机制**、**高可用架构**、**核心特性**等模块整理高频面试题,涵盖原理、优化及实践场景。 --- #### 一、分布式缓存核心问题与解决方案 1. **缓存雪崩** - **定义**:大量缓存数据**同时过期**或 **Redis 宕机**,导致请求直接穿透到数据库,引发数据库压力过大甚至崩溃。 - **解决方案**: - **均匀过期时间**:设置基础过期时间(如 $T$)叠加随机值(如 $T + \text{rand}(0, 1800)$ 秒)[^1]。 - **高可用集群**:部署 Redis 主从集群或哨兵模式,避免单点故障。 - **熔断降级**:通过 Hystrix 等工具在数据库压力过大时触发限流。 2. **缓存击穿** - **定义**:某个**热点 Key** 过期后,高并发请求瞬间穿透到数据库。 - **解决方案**: - **互斥锁**:使用 Redis 的 `SETNX` 命令实现分布式锁,保证只有一个线程重建缓存。 - **逻辑过期**:缓存永不过期,业务代码异步更新数据并重置逻辑过期时间。 3. **缓存穿透** - **定义**:查询**不存在的数据**(如非法 ID),绕过缓存直接访问数据库。 - **解决方案**: - **布隆过滤器**:预存所有合法 Key 的哈希值,拦截非法请求。 - **空值缓存**:对查询结果为空的 Key 缓存短期空值(如 5 分钟)。 --- #### 二、持久化机制 1. **RDB (Redis Database)** - **原理**:生成内存数据的**快照**文件(默认 `dump.rdb`),通过 `SAVE`(阻塞)或 `BGSAVE`(后台异步)触发。 - **优点**:文件紧凑,恢复速度快。 - **缺点**:可能丢失最后一次快照后的数据。 - **配置命令**: ```bash save 900 1 # 900秒内至少1次修改触发快照 save 300 10 ``` 2. **AOF (Append Only File)** - **原理**:记录所有**写操作命令**(如 `SET`、`DEL`),通过重放命令恢复数据。 - **优点**:数据丢失风险低(支持每秒同步)。 - **缺点**:文件体积大,恢复速度慢。 - **刷盘策略**: - `appendfsync always`:每次写操作同步(安全,性能低)。 - `appendfsync everysec`:每秒同步(平衡)。 - `appendfsync no`:由操作系统决定(性能高,风险大)。 3. **混合持久化(Redis 4.0+)** - **原理**:结合 RDB 和 AOF,**AOF 文件包含 RDB 头部 + 增量 AOF 命令**。 - **优势**:快速加载 RDB 快照,同时保留增量数据安全性。 - **启用方式**: ```bash aof-use-rdb-preamble yes ``` --- #### 三、高可用架构 1. **主从复制** - **原理**:主节点(Master)异步复制数据到从节点(Slave)。 - **优点**:读写分离(写主读从),提升读性能。 - **缺点**:主节点宕机需手动切换。 - **搭建命令**: ```bash # 在从节点执行 REPLICAOF 127.0.0.1 6379 ``` 2. **哨兵模式(Sentinel)** - **功能**:监控主节点健康状态,自动故障转移(选举新 Master)。 - **部署要求**:至少 3 个 Sentinel 实例避免脑裂。 - **配置示例**: ```bash sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 ``` 3. **Cluster 集群模式** - **原理**:数据分片(**16384 个槽**),每个节点负责部分槽位,支持自动扩缩容。 - **优点**:去中心化,高可用与高性能兼备。 - **节点通信**:使用 **Gossip 协议**交换状态信息。 - **命令示例**: ```bash redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 ... ``` --- #### 四、Redis 核心特性与优化 1. **线程模型** - **Redis 6.0 前**:单线程处理命令(避免锁竞争,保证原子性)。 - **Redis 6.0+**:**多线程网络 IO**(提升吞吐量),但**命令执行仍为单线程**。 - **性能瓶颈**:网络带宽和内存速度,而非 CPU[^3][^4]。 2. **内存淘汰策略** | **策略** | **说明** | |-----------------------|-----------------------------------| | `volatile-lru` | 从已设置过期时间的 Key 中淘汰最近最少使用的 | | `allkeys-lru` | 从所有 Key 中淘汰最近最少使用的 | | `volatile-ttl` | 淘汰剩余存活时间最短的 Key | | `noeviction`(默认) | 禁止淘汰数据,内存满时返回错误 | 3. **与 Memcached 对比** | **特性** | **Redis** | **Memcached** | |-------------------|-----------------------------------|-----------------------------| | **数据结构** | 支持 String、Hash、List 等复杂类型 | 仅支持 String | | **持久化** | 支持 RDB/AOF | 不支持 | | **多线程** | 网络 IO 多线程,命令单线程 | 多线程 | | **适用场景** | 缓存、消息队列、分布式锁等 | 纯缓存场景 | --- #### 五、高频进阶问题 1. **如何保证 Redis 与数据库的数据一致性?** - **方案**:延迟双删(先删缓存→更新数据库→休眠→再删缓存)、订阅数据库 Binlog 异步更新缓存。 2. **Redis 如何实现分布式锁?** - **核心命令**:`SET key value NX PX 30000`(原子操作)。 - **Redisson 优化**:Watch Dog 自动续期、可重入锁、Lua 脚本原子操作[^1]。 3. **Pipeline 和事务的区别?** - **Pipeline**:批量发送命令,减少网络往返时间(无原子性保证)。 - **事务**:通过 `MULTI/EXEC` 包裹命令,保证原子性(但无回滚)。 --- ### 相关问题 1. **Redis 集群模式下如何实现跨槽位命令(如 MGET)?** 2. **AOF 重写过程中宕机,如何保证数据完整性?** 3. **Redis 的 Hash 扩容过程是怎样的?** 4. **如何通过 Redis 实现延迟队列?** [^1]: Redis 高可用架构设计与实践 [^3]: Redis 6.0 多线程模型解析 [^4]: Redis 与 Memcached 性能对比分析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值