Redis 解决缓存穿透

Redis缓存穿透、缓存击穿解决方案及工具类 阅读详情

在 Spring Boot 项目中结合 Redis 解决缓存穿透问题(我这里面是通过Redis序列化的,键通过string,值是通过Jackson2JsonRedisSerializer来序列化的),可以通过以下方案实现:


1. 缓存穿透问题定义

  • 现象:大量请求查询数据库中 不存在的数据(如无效的 ID),导致请求绕过缓存直接访问数据库,引发数据库压力。也就是说防止一些无效的信息来恶意的一直访问数据库来增加数据库的压力
  • 原因:恶意攻击或无效请求导致缓存层无法拦截不存在的数据请求。

2. 解决方案及 Spring Boot 实现

方案 1:缓存空值(Null Object)
  • 原理:将数据库中不存在的数据也缓存到 Redis,但设置较短的过期时间,避免频繁查询数据库。
  • 实现步骤:
    1. 查询数据时优先查缓存。
    2. 若缓存未命中,则查数据库。
    3. 数据库不存在时,缓存空值。

Spring Boot 代码示例(使用Mybatis-plus):

@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    // 查询商铺信息
    @Override
    public Result queryById(Long id) {
        if (id == null){
            return Result.fail("店铺id不能为空");
        }

        // 1.从redis缓存中查询店铺信息
        String shopKey = CACHE_SHOP_KEY + id;
        Shop shop = (Shop) redisTemplate.opsForValue().get(shopKey);

        // 2.判断shop对象是否存在并且里面的属性值都不为空
        if (shop != null && !EntityUtils.isAllFieldsEmpty(shop)){
            // 3.如果存在,直接返回
            return Result.ok(shop);
        }

        // 4.如果shop对象不存在或者是属性值全部是空,则从数据库中查询
        Shop shop1 = this.getById(id);

		// 5.判断是否可以查询的到shop1在数据库里面
        if (shop1 == null){
            // 6.防止缓存穿透,缓存空对象并设置短过期时间
            redisTemplate.opsForValue().set(shopKey, new Shop(), 2, TimeUnit.MINUTES);
            return Result.fail("店铺不存在");
        }
		
        // 7.写入缓存并设置随机过期时间,防止雪崩
        redisTemplate.opsForValue().set(shopKey, shop1, 30, TimeUnit.MINUTES);

        return Result.ok(shop1);

    }
}

EntityUtils工具类用来判断实体类的属性值是否全部为空,是否为空的两个方法

package com.hmdp.utils;

import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

import java.util.List;
import java.util.Arrays;

// 封装工具类  用于判断对象的属性值是否为空
public class EntityUtils {

    // 判断对象所有属性值是否为空
    public static boolean isAllFieldsEmpty(Object obj) {
        if (obj == null) return true;

        return Arrays.stream(ReflectUtil.getFields(obj.getClass())) // 修复点:使用 Arrays.stream()
                .map(field -> ReflectUtil.getFieldValue(obj, field))
                .allMatch(EntityUtils::isFieldValueEmpty);
    }

    // 判断对象单个属性值是否为空
    private static boolean isFieldValueEmpty(Object value) {
        if (value == null) return true;

        if (value instanceof String && StrUtil.isBlank((String) value)) {
            return true;
        } else if (value instanceof List && ((List<?>) value).isEmpty()) {
            return true;
        } else if (value.getClass().isArray() && java.lang.reflect.Array.getLength(value) == 0) {
            return true;
        }

        return !ObjectUtil.isNotNull(value);
    }
}

说明:
容易犯错的地方是这个判断,在得到的shop实体类的时候不能确保里面的全部属性值都不为null,shop != null只能判断这个实体类是否存在,不能判断里面的属性值是否为null。所以需要编写一个工具类来判断这个属性问题
在这里插入图片描述


方案 2:布隆过滤器(Bloom Filter)
  • 原理:通过布隆过滤器预先存储所有合法键,拦截非法请求(判断键不存在时直接返回)。
  • 适用场景:数据范围固定且可预加载(如商品 ID 为自增数字)。

实现步骤:

  1. 初始化布隆过滤器:系统启动时加载所有合法键到布隆过滤器。
  2. 请求拦截:查询前先通过布隆过滤器校验键是否存在,不存在则直接拒绝。
Spring Boot 集成布隆过滤器
1. 方案选择
  • Guava 布隆过滤器:适合单机场景,简单易用。
  • RedisBloom 模块:适合分布式场景,数据共享。

这里以 Guava 为例(单机方案)。


