Redis缓存预热、缓存穿透、缓存击穿、缓存雪崩,Redis布隆过滤器怎么实现?

Redis 缓存预热、预热数据选取策略、缓存保温、性能边界 基于上面的性能边界,我们需要根据自身的业务特性和需求来做一些选择和妥协。 阅读详情

在这里插入图片描述

大家好,我是哪吒。

一、缓存预热

Redis缓存预热是指在服务器启动或应用程序启动之前,将一些数据先存储到Redis中,以提高Redis的性能和数据一致性。这可以减少服务器在启动或应用程序启动时的数据传输量和延迟,从而提高应用程序的性能和可靠性。

1、缓存预热常见步骤

(1)数据准备

在应用程序启动或服务器启动之前,准备一些数据,这些数据可以是静态数据、缓存数据或其他需要预热的数据。

(2)数据存储

将数据存储到Redis中,可以使用Redis的列表(List)数据类型或集合(Set)数据类型。

(3)数据预热

在服务器启动或应用程序启动之前,将数据存储到Redis中。可以使用Redis的客户端工具或命令行工具来执行此操作。

(4)数据清洗

在服务器启动或应用程序启动之后,可能会对存储在Redis中的数据进行清洗和处理。例如,可以删除过期的数据、修改错误的数据等。

需要注意的是,Redis缓存预热可能会增加服务器的开销,因此应该在必要时进行。同时,为了减少预热的次数,可以考虑使用Redis的其他数据类型,如哈希表(Hash)或有序集合(Sorted Set)。此外,为了提高数据一致性和性能,可以使用Redis的持久化功能,将数据存储到Redis中,并在服务器重启后自动恢复数据。

2、代码实现

@Component
@Slf4j
public class BloomFilterInit
{
    @Resource
    private RedisTemplate redisTemplate;

    //初始化白名单数据
    @PostConstruct
    public void init() {
        //1 白名单客户加载到布隆过滤器
        String key = "customer:1";
        //2 计算hashValue,由于存在计算出来负数的可能,我们取绝对值
        int hashValue = Math.abs(key.hashCode());
        //3 通过hashValue和2的32次方后取余,获得对应的下标坑位
        long index = (long)(hashValue % Math.pow(2,32));
        log.info(key+" 对应的坑位index:{}",index);
        //4 设置redis里面的bitmap对应类型白名单:whitelistCustomer的坑位,将该值设置为1
        redisTemplate.opsForValue().setBit("whitelistCustomer",index,true);

    }
}

二、缓存雪崩

Redis缓存雪崩是指在缓存系统中,由于某些原因,缓存的数据突然大量地被删除或修改,导致缓存系统的性能下降,甚至无法正常工作。

1、什么情况会发生缓存雪崩?

(1)误删除

由于误操作或故障,缓存系统可能会误删除一些正常的数据。这种情况通常会在数据库中发生。

(2)误修改

由于误操作或故障,缓存系统可能会误修改一些正常的数据。这种情况通常会在数据库中发生。

(3)负载波动

缓存系统通常会承受一定的负载波动,例如,在高峰期间,数据量可能会大幅增加,从而导致缓存系统的性能下降。

(4)数据变化频繁

如果缓存系统中的数据变化频繁,例如,每秒钟都会有大量的数据插入或删除,那么缓存系统可能会因为响应过慢而导致雪崩。

2、Redis缓存集群实现高可用

(1)主从 + 哨兵

(2)Redis集群

(3)开启Redis持久化机制aof/rdb,尽快恢复缓存集群。

3、如何避免Redis缓存雪崩?

(1)数据备份

定期备份数据,以防止误删除或误修改。

(2)数据同步

定期同步数据,以防止数据不一致。

(3)负载均衡

使用负载均衡器将请求分配到多个Redis实例上,以减轻单个实例的负载。

(4)数据优化

优化数据库结构,减少数据变化频繁的情况。

(5)监控与告警

监控Redis实例的性能指标,及时发现缓存系统的异常,并发出告警。

三、缓存穿透

Redis缓存穿透是指在Redis缓存系统中,由于某些原因,缓存的数据无法被正常访问或处理,导致缓存失去了它的作用。

1、什么情况会发生缓存穿透?

(1)数据量过大

当缓存中存储的数据量过大时,缓存的数据量可能会超过Redis的数据存储限制,从而导致缓存失去了它的作用。

(2)数据更新频繁

当缓存中存储的数据更新频繁时,缓存的数据可能会出现异步的变化,导致缓存无法被正常访问。

(3)数据过期

