JAVA面试篇(三)一Redis

Java面试-Redis篇 缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。我们当时使用的是redisson实现的布隆过滤器。 阅读详情

1.基础

1、Redis 为何这么快?

➢ 1)基于内存;
➢ 2)单线程减少上下文切换,同时保证原子性;
➢ 3)IO多路复用;
➢ 4)高级数据结构(如 SDS、Hash以及跳表等)。

2、为何使用单线程?

因为 Redis 是基于内存的操作,CPU 不会成为 Redis 的瓶颈,而最有可能是机器内存的大小或者网络带宽。
既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。

详细原因:
	➢ 1)不需要各种锁的性能消耗
	Redis 的数据结构并不全是简单的 Key-Value,还有 List,Hash 等复杂的结构,这些结构有可能会进行
	很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象。这些操作可能就
	需要加非常多的锁,导致的结果是同步开销大大增加。
	
	➢ 2)单线程多进程集群方案
	单线程的威力非常强大,每核心效率也非常高。多线程虽然比单线程有更高的性能上限,但是在今
	天的计算环境中,即便单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,
	这些方案中多线程的技术照样是用不上的。所以单线程、多进程的集群不失为一个时髦的解决方案。

3、缓存三大问题以及解决方案?

➢ 缓存穿透:查询数据不存在
	○ 1)缓存空值
	○ 2)key 值校验,如布隆筛选器 ref 分布式布隆过滤器(Bloom Filter)详解(初版)
	
➢ 缓存击穿:缓存过期,伴随大量对该 key 的请求
	○ 1)互斥锁
	○ 2)热点数据永不过期
	○ 3)熔断降级
	
➢ 缓存雪崩:同一时间大批量的 key 过期
	○ 1)热点数据不过期
	○ 2)随机分散过期时间
	

4、先删后写还是先写后删?

➢ 先删缓存后写 DB
	产生脏数据的概率较大(若出现脏数据,则意味着再不更新的情况下,查询得到的数据均为旧的数据)。	
	比如两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,
	先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致
	缓存中的数据是脏的,而且还一直这样脏下去了。

➢ 先写 DB 再删缓存
	产生脏数据的概率较小,但是依然会出现一致性的问题;若更新操作的时候,同时进行查询操作并命中,则查
	询得到的数据是旧的数据。但是不会影响后面的查询。
	
	比如一个是读操作,但是没有命中缓存,然后就到数据库中取数据,此时来了一个写操作,写完数据库后,让缓
	存失效,然后之前的那个读操作再把老的数据放进去,所以会造成脏数据。解决方案:
	➢1)缓存设置过期时间,实现最终一致性;
	➢2)使用 Cannel 等中间件监听 binlog 进行异步更新;
	➢3)通过 2PC 或 Paxos 协议保证一致性。

5、如何保证 Redis 的高并发?

Redis 通过主从加集群架构,实现读写分离,主节点负责写,并将数据同步给其他从节点,从节点负责读,从而实现高并发。

6、Redis 如何保证原子性?

由于 Redis 是单线程的,所以 Redis 提供的 API 也是原子操作。但我们业务中常常有
先 get 后 set 的业务常见,在并发下会导致数据不一致的情况。如何解决:
➢ 1)使用 incr、decr、setnx 等原子操作;
➢ 2)客户端加锁;
➢ 3)使用 Lua 脚本实现 CAS 操作。

7、有哪些应用场景?

Redis 在互联网产品中使用的场景实在是太多太多,这里分别对 Redis 几种数据类型做了整理:
➢1)String:缓存、限流、分布式锁、计数器、分布式 Session 等。
➢2)Hash:用户信息、用户主页访问量、组合查询等。
➢3)List:简单队列、关注列表时间轴。
➢4)Set:赞、踩、标签等。
➢5)ZSet:排行榜、好友关系链表。

2.持久化

1、Redis 的数据过期策略是什么?

在回答词问题之前,首先需要回答另一个问题,就是如何设置 Redis 中数据的过期时间?
➢1)expire key time (以秒为单位)–这是最常用的方式
➢2)setex(String key, int seconds, String value) --字符串独有的方式

