面试中被嘲笑Token放在Redis里?这把给我干沉默了....

Transformer 常见面试题深度解析:从原理到工程实践 先给结论,再展开推导:面试官时间有限,先一句话回答核心,再补充细节;公式与直觉并重:能推导dk\sqrt{d_k}dk​​的方差来源,也能用"防止 softmax 饱和"的直觉解释;主动关联工程实践:提到 FlashAttention、KV Cache、GQA 等,体现落地经验;诚实面对不确定:不清楚的细节不要编造,可以说"这部分我了解思路,具体实现需要再确认";准备一个完整项目故事:能讲清"遇到什么问题 → 如何定位 → 用什么方案 → 效果如何量化"。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本 


面试被问登录认证怎么做,你说"Token 放 Redis 里"。面试官笑了一下,说你不懂 JWT 的无状态设计。

这场景不少见。知乎上有人专门问过,底下争了半天,说的其实是同一件事:选型没问题,但你没说清楚为什么选。

这篇文章把这件事说清楚:从 JWT 是什么,到放 Redis 的原因,再到面试里怎么回答。

JWT 到底是什么

JWT 全称 JSON Web Token,说白了就是一段字符串,用点号分成三段:Header、Payload、Signature。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT的三段结构:Header(算法类型)、Payload(用户信息)、Signature(签名),三部分Base64编码后用点号连接
  • Header :声明算法类型(比如 HS256)

  • Payload :存用户信息(用户 ID、角色、过期时间)。只是 Base64 编码,不是加密 ——任何人拿到 token 都能解码看到内容,密码绝对不能放

  • Signature :用 Header + Payload + 服务端密钥算出来的签名,作用是防篡改

整个验证流程:

JWT认证完整流程:用户登录→服务端签发Token→客户端存储→请求时带上Token→服务端验签

登录成功 → 服务端签发 Token → 客户端保存(一般放 localStorage)→ 每次请求在 Header 里带上 Authorization: Bearer <token> → 服务端验签,从 Payload 取用户信息。全程不查数据库、不查 Redis,自给自足。 这就是"无状态"的意思。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

JWT"无状态"的代价:四个致命场景

无状态听起来很美,上线后就知道了。

场景一:账号被盗,无法立即踢人 。Token 有效期 2 小时,现在还剩 1 小时 45 分钟。怎么让它立刻失效?纯 JWT 做不到——已签发的 token 在过期前一直有效。

场景二:封禁用户不生效 。账号封了,但手里的 token 还能用。

场景三:改密码不踢其他设备 。用户改了密码,想让其他设备全部失效。纯 JWT 做不到。

场景四:token 过期吞表单 。用户填了 20 多分钟的表单,点提交,token 过期了,整个内容全丢。

这四个场景加在一起,几乎是所有正经业务系统都会碰到的问题。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

为什么要把 Token 放 Redis

解决上面这些问题,最直接的方案是黑名单 。

用户被踢下线时,把 token 加进黑名单。每次请求先查黑名单,在里面就拒。黑名单存哪?内存不行(多台服务器不共享,重启丢),数据库太慢(每个请求都查一次受不了),Redis 最合适 ——查询不到 1ms,分布式共享。

// 退出登录时,把 token 加入黑名单
public void logout(String token) {
    long expiration = jwtUtil.getExpiration(token);
    long ttl = expiration - System.currentTimeMillis();
    if (ttl > 0) {
        redisTemplate.opsForValue().set(
            "blacklist:" + token, "1", ttl, TimeUnit.MILLISECONDS
        );
    }
}

// 验证 token 时,先查黑名单
public boolean isTokenValid(String token) {
    if (redisTemplate.hasKey("blacklist:" + token)) {
        returnfalse;
    }
    return jwtUtil.verify(token);
}

Redis 只存"已失效"的 token,平时没什么写入,查询也快。

还有更彻底的方案:直接把 token 存 Redis,每次验证都去 Redis 查。 这和传统 Session 没太大区别,只是借了 JWT 格式当 Session ID 用。

黑名单 vs 白名单:两种方案的本质区别