当缓存中存储的数据过期时,缓存的数据可能会失去它的作用,因为Redis会在一定时间后自动将过期的数据删除。

(4)数据权限限制

当缓存中存储的数据受到权限限制时,只有拥有足够权限的用户才能访问和处理这些数据,从而导致缓存失去了它的作用。

(5)Redis性能瓶颈

当Redis服务器的性能达到极限时,Redis缓存可能会因为响应过慢而导致穿透。

2、如何避免Redis缓存穿透?

(1)设置合理的缓存大小

根据实际需求设置合理的缓存大小,以避免缓存穿透。

(2)优化数据结构

根据实际需求优化数据结构,以减少数据的大小和更新频率。

(3)设置合理的过期时间

设置合理的过期时间,以避免缓存失去它的作用。

(4)增加Redis的并发处理能力

通过增加Redis的并发处理能力,以提高缓存的处理能力和响应速度。

(5)优化Redis服务器的硬件和软件配置

通过优化Redis服务器的硬件和软件配置,以提高Redis的性能和处理能力。

在这里插入图片描述

四、通过空对象缓存解决缓存穿透

如果发生了缓存穿透,可以针对要查询的数据,在Redis中插入一条数据,添加一个约定好的默认值,比如defaultNull。

比如你想通过某个id查询某某订单,Redis中没有,MySQL中也没有,此时,就可以在Redis中插入一条,存为defaultNull,下次再查询就有了,因为是提前约定好的,前端也明白是啥意思,一切OK,岁月静好。

这种方式只能解决key相同的情况,如果key都不同,则完蛋。

五、Google布隆过滤器Guava解决缓存穿透

在这里插入图片描述

1、引入pom

<!--guava Google 开源的 Guava 中自带的布隆过滤器-->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>

2、创建布隆过滤器

BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);

(3)布隆过滤器中添加元素

bloomFilter.mightContain(1)

(4)判断布隆过滤器中是否存在

bloomFilter.mightContain(1)

3、fpp误判率

@Service
@Slf4j
public class GuavaBloomFilterService {
    public static final int SIZE = 1000000;

    //误判率
    public static double fpp = 0.01;

    //创建guava布隆过滤器
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), SIZE, fpp);
    
    public void guavaBloomFilter() {
        for (int i = 1; i <= SIZE; i++) {
            bloomFilter.put(i);
        }
        ArrayList<Integer> list = new ArrayList<>(10000);

        for (int i = SIZE + 1; i <= SIZE + (10000); i++) {
            if (bloomFilter.mightContain(i)) {
                log.info("被误判了:{}", i);
                list.add(i);
            }
        }
        log.info("误判总数量:{}", list.size());
    }
}

六、Redis缓存击穿

Redis缓存击穿是指在Redis缓存系统中,由于某些原因,缓存的数据无法被正常访问或处理,导致缓存失去了它的作用。

1、什么情况会发生缓存击穿?

根本原因:热点Key失效。

(1)数据量过大

当缓存中存储的数据量过大时,缓存的数据量可能会超过Redis的数据存储限制,从而导致缓存失去了它的作用。

(2)数据更新频繁

当缓存中存储的数据更新频繁时,缓存的数据可能会出现异步的变化,导致缓存无法被正常访问。

(3)数据过期

当缓存中存储的数据过期时,缓存的数据可能会失去它的作用,因为Redis会在一定时间后自动将过期的数据删除。

(4)数据权限限制

当缓存中存储的数据受到权限限制时,只有拥有足够权限的用户才能访问和处理这些数据,从而导致缓存失去了它的作用。

(5)Redis性能瓶颈

当Redis服务器的性能达到极限时,Redis缓存可能会因为响应过慢而导致击穿。

2、如何避免Redis缓存击穿?

(1)设置合理的缓存大小

根据实际需求设置合理的缓存大小,以避免缓存穿透。

(2)优化数据结构

根据实际需求优化数据结构,以减少数据的大小和更新频率。

(3)设置合理的过期时间

设置合理的过期时间,以避免缓存失去它的作用。

(4)增加Redis的并发处理能力

通过增加Redis的并发处理能力,以提高缓存的处理能力和响应速度。

(5)优化Redis服务器的硬件和软件配置

通过优化Redis服务器的硬件和软件配置,以提高Redis的性能和处理能力。

七、Redis缓存击穿解决方案

1、互斥更新

通过双检加锁机制。

2、差异失效时间

在这里插入图片描述
先更新从缓存B,再更新主缓存A,而且让从缓存B的缓存失效时间长于A,保证A失效时,B还在。

往期回顾

2023年再不会Redis,就要被淘汰了