2、如果设置了缓存过期时间,如何让其永不过期。

使用 persist key

3、Redis 的数据过期策略是什么?

➢ 常见的过期策略
1)定时删除
	在设置 key 的过期时间的同时,为该 key 创建一个定时器,让定时器在 key 的过期时间来临时,对 key 进行删除。
2)惰性删除
3)定期删除
	每隔一段时间执行一次删除(在 redis.conf 配置文件设置,1s 刷新的频率)过期 key 操作。

➢ Redis采用的过期策略
	Redis 采用了 ‘惰性删除 + 定期删除’ 的方式处理过期数据。

➢ 惰性删除的流程
	1)在进行get或setnx等操作时,先检查key是否过期;
	2)若过期,删除key,然后执行相应操作;
	3)若没过期,直接执行相应操作。

➢ 定期删除的流程
	其核心是对指定个数个库的每一个库随机删除小于等于指定个数个过期 key:
	1)历每个数据库(就是 redis.conf 中配置的 “database” 数量,默认为16);
	
	2)检查当前库中的指定个数个 key (默认是每个库检查 20 个,相当于该循环执行 20 次):
		2.1)如果当前库中没有一个 key 设置了过期时间,直接执行下一个库的遍历;
		2.2)随机获取一个设置了过期时间的 key,检查是否过期,如果过期则删除;
		2.3)判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

4、持久化文件对过期策略的处理?

过期 key 是不会写入 RDB 和 AOF 文件,同时数据恢复时也会做过期验证。

5、Redis 有哪些内存淘汰机制?

Redis 作为一个内存数据库,在内存空间不足的时候,为了保证命中率,就会和我们操作系统中的
页面置换算法类似,选择一定的数据淘汰策略。

➢ volatile(设置过期时间的数据集)
	1)volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
	2)volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
	3)volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
	4)volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。

➢ allkeys(所以数据集)
	5)allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
	6)allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。
	7)allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

➢ no-enviction
	8)no-enviction(驱逐):禁止驱逐数据,这也是默认策略。
	意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续
	进行,采用 no-enviction 策略可以保证数据不被丢失。

PS:在 redis.config 文件中,我们可以设置 maxmemory 的值来配置 Redis 的最大占用内存字节数。

6、Redis 有哪些持久化机制?

RDB 和 AOF。

7、说说 Redis 的 RDB?

RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式。
也就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb。

RDB 支持 同步(save 命令)、后台异步(bgsave)以及自动配置三种方式触发。

➢ 优点
	○ RDB 文件紧凑,全量备份,非常适合用于进行备份和灾难恢复
	○ 生成 RDB 文件时支持异步处理,主进程不需要进行任何磁盘IO操作
	○ RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
	
➢ 缺点
	○ RDB 快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。
	且在快照持久化期间修改的数据不会被保存,可能丢失数据。
	

8、说说 Redis 的 AOF?

全量备份总是耗时的,有时候我们提供一种更加高效的方式 AOF,其工作机制更加简单:会将每一个收
到的写命令追加到文件中。随着时间推移,AOF 持久化文件也会变的越来越大。
为了解决此问题,Redis 提供了 bgrewriteaof 命令,作用是 fork 出一条新进程将内存中的数据以
命令的方式保存到临时文件中,完成对AOF 文件的重写。

AOF 也有三种触发方式:
	➢ 每修改同步 always 
	➢ 每秒同步 everysec
	➢ 不同步 no:从不同步。

➢ 优点
	○ AOF 可以更好的保护数据不丢失,一般 AOF 隔 1 秒通过一个后台线程执行一次 fsync 操作
	○ AOF 日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损
	○ AOF 日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写
	○ AOF 日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复
	
➢ 缺点
	○ 对于同一份数据来说,AOF 日志文件通常比 RDB 数据快照文件更大
	○ AOF开启后,支持的写 QPS 会比RDB支持的写 QPS 低,因为 AOF 一般会配置成每秒 fsync 一次
	日志文件,当然,每秒一次 fsync,性能也还是很高的