方案

存什么

查几次 Redis

能否主动吊销

是否无状态

纯 JWT

不存

0 次

不能

是

JWT+黑名单

存失效的 token

1 次

能

不完全是

token 存 Redis(白名单)

存所有 token

1 次

能

否

黑名单 相对轻量,正常请求不写 Redis,只有踢人时才写,多数业务选这个。白名单 控制力更强,能做限制同时在线设备数、实时查看在线状态,代价是每次请求都依赖 Redis。

双 Token 续期方案

Token 到期了,用户正在操作怎么办?

  • AccessToken :有效期短(30 分钟),做实际鉴权

  • RefreshToken :有效期长(7 天),只用来换 AccessToken

AccessToken 过期,前端用 RefreshToken 换新的,对用户无感。RefreshToken 存 Redis,用户改密码就删掉,自动让他下次操作时重新登录。

Redis 本身可靠吗

有人担心引入单点故障。Redis 的高可用方案跑了十几年:

  • Sentinel(哨兵模式) :主节点挂了自动选新主

  • Cluster(集群模式) :数据分片,横向扩展

Redis Cluster架构:数据分片分布在多个节点,支持横向扩展和自动故障转移

性能方面 Redis 单次查询 1ms 以内,单机 QPS 十几万。说"不能放 Redis 因为会单点故障"——这逻辑说不通。

面试官到底在嘲笑什么

两种情况。

第一种 :你用了 JWT 但验证时完全不走签名,每次都去 Redis 查 token 是否存在。这等于只借了 JWT 格式,没用它的能力——不如直接生成随机字符串当 Session ID,还省了编解码开销。面试官嘲笑的是这里。

第二种 :你确实有业务需求需要主动吊销,选了 JWT+Redis 方案。但面试里只说了"放 Redis",没说为什么。面试官误以为你不懂无状态设计。

第一种要改方案,第二种要改表达。

纯 JWT 什么时候真的合适

跨服务调用 :网关层做一次验签,用户信息往下游传。订单服务、支付服务直接从 JWT 取 userId,不用再查 Redis。这里 JWT 承担的是身份传递角色,不是管理登录会话。

一次性凭证 :邮箱验证链接、密码重置链接、临时分享链接。签一次用一次,不需要续期和吊销。

安全要求不高的内部工具 :用户量少,不需要踢人下线。纯 JWT 省一层依赖。

面试怎么答

别上来就说"放 Redis",也别上来就说"JWT 无状态"。

先说业务需求:需不需要主动踢人?改密码后需不需要其他设备立刻失效?需不需要限制同时在线设备数?

然后根据需求说方案:需要的话选 JWT+Redis 黑名单,说清楚纯 JWT 做不了主动吊销;不需要的话纯 JWT 够了,说清楚签名验证流程和密钥管理。

面试官真正想听的不是你选了哪个,是你知不知道每个方案的边界。 "Token 放 Redis"这件事本身没问题,问题是说不出来为什么放。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
16 硬件工程师笔面试高频考点真题解析——滤波器 文章系统介绍了滤波器的核心参数(截止频率、滚降斜率等)、分类(低通/高通/带通/带阻)及有源/无源滤波的区别。重点分析了开关电源采用LC滤波的原因(高效、强抑制),并详解了交流EMI滤波电路的工作原理。此外,阐述了信号干扰来源(传导/辐射/地耦合)、有源晶振串磁珠的作用(抑制噪声),以及巴特沃斯(幅频平坦)、切比雪夫(衰减快)和贝塞尔(相位线性)三种滤波器的特性差异与应用场景,为硬件设计提供实用参考。 阅读详情

相关推荐

21 硬件工程师笔面试高频考点真题解析——单片机

本文系统介绍了单片机的核心概念与应用知识,包括:单片机定义与选型要点(性能、存储、外设等);核心参数(主频、I/O、通信接口等);最小系统组成(电源、复位、晶振、BOOT);常见外设(GPIO、ADC、定时器等);GPIO工作模式(输入/输出);死机原因分析(硬件干扰、软件错误等);上电故障排查流程(电源、时钟、程序等);与DSP、FPGA的对比(控制vs运算vs可编程);常用通信总线特点(UART、I2C、SPI、CAN);看门狗功能(超时复位防死机)。内容涵盖单片机硬件设计关键要点,适合嵌入式开发者参考