图解Redis,谈谈Redis的持久化,RDB快照与AOF日志

Redis单线程还是多线程?IO多路复用原理

Redis集群的最大槽数为什么是16384个?

Redis缓存穿透、击穿、雪崩到底是个啥?7张图告诉你

Redis分布式锁的实现方式

Redis分布式缓存、秒杀

在这里插入图片描述

🏆本文收录于,数据库基础教程系列。

打造Java封神宇宙,数据库精品专栏重磅推出,目标打造优快云最强数据库专栏,包含MySQL基础、MySQL进阶、Redis、MongoDB等数据库基础知识。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

谈谈系统中的缓存预热-@PostConstruct 说起缓存,相信大家都不陌生,下面我们先看这张图 上图是一个最简单的应用系统业务流转模型,当一个客户端连接到server时,需要做数据访问,在server中会判断是否已经在缓存中,如果在则直接在缓存中拿出数据返回,由于缓存是在内存中的(比如redis,mongo,sping-cache等),不用大批量的跟数据库进行交互,避免了大量io操作,大大提高效率。 下面,我们来考虑一个问题,可以设想下如下场... 阅读详情

相关推荐

88.Redis:缓存穿透,缓存击穿,缓存雪崩(重要)

redis的缓存穿透,缓存击穿,缓存雪崩

鹏哥哥Aaa 122

什么是缓存预热

1.概念 缓存预热是指系统上线后,提前将相关的缓存数据加载到缓存系统中,避免刚上线使用户有太多请求打到数据库上去,然后再去将数据缓存的问题。 有了缓存预热后,系统刚上线用户也可以直接查询实现被预热的缓存数据 如果不进行预热,那么redis初始状态数据为空,系统上线初期,对于高并发的流量,都会访问数据库,会对数据库造成流量的压力 2. 缓存预热的解决方案 数据量不大的时候可以不进行缓存预热,或者工程启动后再进行加载缓存动作 数据量很大的时候,一定要保证热点数据提前加载到缓存。 ...

weixin_44390164的博客 4083

【超详细】基于YOLOv8的PCB缺陷检测

印刷电路板(PCB)瑕疵数据集:是一个公共的合成PCB数据集,由北京大学发布,其中包含1386张图像以及6种缺陷(缺失孔,鼠标咬伤,开路,短路,杂散,伪铜),用于检测,分类和配准任务。本文我们选取了其中适用与检测任务的693张图像,随机选择593张图像作为训练集,100张图像作为验证集。

weixin_45679938的博客 2万+

Redis 之 缓存预热 & 缓存雪崩 & 缓存击穿 & 缓存穿透

总结了redis上的 缓存预热,缓存雪崩,缓存击穿,缓存穿透的部分。

flyingcloud6的博客 2633

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

Redis之缓存预热、缓存雪崩、缓存击穿和缓存穿透以及布隆过滤器

文章目录一、缓存预热二、缓存雪崩三、缓存击穿四、缓存穿透五、布隆过滤器1. 原理实现2. Google工具包Guava实现布隆过滤器3. Redis布隆过滤器解决缓存穿透4. 安装rebloom 一、缓存预热 缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据! 二、缓存雪崩 指的是在短时间内,大量的键过期导致请求直接打到数据库,或者是Redis宕机,导致请求直接打到数据库,而数据库无法处理如此大量的请

weixin_48922154的博客 3384

【UE5 C++开发指南】从零配置Visual Studio 2022开发环境

本文详细指导如何从零开始为UE5 C++开发配置Visual Studio 2022环境。文章强调了VS2022与UE5的深度兼容性,并逐步讲解了社区版下载、核心工作负载(如“使用C++的游戏开发”)与组件安装、界面优化、专属工具设置以及首个C++项目的创建与验证流程,帮助开发者高效搭建专业开发环境。

weixin_29016865的博客 392

Redis-预热雪崩击穿穿透

有这两种原因恶意请求不存在的数据案例 fpp 默认 0.03fpp要求越高,bit位数越多,hash函数越多guava 黑名单使用对比穿透和击穿互斥更新->对于更新的方法聚划算案例功能分析数据结构使用 list代码 测试类 测试方法,先跑主启动类(后台更新聚划算商品信息),然后手动执行测试类测试查询问题分析delete 执行间隙,这一瞬间缓存击穿,打到mysql解决 小总结

qq_39007838的博客 1163

骁龙X Elite笔记本重装Windows 11 Arm64系统完整指南与避坑手册