9、RDB 和 AOF 该如何选择?

通常是二者结合使用的。

3.内存优化

➢ 1. 更快地回收过期的键内存
	当你在一个键上设置了过期时间时,redis不会在该瞬间使它过期。这意味着redis消耗内存来保存已经过期的键。
	
	快速回收这些缓存的办法:
		○ 重新启动redis服务器
		○ 在redis.conf中增加maxmemory-samples。(默认值为5,最大为10),以便更快地回收过期的键。
		○ 可以设置一个cron作业,该作业在一定间隔后运行scan命令,这有助于回收过期键的内存。
		○ 尽量所有的键都增加过期时间。
		
➢ 其他方案,暂不细述

4.集群模式

qt实现OCC读取STEP模型并显示(附完整源码) 阅读详情

相关推荐

避开STM32中断优先级配置的坑:HAL_NVIC_SetPriority()参数你真的用对了吗?

本文深入解析STM32中断优先级配置中的关键问题,重点剖析HAL_NVIC_SetPriority()函数的正确使用方法。通过实际案例揭示优先级分组设置、抢占优先级与子优先级的区别,提供多中断系统中的优化策略和调试技巧,帮助开发者避免常见配置错误,提升系统稳定性。

weixin_42532938的博客 421

[Java大厂必备面试题] 点滴促就辉煌, 每日三题 [Day2] :Redis篇一

这里是征得哈哈哥本人同意搬运! 我看完一篇就搬运一篇 其中可能会插曲自己的理解   面试题1:Java 中操作字符串都有哪些类?它们之间有什么区别? 正经回答: 深入追问: 追问1:这三者在效率上怎么说? 面试题2:请你说一下Error 和 Exception 区别是什么? 正经回答: 面试题3:== 和 equals 的区别是什么 正经回答: 深入追问: 追问1:如果我们不重写equals() 方法,会怎么样? ========================...

汤圆的博客 281

在PLC中将十六进制数据转换为浮点数(通常遵循IEEE 754标准)需要理解数据存储格式,并按以下步骤操作:

通过以上步骤,您可以在PLC中实现十六进制到浮点数的转换。T DBD20 // 将数据传送到浮点数变量(如DB1.DBD20)指数位(8位):实际指数 = 存储值 - 127(偏移量)。:必须确认PLC的存储顺序(大端或小端),否则结果错误。将两个16位寄存器合并为32位数据,需注意。尾数位(23位):隐含前导1,实际值为。:确保32位数据在寄存器中连续且对齐。符号位(1位):0表示正,1表示负。:高位寄存器在前(如西门子PLC)。:低位寄存器在前(如三菱FX系列)。,误差因截断导致)。

K11mvp的博客 4416

纯干货分享!百度Java一、二、三面面经总结,本人已成功拿到offer!

前言 百度一,二,三面面经,回馈牛客,许愿OC。 一面和二面问的问题有部分重复,前面写了后面就没有写出来。 这次面试是春招体验最好的一次,面试官非常和蔼。一些比较深难的知识自己不会,面试官还安慰说没关系。 ???? 三面面试官是一个小姐姐,声音温柔又好听。???? 1面 10:10 【Spring】 Spring的项目介绍一下 加载扫描bean的流程 Spring生命周期 Spring的Bean的作用域 MVC流程,@RequestMapping注解具体怎么实现的? @Transaction注解实现知道吗,

weixin_49494194的博客 6841

【毕设】基于LoRa的物联网控制器:从原理图到PCB的完整硬件设计指南

本文提供了一份完整的基于LoRa的物联网控制器硬件设计指南,涵盖从系统框图、原理图设计到PCB布局布线的全流程。详细讲解了电源电路、单片机最小系统、信号接口以及LoRa无线模块等核心模块的设计要点与抗干扰技巧,并分享了实用的调试心得,旨在帮助电子、物联网专业学生顺利完成毕业设计,掌握低功耗远距离物联网节点的硬件开发实践。