XU157303764的博客 1323

面试中被嘲笑Token放在Redis里?这把给我干沉默了...

这等于只借了 JWT 格式,没用它的能力——不如直接生成随机字符串当 Session ID,还省了编解码开销。JWT 全称 JSON Web Token,说白了就是一段字符串,用点号分成三段:Header、Payload、Signature。面试官笑了一下,说你不懂 JWT 的无状态设计。如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描上方二维码关注一下,您的支持是我坚持写作最大的动力。最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

emprere的博客 40

15 硬件工程师笔面试高频考点真题解析——晶振

本文系统介绍了晶振的核心参数、选型与设计要点,涵盖无源晶振(频率、负载电容CL、ESR、激励功率)和有源晶振(供电电压、输出电平、相位噪声等)的关键指标差异。无源晶振成本低但依赖外部匹配,适合普通MCU;有源晶振集成度高、稳定性强,适用于高速通信(WiFi/USB)、射频及多芯片同步场景。文中对比了XO、TCXO、OCXO的温补精度与适用领域,并给出PCB布线规则(短走线、包地隔离)及不起振排查方法(参数匹配、干扰排查)。特别指出32.768kHz因分频便利和低功耗成为RTC首选,而高速接口需有源晶振

XU157303764的博客 2367

C++ 实习面试第一阶段:面向对象基础

C 和 C++ 都是通用编程语言,但设计思想和语言特性有所不同。C++ 相比 C 增加了以下重要特性:面试回答: C++ 并不是完全取代 C 的语言,它兼容了大量 C 语言的编程方式,同时提供了面向对象、泛型编程和资源管理等更丰富的特性。指针是存储对象地址的变量,引用是对象的别名。代码示例: 需要注意:两者都用于表示空指针,但类型和使用方式不同。为什么引入 nullptr?因为 NULL 在一些实现中本质上是整数 0,可能导致函数重载时产生歧义。 面试重点: C++11 以后优先使用 nullptr

zengjiajun2006的博客 1150

2019年数学建模美赛经验总结

北京时间2019年1月29号上午9时,数模美赛结束。美赛结束已经10多天了,我在这次竞赛中负责建模和编程,趁现在记忆还比较清晰,写下这篇博客记录第一次参加数学建模美赛的经历。 补更:2019年4月20日公布成绩,笔者最终获得了美赛一等奖 目录 1、基本情况 2、选题 3、分工合作 4、论文写作 5、建模 6、编程 7、入门资源 ...

Smallactive 7万+

【车辆仿真】从0开始建立dSPACE RT Simulink工程:CAN通信(RTICANMM方法)

【工程环境信息】:本文基于链接文章搭建SCALEXIO Rack RTPC总线节点,用于与AutoBox通信硬件:上位机:惠普台式PC(Windows 11专业版)下位机(实时机):AutoBox (DS1006)板卡:DS6342软件:本文所使用的DBC链接提示:以下是本篇文章正文内容,下面案例可供参考!!!的部分一定记得配置,其他的按需配置RTICANMM的灵活度非常高,尽可能参考Help文档,理解相应的配置内容官方有RTICANMM的样例工程,在下方路径。

winnizap的博客 2384

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 422

数字信号的艺术演绎:用FPGA+DAC实现音乐合成器的核心原理

本文深入探讨了如何利用FPGA和DAC技术实现数字音乐合成器的核心原理,涵盖DDS架构、多波形合成、MIDI协议解析及动态包络控制等关键技术。通过详细的Verilog代码示例和硬件实现方案,展示了数字信号处理在音乐合成中的艺术演绎,为电子音乐创作提供了强大的硬件支持。

weixin_28256233的博客 390

阿里面试:遇到 AI 碎片问句 了吗?怎么处理? AI 碎片问句实践:前置过滤 → 语义补全 → 意图槽位联合抽取