UEFI安全启动和Arm64架构是理解现代计算设备系统部署的基础。UEFI取代传统BIOS,提供了更安全的启动环境和模块化固件接口,而Arm64架构则以其高能效特性,在移动和新兴PC领域日益重要。其技术价值在于为设备带来更快的启动速度、更强的安全防护以及更优的功耗表现。在应用场景上,这直接关系到搭载高通骁龙X Elite等Arm处理器的笔记本电脑的系统安装与维护。对于这类设备,重装系统远非插入通用安装盘那么简单,核心挑战在于必须使用专为Arm64编译的Windows镜像,并需提前集成芯片组、网络等硬件的专属

weixin_33428613的博客 474

深入浅出之CSPBlock模块(YOLO)

YOLO CSPX模块是YOLO系列算法中的一个重要组成部分,它通过跨阶段部分连接的方式减少了计算量,同时保证了模型的准确率。在YOLOv4及后续版本中,CSPX模块被广泛应用于主干网络和Neck结构中,为模型提供了强大的特征提取和融合能力。

浩瀚之水的专栏 6752

Redis缓存穿透、缓存雪崩、缓存击穿好好说说

前言 Redis是目前非常流行的缓存数据库啦,其中一个主要作用就是为了避免大量请求直接打到数据库,以此来缓解数据库服务器压力;用上缓存难道就高枕无忧了吗?no,no,no,没有这么完美的技术, 缓存穿透、缓存雪崩、缓存击穿这些问题都得好好聊聊。 正文 1. 缓存穿透 1.1 简要描述 缓存穿透是指查找的数据在缓存和数据库中都不存在,导致每一次请求数据从缓存中都获取不到,而将请求打到数据库服务器,但数据库中也没有对应的数据,最后每一次请求都到数据库;如果在高并发场景或有人恶意攻击,就会导致后台数据库

wdjnb的博客 168

生成模型实战 | 基于Transformer生成音乐

本文介绍了基于Transformer架构的音乐生成方法,将音乐视为一系列事件序列进行处理。与将音乐表示为多维图像的MuseGAN不同,该方法使用类似GPT的仅解码器模型,基于先前事件预测下一个音乐事件。模型使用MIDI格式的钢琴音乐数据,通过分词处理将音符转换为note-on、note-off、time-shift和velocity四种事件类型,共388个独特词元,映射为索引序列后输入网络。训练完成后,可通过调整温度参数控制生成音乐的新颖性,从而创作出风格类似训练数据且连贯逼真的音乐作品。

盼小辉丶的博客 5791

【Redis】缓存(下)

缓存预热、缓存穿透、缓存雪崩、缓存击穿以及代码案例

weixin_73060900的博客 1462

windows 10 等保3级配置核查与加固(附自动化加固脚本)

关闭注册表编辑器,然后重新启动计算机。\\r\\n 对于OPC通讯站(server\\\\client),【密码最长存留期】需要设置为0,即密码不过期。‌445端口‌:修改注册表禁用。打开命令提示符,运行命令“gpedit.msc”打开组策略编辑器,浏览到路径“本地计算机策略\\\\计算机配置\\\\Windows设置\\\\安全设置\\\\本地策略\\\\安全选项”,在右边窗格中找到“Microsoft网络客户端:将未加密的密码发送到第三方SMB服务器”,双击,配置为“已禁用”,确定。

悦分享 160

IDEA的使用指南

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

SpirngBoot整合Redis解决缓存穿透、缓存击穿、缓存雪崩问题

在上面的代码中,我们先在缓存中查询数据,如果不存在,则去数据库中查询,并将数据缓存到Redis中,并增加随机的过期时间。另外一种解决缓存击穿的方法是采用延迟缓存双写策略,即在缓存中查询数据时,如果数据不存在,不立即去数据库中查询,而是先在缓存中写入一个空对象,然后再去数据库中查询数据并更新缓存,从而避免了缓存击穿的问题。缓存击穿是指一个非常热点的数据在缓存中过期之后,正好在这个时间段内有大量的请求访问该数据,这些请求会直接穿透到数据库中,从而引起数据库的压力过大,严重影响系统的性能。

quanzhan_King的博客 959

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Redis 实际应用中的一些问题——缓存穿透,缓存击穿,缓存雪崩,分布式锁

缓存穿透,缓存击穿,缓存雪崩,分布式锁

beginner的博客 512

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

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

【黑马点评日记03】实战:Redis缓存穿透,缓存击穿,缓存雪崩全解析