weixin_42126677的博客 306

逆向工程实战:解密AppleAccount的X-MMe-Nas-Qualify签名生成机制

本文通过逆向工程实战,详细解析了AppleAccount服务中X-MMe-Nas-Qualify签名的生成机制。作者利用Frida进行动态追踪定位签名源头,结合IDA Pro进行静态分析,并借助LLDB动态调试还原核心算法。文章最终分享了如何独立于苹果官方库,通过Python代码复现签名算法,为自动化测试和深度交互苹果服务的开发者提供了关键技术路径。

weixin_29323049的博客 706

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day2】 —— Redis篇1

百日闭关修炼,每日三道高频面试题。一起冲进大厂!看什么看?快上车!今天是Reds,香

陈哈哈的菜园子 2万+

Cisco Secure ACS 5.8.0.32 安装 + Crack 教程

在ESXi 6.7 上经历过无数次的安装尝试测试了各种兼容版本都没有安装成功,记最后一次安装成功的过程.

Junior's Blog 3536

【java面试】redis篇

redis集群有哪些方案?主从模式保证不了集群的高可用,主节点宕机之后,就丧失了写数据的能力。Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。哨兵选主规则。

qq_52200849的博客 2261

基于YOLOv11的无人机目标检测系统:实现drone、bird、aircraft多类别识别

采用改进的YOLOv11网络结构,平衡检测精度和速度融合VisDrone和UAVDT数据集,增强模型泛化能力设计多尺度特征融合模块,提升小目标检测性能开发直观的UI界面,便于实际部署和应用。

YOLO 322

SAP OData 开发从入门到提高教程的目录

笔者 18 年的 SAP 技术开发生涯,对 SAP OData 服务的开发,测试,发布,部署,测试,及基于各种不同 SAP 技术实现的 OData 服务的幕后技术实现细节和使用场合,均有着深入的研究。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 7236

java面试篇 Redis+MySQL+Spring

联合索引(Composite Index)是数据库中的一种索引类型,它基于表中的多个列创建。与单列索引(基于单个列创建的索引)不同,联合索引可以同时对多个列进行索引,从而提高多列查询的性能。联合索引是数据库中一种强大的工具,可以显著提高多列查询的性能。通过合理设计联合索引,可以优化查询性能,但需要注意索引的维护成本和列的顺序。记录日志:把这些通用代码抽出来,避免跟你的业务代码进行耦合:在 Spring 框架中,代理(Proxy)和动态代理(Dynamic Proxy)

weixin_50261367的博客 2087

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Java面试】一、Redis篇(上)

请求2进来(对应线程2),其进行了update,改库,并删缓存,此时,库中为20,缓存中为null。然后新的请求进来(对应线程2),CPU切到线程2执行,查缓存未命中,线程2去查库 + 写入缓存,线程2执行结束,此时缓存为10,库中为10。缓存未命中,查库前,获取一个互斥锁,获取不到则一直重试,如此,后面的线程走不到查库这一步,直到线程1完成查库+写入Redis,其余线程就会命中缓存。理想状态为:线程1删缓存,再更新数据库,后面请求过来(对应线程2),先查缓存,未命中,去查库 + 写入缓存,一切正常。

llg___的博客 1111

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JAVA面试Redis篇

Redis经典面试问题

kingandsong的博客 1425

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java——《面试题——Redis篇》

Redis 是一个开源(BSD 许可)、基于内存、支持多种数据结构的存储系统,可以作为数据库、缓 存和消息中间件。它支持的数据结构有字符串(strings)、哈希(hashes)、列表(lists)、集合 (sets)、有序集合(sorted sets)等,除此之外还支持 bitmaps、hyperloglogs 和地理空间( geospatial )索引半径查询等功能。

行秋的博客 4988

【Java高频面试问题】Redis篇

‌策略‌‌一致性‌‌复杂度‌‌适用场景‌先删缓存,后改库弱高(需补偿)低并发、允许短暂不一致‌先改库,后删缓存‌‌强‌中‌高并发强一致性系统‌‌Binlog监听删除‌‌最终强‌高‌超大规模系统。