2. 依赖引入

在 pom.xml 中添加 Guava 依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
</dependency>

3. 初始化布隆过滤器

在应用启动时,加载所有合法数据标识(如商品 ID)到布隆过滤器。

@Component
public class BloomFilterInitializer {

    private BloomFilter<Long> bloomFilter;

    @Autowired
    private ProductRepository productRepository;

    @PostConstruct  // 应用启动时初始化
    public void init() {
        // 1. 从数据库加载所有合法 ID 添加了一个数据库里面的ID式例
        List<Long> productIds = productRepository.findAllProductIds();

        // 2. 初始化布隆过滤器
        // 参数:预期数据量 100000,误判率 0.1%
        bloomFilter = BloomFilter.create(
            Funnels.longFunnel(), 
            100000, 
            0.001
        );

        // 3. 将 ID 添加到布隆过滤器
        productIds.forEach(bloomFilter::put);
    }

    public boolean mightContain(Long id) {
        return bloomFilter.mightContain(id);
    }
}

4. 业务层拦截非法请求

在查询数据前,先通过布隆过滤器校验请求的合法性。

@Service
public class ProductService {

    @Autowired
    private BloomFilterInitializer bloomFilter;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public Product getProductById(Long id) {
        // 1. 布隆过滤器校验
        if (!bloomFilter.mightContain(id)) {
            // 直接拦截非法请求
            return null;
        }

        // 2. 查询缓存
        String cacheKey = "product:" + id;
        Product product = (Product) redisTemplate.opsForValue().get(cacheKey);
        if (product != null && !EntityUtils.isAllFieldsEmpty(product)) {
            return product;
        }

        // 3. 缓存未命中,查询数据库
        product = productRepository.findById(id).orElse(null);

        // 4. 数据库不存在,缓存空值(短时间)
        if (product == null) {
            redisTemplate.opsForValue().set(cacheKey, "NULL", 5, TimeUnit.MINUTES);
            return null;
        }

        // 5. 数据库存在,更新缓存
        redisTemplate.opsForValue().set(cacheKey, product, 1, TimeUnit.HOURS);
        return product;
    }
}

关键优化点
1. 布隆过滤器参数选择
  • 预期数据量(n):根据业务实际数据量预估,避免频繁扩容。
  • 误判率(p):通常设置为 0.1%~1%,内存占用公式:m = -n * ln(p) / (ln2)^2。
  • 哈希函数数量(k):最优值 k = (m/n) * ln2。

2. 动态更新布隆过滤器
  • 问题:新增数据时,布隆过滤器需同步更新。
  • 解决方案:
    • 方案 1:定期全量重建(适合数据变化少的场景)。
    • 方案 2:监听数据库变更事件(如 Binlog),实时更新布隆过滤器。

3. 结合空值缓存
  • 原因:布隆过滤器存在误判,需结合空值缓存拦截非法请求。
  • 实现:当布隆过滤器判断可能存在但数据库查无数据时,缓存空值。

RedisBloom 分布式方案

若系统为分布式架构,可使用 Redis 的 RedisBloom 模块(需安装)。

1. RedisBloom 命令
# 添加元素
BF.ADD bloom_filter 12345

# 检查元素是否存在
BF.EXISTS bloom_filter 12345
2. Spring Boot 集成示例
@Service
public class RedisBloomService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 初始化布隆过滤器
    public void initBloomFilter() {
        // 创建布隆过滤器(容量 100000,误判率 0.1%)
        redisTemplate.execute((RedisCallback<Object>) connection -> {
            connection.execute("BF.RESERVE", "product_bloom", "0.001", "100000");
            return null;
        });
    }

    // 添加元素到布隆过滤器
    public void addToBloomFilter(Long id) {
        redisTemplate.execute((RedisCallback<Object>) connection -> {
            connection.execute("BF.ADD", "product_bloom", id.toString().getBytes());
            return null;
        });
    }

    // 检查元素是否存在
    public boolean existsInBloomFilter(Long id) {
        return (Boolean) redisTemplate.execute((RedisCallback<Object>) connection -> {
            return connection.execute("BF.EXISTS", "product_bloom", id.toString().getBytes());
        });
    }
}

方案对比
方案优点缺点适用场景
Guava 布隆过滤器简单、内存高效单机部署,重启后数据丢失单机应用,数据量可控
RedisBloom分布式支持,数据持久化需安装额外模块,略复杂分布式系统,高可用需求
空值缓存实现简单,无额外依赖内存浪费(大量空值缓存)小规模数据,临时解决方案