阿里面试:遇到 AI 碎片问句 了吗?怎么处理? AI 碎片问句实践:前置过滤 → 语义补全 → 意图槽位联合抽取

架构师尼恩 189

新手别怕!用‘东北天’和‘右前上’坐标系,5分钟搞懂惯性导航姿态矩阵(含Python验证代码)

本文通过‘东北天(ENU)’和‘右前上(RFU)’坐标系,详细解析惯性导航中的姿态矩阵概念。包含Python代码验证,帮助新手快速理解坐标变换、欧拉角及旋转矩阵的构建与应用,特别强调有限转动不可交换性与无限转动次序无关的区别。

weixin_29062255的博客 333

C#版OpenCV:OpenCVSharp 最详细最全面教程(万字详细总结)

OpenCVSharp 是一个用于 .NET 环境的 OpenCV 包装库,它提供了一种简便的方法来利用 OpenCV 的功能进行图像和视频处理。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉和机器学习软件库,最初由 Intel 研发并发布。OpenCVSharp 让 C# 和其他 .NET 语言的开发者可以方便地访问 OpenCV 的强大功能。// 打印 OpenCV 版本信息Cv2。

仰望星空的博客 2万+

你背的Spring答案,全是5.x时代的:7.0.8源码一翻,80%的博客都过时了

这是 **Spring 7.0.8 源码系列的准备篇**,不急着逐行啃代码,只解决三件事:**为什么读、读什么、怎么读才不半途而废**。如果你正处在“注解一贴、项目一跑、日志一红、开始玄学”的状态,这篇就是给你写的。

xiaokjv的博客 293

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。版本如何关闭模块复用后铜皮自动从动态变成静态操作指导。如何关闭这个功能,具体操作如下。

weixin_54787054的博客 1262

上位机面试:值类型 vs 引用类型

大部分教程会告诉你"值类型在栈上,引用类型在堆上"。如果 ④ 和 ⑤ 都用 99,⑤ 打印出 99 时你分不清是"第 3 条和第 4 条是最容易混的,也是面试最爱追问的地方。很多人把"传引用类型的参数"当成"引用传递",这是错的。所以那句"引用类型比较就是比地址"不是通则——跑 100 万次对比,数量级差异很明显。记住这张图,下面所有现象都能推出来。这一行,才是真正的"按引用传递"。的核心原因——泛型不需要装箱。生效了"还是"根本没生效"。,比背"栈和堆"高一个层次。,这是测试设计的基本要求。

hanxiaodihhh的博客 253

14、5G物理层的灵活解决方案:广义频分复用(GFDM)

广义频分复用(GFDM)作为一种高度灵活的5G物理层多载波调制方案,能够满足多样化应用场景的需求,包括高吞吐量的比特管道通信、低功耗高连接数的物联网、超低延迟的触觉互联网以及广覆盖的无线区域网。通过参数化配置,GFDM可适配LTE资源网格,实现与现有系统的兼容与共存。其支持多种解调方式、干扰消除技术、OQAM映射及预编码机制,兼具低带外发射、高频谱效率和强鲁棒性。GFDM还能统一描述OFDM、FBMC、FTN等多种经典与先进波形,成为5G及未来通信系统中极具潜力的通用波形框架。

gold8的专栏 108

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

力扣35搜索插入位置(二分查找)

该题通过二分查找寻找插入位置。使用 mid = (left + right) >> 1 防止整数溢出,等价于 (left + right) / 2,但更安全。当 target <= nums[mid] 时,更新答案并继续向左查找;否则向右。最终返回最小的插入位置,时间复杂度 O(log n),空间复杂度 O(1)。

Pniubi的博客 195

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LeetCode 面试经典 150_位运算_只出现一次的数字 II(137_C++_中等)

LeetCode 面试经典 150_位运算_只出现一次的数字 II(137_C++_中等) 题目描述: 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

huayimenghan的博客 133

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

微服务体系下DevOps运维岗位面试方案设计