weixin_45698637的博客 1619

Java面试题之Redis篇

Java面试题之Redis篇

qq_63274189的博客 844

【Java 面试 八股文】Redis篇

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。这种情况大概率是遭到了攻击。解决方案的话,我们通常都会用缓存空对象或者布隆过滤器来解决它。缓存空对象优点:实现简单,维护方便缺点:额外的内存消耗,可能造成短期的不一致布隆过滤优点:内存占用较少,没有多余key缺点:实现复杂,存在误判可能(有穿透的风险),无法删除数据。

Luo_LA的博客 2670

Java面试之Redis篇(offer 拿来吧你)

现在关于Java面试的资料是层出不穷,对于选择困难症的同学来说,无疑是陷入了一次次的抉择与不安中,担心错过了关键内容,现在小曾哥秉持着"融百家之所长,汇精辟之文档"的思想,整理一下目前主流的一些八股文,以达到1+1 > 2 的效果!...

qq_36317312的博客 2304

Java高频面试之Redis篇

按照这个核心思想,Redis 中的 LRU 策略,会在每个数据对应的 RedisObject 结构体中设置一个 lru 字段,用来记录数据的访问时间戳。缓存击穿是指在使用缓存系统时,某个热门数据过期或被删除后,恰好有大量的并发请求同时访问该数据,导致这些请求都无法命中缓存,直接访问后端存储系统,对后端系统造成巨大压力,可能引发系统崩溃或性能下降的问题。缓存雪崩是指在使用缓存系统时,缓存中大量的数据同时过期或失效,导致大量的请求直接访问后端存储系统,使得后端系统承受巨大的压力,甚至引发系统崩溃的现象。

Java领域优秀创作者 2245

Java面试题超详细整理《Redis篇》

Redis(Remote Dictionary Server)远程字典服务,是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同,Redis中的值可以是由string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)等多种数据结构组成,能够满足很多的应用场景,同时Redis会将所有数据都存放在内存中,读写速度非常快。基于键值对、读写速度快、数据结构丰富、简单稳定、支持持久化、支持事务(原子性)、主从复制、高可用与分布式。

mh17680313750的博客 1641

java——《面试题——基础篇》

1、Java语言有哪些特点1、简单易学、有丰富的类库2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高)3、与平台无关性(JVM是Java跨平台使用的根本)4、可靠安全5、支持多线程。

行秋的博客 9850

面试官:我们来聊一聊Redis吧,你了解多少就答多少

面试官:我们来聊一聊Redis吧,后面的问题你肯定想不到

真正的大师永远怀着一颗学徒的心 1万+

Java面试八股—Redis篇

双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。由于数据库和缓存的读写操作可能并发执行,导致缓存与数据库不一致,Redis采取不同策略来解决该问题。读操作:缓存命中,直接返回数据;缓存未命中查询数据库,返回之前将数据写入缓存,设定该数据的过期时间。RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

m0_62669698的博客 2632

Redis面试篇

Redis分片集群如何判断某个key应该在哪个实例?将16384个插槽分配到不同的实例根据key计算哈希值,对16384取余余数作为插槽,寻找插槽所在实例即可如何将同一类数据固定的保存在同一个Redis实例?Redis计算key的插槽值时会判断key中是否包含{},如果有则基于{}内的字符计算插槽数据的key中可以加入{类型},例如key都以{typeId}为前缀,这样同类型数据计算的插槽一定相同。

m0_50345460的博客 1335

【java面试题-Redis篇-2024】

Redis,英文全称是 Remote Dictionary Server(远程字典服务),是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。与 MySQL 数据库不同的是,Redis 的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过 10 万次读写操作。因此 Redis 被广泛应用于缓存,另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务、持久化、LUA 脚本、多种集群方案。

qq_46023503的博客 1653
上一篇: JAVA面试篇(二)一MYSQL
下一篇: JAVA面试篇(四)一 Spring
star_falling
博客等级 码龄11年 287粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值