方案 3:请求限流与熔断
  • 原理:对高频无效请求进行限流,保护数据库。
  • 实现工具:使用 Resilience4j 或 Sentinel 实现限流熔断。

Resilience4j 限流示例:

@Configuration
public class RateLimitConfig {

    @Bean
    public RateLimiterRegistry rateLimiterRegistry() {
        return RateLimiterRegistry.of(
            RateLimiterConfig.custom()
                .limitForPeriod(100)   // 每秒钟允许 100 次请求
                .limitRefreshPeriod(Duration.ofSeconds(1))
                .timeoutDuration(Duration.ofMillis(500))
                .build()
        );
    }
}

@Service
public class ProductService {

    @Autowired
    private RateLimiterRegistry rateLimiterRegistry;

    public Product getProductById(Long id) {
        RateLimiter rateLimiter = rateLimiterRegistry.rateLimiter("productQuery");
        if (rateLimiter.acquirePermission()) {
            // 正常处理逻辑
        } else {
            throw new RuntimeException("请求过于频繁");
        }
    }
}

3. 组合策略(推荐)

  • 步骤 1:使用 布隆过滤器 拦截明显无效的请求。
  • 步骤 2:对可能误判的请求,结合 空值缓存 减少数据库压力。
  • 步骤 3:对高频请求进行 限流熔断,双重保护数据库。

4. 其他注意事项

  1. 缓存雪崩预防:为缓存设置随机过期时间,避免同一时间大量缓存失效。
  2. 热点数据预加载:针对高频访问数据,提前加载到缓存。
  3. 监控与告警:监控缓存命中率和数据库 QPS,及时发现异常。

通过上述方案,可以在 Spring Boot 项目中有效解决缓存穿透问题,保障系统的高可用性和性能。

redis缓存雪崩,缓存穿透,缓存击穿的php解决方法 一、缓存雪崩 缓存雪崩表示在某一时间段,缓存集中失效,导致请求全部走数据库,有可能搞垮数据库,使整个服务瘫痪。 使缓存集中失效的原因: 1、redis服务器挂掉了。 2、对缓存数据设置了相同的过期时间,导致某时间段内缓存集中失效。 如何解决缓存集中失效: 1、针对原因1,可以实现redis的高可用,Redis Cluster 或者 Redis Sentinel(哨兵) 等方案。 2、针对原因2,设置缓存过期时间时加上一个随机值,避免缓存在同一时间过期。 <?php $redis 阅读详情

相关推荐

W25N01GV SPI NAND Flash驱动开发避坑指南:详解2KB缓冲区机制与状态寄存器正确用法

本文深入解析W25N01GV SPI NAND Flash芯片的2KB缓冲区机制与状态寄存器正确用法,提供STM32 HAL和ESP-IDF项目的实战解决方案。涵盖双阶段操作原理、状态寄存器深度解析、时序控制优化及跨平台驱动设计要点,帮助开发者避免常见错误并提升存储性能。

aizhouqian5537的博客 640

Redis工具类(解决缓存穿透、缓存击穿)

该工具类包含以下功能:1.将任意对象存储在 hash 类型的 key 中,并可以设置 TTL2.将任意对象存储在 hash 类型的 key 中,并且可以设置逻辑过期时间3.将空对象存入 hash 类型的 key 中,并且可以设置超时时间4.缓存空对象解决缓存穿透5.布隆过滤器解决缓存穿透6.布隆过滤器+缓存空对象解决缓存穿透7.互斥锁解决缓存击穿8.逻辑过期解决缓存击穿以下是关键代码。

后端 553

从零到千兆:KSZ9031 PHY芯片在Zynq PS端的驱动移植心路历程

本文详细记录了在Xilinx Zynq-7000平台(基于XC7Z020芯片)上,为KSZ9031千兆以太网PHY芯片移植LwIP协议栈驱动的完整过程。从硬件连接配置、Vivado工程设置到LwIP库的深度修改与调试,分享了解决PHY识别、自协商及性能优化等关键问题的实战经验,助力开发者实现稳定的千兆网络连接。

honey的博客 1104

redis解决缓存击穿和缓存穿透的工具类及使用

redis解决缓存击穿和缓存穿透的工具类及使用。

weixin_43689176的博客 337

k8s 100个高频面试题