建立岗位题库与评分卡:把本文的考察点固化为结构化评分表,减少面试官主观漂移。面试官认证与校准:定期做「同候选人多人评分」校准,提升一致性。持续迭代题库:每季度根据真实招聘结果回看,淘汰区分度低的问题。候选人侧:把 STAR 案例当成工程资产来维护,每次项目结束就沉淀一份,面试时自然从容。微服务下的 DevOps 与运维岗位,考察的核心不是「你会不会用某个工具」,而是面对复杂系统时,能否用工程化手段持续降低不确定性。用 STAR 原则把这一点问出来、讲出来,面试双方都能少走弯路。

流水账 686

【全栈面试】Excel 导入流程

本文系统梳理全栈工程师面试中关于Excel导入功能的五大核心考察维度:架构分层(DTO/BO/DO职责分离)、前后端校验分工、性能优化(异步+流式读取+批量插入)、异常处理策略(精准反馈与错误报告)、技术选型原理(EasyExcel vs POI)。强调全栈思维应贯穿“契约先行、解耦设计、安全兜底、体验优化”全流程,通过实例展示如何从同步阻塞到异步高效重构,实现高可用、可维护、用户体验佳的完整链路设计。

qq_38980678的博客 293

【AI Agent面试系列】AI Agent可观测、评测、安全相关的知识点

之前的文章介绍了和,本文主要介绍AI Agent的测评、可观测等知识。

328

FreeRTOS深入解析(十)栈结构、水位线与运行时间统计

本文深入解析 FreeRTOS 中任务栈与 CPU 占用率两大核心机制。任务栈为每任务独立的向下生长内存,通过 pxStack 与 pxTopOfStack 定义边界,结合 0xA5 染色与水位线检测剩余空间,有效识别栈溢出;区分“栈溢出”(空间不足)与“写越界”(代码缺陷)两类问题。CPU 占用率则基于 DWT 计数器实现高精度时间统计,避免使用 SysTick 干扰,精准量化任务耗时。二者共同构成嵌入式系统排障基石。

qq_45290757的博客 182

秋招学习笔记 day109

在三次握手阶段,首先初始状态下,是 close 的服务端进入 listen 状态,然后客户端是发送一个序号以及 SYN 标志,然后进入 SYN_SENT 阶段,服务端收到之后发送一个 ACK,它 ACK 是客户端发的序号加一,然后发送 ACK 标志,以及自己的 SYN 标志。SYN 进入 SYN_RECEIVE 阶段之后,客户端收到服务端的确认之后,返回最后的确认和 SYN,这时候可以写数据,这时候客户端进入 ESTABLISHED 的状态,然后服务端收到确认后也是一样的。但是事实上,不知道就是不知道。

m0_57222081的博客 196

ThreadLocal 与线程池详解:内存泄漏原理、跨线程传递与核心参数(Java 并发面试必看)

本文系统解析ThreadLocal原理与线程池应用:详解ThreadLocal通过ThreadLocalMap实现线程隔离,剖析弱引用key导致的内存泄漏及规避方案(如及时调用remove());对比InheritableThreadLocal与阿里TTL在跨线程传递中的优劣;最后梳理线程池核心参数、任务执行流程与生命周期管理,助力开发者应对并发编程挑战。

IloveNie_的博客 491

Java基础:String、StringBuilder 和 StringBuffer 的区别

都能在原有缓冲区上追加或修改字符。前者不保证线程安全,通常同步开销更低;后者的方法使用同步控制,但多个方法组合成的复合操作仍可能需要外部同步。性能会受到 JDK、使用方式和运行环境影响。面试时可以这样回答:String 不可变;StringBuilder 和 StringBuffer 可变,前者适合单线程频繁拼接,后者对主要操作提供同步,通常有额外的同步开销。的内容创建后不可变。拼接或替换等操作返回结果,原有对象不变;实现可能复用已有对象,不能笼统认为每次调用都必然新建对象。

cjpabc的博客 337
上一篇: 最近AI圈爆火的Hermes到底是什么?
下一篇: 沉浸式AI编程:IDEA + Claude Code 的终极方案,非常丝滑!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值