本文探讨了Redis缓存应用中的常见问题及解决方案。针对缓存穿透,提出了缓存空对象和布隆过滤器两种方法;对于缓存雪崩,介绍了随机过期时间、多级缓存和预热策略;关于缓存击穿,详细阐述了互斥锁、逻辑过期和永不过期三种处理方案。重点分析了商户查询场景中的具体实现,包括双重检查锁机制的应用原理,以及如何在分布式环境下确保数据一致性和系统高可用性。这些方案可根据实际业务场景组合使用,有效提升系统性能和稳定性。

任岁月风干理想再也找不回真的我 1679

使用Redis实现缓存及相关问题

缓存雪崩其实有点像“升级版的缓存击穿”,缓存击穿是一个热点 key,缓存雪崩是一组热点 key。在请求达到后端之后,对需要进行缓存的接口,会先去 Redis 中找有无数据,没有的话会继续走正常的业务流程,然后将查询到的结果返回给客户端的同时也放在 Redis 中一份,下次相同请求进来后,就可以直接从 Redis中 拿到数据。某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。

小二丶的博客 1045

Redis中的缓存穿透,缓存击穿,缓存雪崩,分布式锁

Redis中的缓存穿透,缓存击穿,缓存雪崩,分布式锁

m0_57334678的博客 1369

redis基础(redis缓存穿透、缓存击穿、雪崩、分布式锁)

目录 背景 缓存穿透 解决方案 布隆过滤器 缓存空对象 但是这种方法会存在两个问题: 缓存击穿 解决方案 设置热点数据永不过期 加互斥锁 缓存雪崩 解决方案 redis高可用 限流降级 数据预热 背景 Redis缓存的使用,极大的提升了应用程序的性能和效率, 特别是数据查询方面。但同时, 它也带来了一些问题。 其中,最要害的问题,就是数据的一致性问题。从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那么就不能使用缓存。 另外的一些典型问题就是, 缓存穿透...

一直走,不要回头 798

Redis缓存三大问题:穿透、雪崩、击穿解决方案

缓存技术是提升系统性能的关键组件,其核心原理是通过内存存储高频访问数据,减少数据库压力。Redis作为主流缓存中间件,在实际工程应用中常面临三大典型问题:缓存穿透指查询不存在数据导致请求直达数据库,可通过布隆过滤器或缓存空值解决;缓存雪崩是大面积key同时失效引发的系统崩溃,采用过期时间随机化和多级缓存架构可有效预防;缓存击穿则是热点key失效时的高并发冲击,互斥锁和逻辑过期方案能保障系统稳定。这些解决方案在电商秒杀、社交平台等高并发场景中尤为重要,合理运用可显著提升系统可用性。

weixin_34080951的博客 335

Redis 缓存问题详解及解决方案

本文介绍了四种常见的缓存问题及解决方案:1)缓存击穿(热点Key突然过期),通过互斥锁或逻辑过期解决;2)缓存穿透(查询不存在数据),采用布隆过滤器或缓存空对象;3)缓存雪崩(大量Key同时过期),建议随机过期时间或多级缓存;4)缓存预热(系统冷启动),通过预加载热点数据实现。文章提供了Python实现代码,并对比了各问题的核心原因和关键技术,最后建议组合使用多种方案并配合监控系统。这些方法能有效提升系统性能,避免缓存相关故障。

liulanba的博客 494

5 Redis缓存穿透、击穿、雪崩、分布式锁、布隆过滤器

重点介绍几个REDIS常用的经典场景,Redis缓存穿透、击穿、雪崩、分布式锁、布隆过滤器等,从理论到实践,深入浅出。

small_to_large的博客 773

Redis 缓存穿透、缓存击穿、缓存雪崩全套解决方案

查询。

yang092257314的博客 386

Redis缓存三大异常场景:穿透、击穿与雪崩解决方案

缓存技术是提升系统性能的关键组件,Redis作为主流的内存数据库,通过将热点数据存储在内存中显著降低数据库压力。其核心原理是利用内存高速读写特性构建数据缓冲层,在分布式系统中实现请求分流。缓存穿透指查询不存在数据导致请求直达数据库,可通过布隆过滤器预判有效键或缓存空对象解决;缓存击穿发生在热点key过期瞬间,采用互斥锁或逻辑过期避免并发冲击;缓存雪崩则是大面积key同时失效,需通过差异化过期时间和多级缓存架构预防。这些技术在电商秒杀、社交热点等高频并发场景尤为重要,合理运用可提升系统300%以上的吞吐量。

weixin_30673611的博客 327
上一篇: 华为OD机试 - 二叉树的所有路径 - 栈(Java 2024 B卷 100分)
下一篇: YOLOv5/v7 添加注意力机制,30多种模块分析④,CA模块,ECA模块
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2933原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值