以下是 100 个 Kubernetes(k8s)高频面试题及其答案,涵盖了 Kubernetes 的核心概念、架构、组件、工作原理以及实际应用。答案:Master 节点组件:API Server:提供 RESTful API 接口,用于与集群交互。etcd:分布式键值存储,用于存储集群的配置数据和状态信息。Controller Manager:运行各种控制器进程,负责维护集群的状态。Scheduler:负责将 Pod 调度到合适的节点上运行。Worker 节点组件:Kubelet:运行在每个节点上的代理,

wankll的专栏 2778

四十二、Fluent欧拉模型流化床模拟:从基础设置到颗粒动力学解析

本文详细解析了Fluent欧拉模型在流化床模拟中的应用,从基础概念到颗粒动力学设置全面覆盖。重点介绍了欧拉模型的颗粒温度概念、多相流配置技巧以及关键参数优化策略,帮助工程师准确模拟气固两相流动现象。通过实用案例演示了网格检查、求解器配置和边界条件设置的最佳实践。

weixin_27303545的博客 445

Redis封装工具类,解决缓存穿透、缓存击穿

Redis封装工具类,解决缓存穿透、缓存击穿

dragonhu的博客 490

MIT-BEVFusion系列六--bevfusion网络部分流程理解

简述bevfusion网络部分

duanmushuangquan的博客 4892

Redis 缓存穿透、击穿、雪崩 的区别与解决方案

在高并发环境下,Redis 缓存的三大问题(击穿、穿透与雪崩)可能导致数据库崩溃,本文分析了这些问题的具体表现及解决方法,介绍了多种优化技术,如缓存预热、分布式锁和错开过期时间等。

分享即是最好的学习 4513

克里金插值(Kriging)在MATLAB中的实现(克里金工具箱)

一,直接献上克里金插值MATLAB工具箱 链接:https://pan.baidu.com/s/1p0lt2G8KQ-els7Dyw5jPFg 提取码:wcss 下载后将该程序添加到MATLAB安装文件夹中的/toolbox下,然后在设置路径中添加该程序文件为默认路径即可调用程序。 资源中内附程序使用说明PDF。 二、本人实际操作代码如下所示,标注如下 load data1 %载入数据 %模型参...

qq_40937675的博客 6万+

【Unity】Gif图片播放插件(支持UI及模型纹理渲染两种模式)

unity本身不支持GIF格式文件直接渲染, 因此一般的做法是通过加载图片,通过代码控制其循环播放、停止等,模拟动画效果,本文简单介绍一下某个现有开源工具,感谢开源作者。

灵境引路人 4036

Redis的缓存穿透、缓存雪崩、缓存击穿问题及有效解决方案

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。也就是有请求一请求到后端就一定会打到数据库(redis和MySQL都没有该数据),打一次不要紧,但要是有无数个请求同时打过来,那数据库大概率会崩溃,所以预防缓存穿透问题还是十分重要的。缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

csdn3043663729的博客 3417

SIWAVE+ADS提取PCB走线寄生参数

本文将介绍一种很适合PCB走线提取寄生电感等参数的方法,即是通过SIWAVE将PCB走线的S参数提取出来,再通过ADS将S参数转换成电感、电容值。

sinat_15150363的博客 1765

Redis | Redis缓存穿透、缓存击穿、缓存雪崩问题及解决方案

目录 缓存问题 1. 缓存穿透---查不到 解决方案 2. 缓存击穿---量太大,缓存过期 解决方案 3. 缓存雪崩 解决方案 缓存问题 1. 缓存穿透---查不到 缓存穿透是指用户想查询一个数据,发现Redis中没有,也就是缓存没有命中,就向持久性数据库发起查询,发现数据库也没有这个数据,于是查询失败了。当用户请求很多的情况下,缓存没有命中,数据库也没有数据,会给数据库造成很大的压力,这就是缓存穿透。 解决方案 第一种解决方案:使用布隆过滤器 使用布隆过滤器之后,将存储

quwenjing_blog 6321

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

redis解决缓存穿透/击穿/雪崩

缓存雪崩指的是同一时段大量的缓存key同时失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力也称为热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会瞬间给数据库带来极大冲击。

aloha 2317

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

关于redis缓存击穿、缓存穿透、缓存雪崩及其解决方案

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中的,请求每次都会穿透缓存直接查询数据库,这样就可能导致数据库压力过大。例如,攻击者恶意构造大量不存在的查询请求,就会对数据库造成严重的负载冲击。缓存雪崩是指在某一时刻,大量的缓存 key 同时过期,或者缓存服务器出现故障,导致大量的请求直接访问数据库,从而使数据库压力骤增,甚至可能导致数据库崩溃。

qq_65709394的博客 2750

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

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

Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案

一、前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。 为

Mark66890620 2万+

redis如何解决缓存雪崩、缓存击穿、缓存穿透

​ 缓存击穿是指缓存中的。

2301_81024755的博客 1711

Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案

前言在日常的项目中,缓存的使用场景是比较多的。缓存是分布式系统中的重要组件,主要解决在高并发、大数据场景下,热点数据访问的性能问题,提高性能的数据快速访问。本文以Redis作为缓存时,针对常见的缓存击穿、缓存穿透、缓存雪崩问题做简单地说明,并且提供有效的解决方案。Redis缓存使用场景Redis会把数据库中经常被查询的数据缓存起来,比如热点数据,这样当用户通过网站或APP来访问的时候,就不需要到数据库中去查询了,而是直接获取 Redis中的缓存数据,从而降低了后端数据库的读取压力。

提供各种学习资源及帮助 3734

Redis 缓存穿透、击穿、雪崩现象及解决方案

前言 如何有效的理解并且区分 Reids 穿透、击穿和雪崩 缓存穿透 关键词:穿过 Redis 和数据库 当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了。下面这段逻辑大家用的会比较多:先去 Redis 中查找某资源,Redis 中查不到就去 DB 中查,DB 中查到后回写一份数据到 Redis 中。 这段逻辑正常情况下问题并不大,但是如果用户恶意重复请求资源 X,该资源在 Redis 和 DB 中都不存在。那么每次请求都会直接打到 DB 上,甚至导致物理 DB 宕机。 解决方

Java流浪记 1万+

Redis缓存穿透和缓存雪崩以及解决方法

Redis缓存穿透以及解决方法 一、缓存穿透 1.当用户查询的key在redis中不存在,对应的id在数据库也不存在,此时被非法用户进行攻击,大量的请求会直接打在db上,造成宕机,从而影响整个系统,这种现象称之为缓存穿透。 2.解决方案一:把空的数据也缓存起来,比如空字符串,空对象,空数组或list,代码如下 if (list != null && list.size() > 0) { redisOperator.set("subCat:" + root

weixin_45445879的博客 2万+

一文彻底搞懂Redis中缓存穿透,缓存击穿和缓存雪崩的区别以及解决方案

缓存击穿指的是数据库有数据,缓存本应该也有数据,但是缓存过期了,Redis 这层流量防护屏障被击穿了,请求直奔数据库。缓存穿透指的是数据库本就没有这个数据,请求直奔数据库,缓存系统形同虚设。缓存雪崩指的是大量的热点数据无法在 Redis 缓存中处理(大面积热点数据缓存失效、Redis 宕机),流量全部打到数据库,导致数据库极大压力。

永远在路上 2702

【Redis】缓存击穿、缓存穿透、缓存雪崩原理以及多种解决方案

缓存击穿、缓存穿透、缓存雪崩原理以及解决方案

秋玄的博客 4942

一招解决Redis缓存穿透,缓存雪崩,缓存击穿问题【超详细版】

缓存穿透(Cache Penetration)的概念是指在查询一个不存在的数据时,由于缓存中不存在这个数据,导致查询请求直接到达了数据库层,而数据库层也没有这个数据,因此无法将结果写入缓存。这样一来,每次针对这个不存在的数据的查询都会直接请求到数据库层,造成数据库的压力增大,甚至可能引发数据库宕机。

种一棵树,最好的时间是十年前,其次是现在。 1136

Redis--缓存穿透与缓存雪崩详解及解决方案

利用Redis集群提高服务的可用性(针对redis服务宕机):为了尽可能的避免Redis的宕机,就要提高整个Redis的高可用性,想要提高Redis的高可用性,就必须借助于redis的集群,(redis的哨兵机制,可以实现对服务的监控),先搭建Redis集群形成主从,如果其中有一个机器宕机比如主机器宕机,哨兵会自动地从从机中选出一个替代原来的主,这样就可以保证redis一直能够正常对外提供服务,主从还可以实现数据同步,也不会导致数据的丢失,这样就可以在很大程度上保证Redis的高可用性。

m0_73856804的博客 1216

Redis实战:缓存穿透及其解决思路 实战演示

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,导致每次请求都要访问数据库,增加数据库的负载。为了解决缓存穿透问题

终于等到你啦~欢迎来到我的知识空间 这里是苏泽的成神之路 3万+
上一篇: RedisTemplate的序列化配置方式详解
下一篇: 解决缓存击穿问题
小李不秃头♛
博客等级 码龄2年 619粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值