【黑马点评优化】之使用Caffeine+Redis实现应用级二层缓存

news2024/11/26 15:28:11

【黑马点评优化】之使用Caffeine+Redis实现应用级二层缓存

    • 1 缓存雪崩定义及解决方案
    • 2 为什么要使用多级缓存
    • 3 Redis+Caffeine实现应用层二级缓存原理
    • 4 利用Caffeine+Redis解决Redis突然宕机导致的缓存雪崩问题
      • 4.1 pom.xml文件引入相关依赖
      • 4.2 本地缓存配置类
      • 4.3 修改ShopServiceImpl中的queryById方法
    • 5 测试

在这里修改一下黑马点评2商户查询的方法。使用Redis+Caffeine实现应用层二级缓存来解决缓存雪崩 的问题。
添加Caffeine的过程参考博客如下:
SpringBoot 集成 Caffeine、Redis实现双重缓存方式(-)caffeine redis-CSDN博客

1 缓存雪崩定义及解决方案

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
解决方案:
● 给不同的Key的TTL添加随机值 (同一时段,所以给不同key设置不同的TTL)
● 利用Redis集群提高服务的可用性
● 给缓存业务添加降级限流策略 (微服务)
● 给业务添加多级缓存

2 为什么要使用多级缓存

如果只使用redis来做缓存我们会有大量的请求到redis,但是每次请求的数据都是一样的,假如这一部分数据就放在应用服务器本地,那么就省去了请求redis的网络开销,请求速度就会快很多;
如果只使用Caffeine来做本地缓存,我们的应用服务器的内存是有限,并且单独为了缓存去扩展应用服务器是非常不划算。所以,只使用本地缓存也是有很大局限性的;
因此在项目中,我们可以将热点数据放本地缓存,作为一级缓存,将非热点数据放redis缓存,作为二级缓存,减少Redis的查询压力。

使用流程大致如下:

  • 首先从一级缓存(caffeine-本地应用内)中查找数据;
  • 如果没有的话,则从二级缓存(redis-内存)中查找数据;
  • 如果还是没有的话,再从数据库(数据库-磁盘)中查找数据;

3 Redis+Caffeine实现应用层二级缓存原理

Redis 作为分布式缓存:

  • Redis 具有高性能、丰富的数据结构和可扩展性,适合作为分布式缓存存储大量的数据。它可以在多服务器环境下共享缓存数据,提高系统的整体性能。
  • 可以根据数据的特点选择合适的数据结构来存储数据,如使用哈希表存储对象、使用有序集合进行排行榜等操作。
  • 配置 Redis 的持久化机制,以防止数据丢失。同时,考虑使用 Redis 的集群或主从复制来提高可用性和可扩展性。

Caffeine 作为本地缓存:

  • Caffeine 是一个高效的本地缓存库,可以在应用程序内部实现缓存,减少对外部缓存服务的依赖,提高缓存的访问速度。
  • Caffeine 支持自动过期功能,可以根据设定的时间自动清除过期的缓存数据,减少内存占用。
  • 可以根据数据的访问频率和大小来调整 Caffeine 的缓存配置,如缓存的大小、过期时间等。
    实现二级缓存架构

数据存储流程:

  • 当应用程序需要访问数据时,首先从 Caffeine 本地缓存中查找数据。如果数据在 Caffeine 中存在,则直接返回数据,无需进一步访问 Redis 或数据库
  • 如果数据不在 Caffeine 中,则从 Redis 分布式缓存中查找数据。如果数据在 Redis 中存在,则将数据加载到 Caffeine 中,并返回数据给应用程序。
  • 如果数据不在 Redis 中,则从数据库中读取数据,并将数据同时存储到 Redis 和 Caffeine 中,然后返回数据给应用程序。

数据更新流程:

  • 当数据在数据库中被更新时,需要同时更新 Redis 和 Caffeine 中的缓存数据,以保证数据的一致性
  • 可以采用先更新数据库,然后删除 Redis 中的对应数据,让后续的访问从数据库中重新读取数据并更新到 Redis 和 Caffeine 中的方式来实现数据的更新。这种方式被称为 Cache Aside 模式。

缓存过期策略:

  • 对于 Caffeine 本地缓存,可以设置自动过期时间,根据数据的变化频率和访问频率来调整过期时间,以避免内存占用过高。
  • 对于 Redis 分布式缓存,可以根据业务需求设置合理的过期时间,或者采用主动更新的方式来保证缓存数据的有效性。

4 利用Caffeine+Redis解决Redis突然宕机导致的缓存雪崩问题

需求:修改根据id查询商铺的业务,基于二级缓存方式来解决缓存雪崩问题。
思路分析:当用户开始查询时,先查询本地缓存Caffeine,判断是否命中,如果没有命中则查询Redis,命中则直接返回。

在这里插入图片描述

4.1 pom.xml文件引入相关依赖

        <!--引入本地缓存Caffine-->
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.9.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

4.2 本地缓存配置类

Config目录下新建本地缓存配置类,LocalCacheConfiguration

package com.hmdp.config;


import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * 本地缓存Caffeine配置类
 */
@Configuration
public class LocalCacheConfiguration {

    @Bean("localCacheManager")
    public Cache<String, Object> localCacheManager() {
        return Caffeine.newBuilder()
                //写入或者更新5s后,缓存过期并失效, 实际项目中肯定不会那么短时间就过期,根据具体情况设置即可
                .expireAfterWrite(120, TimeUnit.SECONDS)
                // 初始的缓存空间大小
                .initialCapacity(50)
                // 缓存的最大条数,通过 Window TinyLfu算法控制整个缓存大小
                .maximumSize(500)
                //打开数据收集功能
                .recordStats()
                .build();
    }

}

4.3 修改ShopServiceImpl中的queryById方法

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

    @Resource
    private Cache<String,Object> caffeineCache;

//    @Cacheable(value = "shop",key = "#id")/
    public Result queryById(Long id){
        //1.从Caffeine中查询数据
        Object o = caffeineCache.getIfPresent(CACHE_SHOP_KEY + id);
        if(Objects.nonNull(o)){
            log.info("从Caffeine中查询到数据...");
            return Result.ok( o);
        }

        //缓存穿透
        Shop shop = cacheClient.queryWithPassThrough(CACHE_SHOP_KEY,id,Shop.class,this::getById,CACHE_SHOP_TTL,TimeUnit.MINUTES);
        if(shop != null){
            log.info("从Redis中查到数据");
            caffeineCache.put(CACHE_SHOP_KEY+id,shop);
        }


        if(shop == null){
            return Result.fail("店铺不存在!");
        }

        //7.返回数据
        return Result.ok(shop);
    }
}
  • caffeineCache.put(user.getId(), user):保存本地缓存;
  • caffeineCache.invalidate(id):移除指定的本地缓存;
  • caffeineCache.getIfPresent(id): 从本地缓存中获取值,如果缓存中不存指定的值,则方法将返回 null;
  • caffeineCache.get(id, Function<>): 从本地缓存中获取值,该方法还支持将一个参数为 key 的 Function 作为参数传入。如果缓存中不存在该 key,则该函数将用于提供默认值,该值在计算后插入缓存中,如果缓存的元素无法生成或者在生成的过程中抛出异常而导致生成元素失败,则返回null。

5 测试

运行启动类,使用前后端联调来测试查询商铺信息功能。运行结果如下,首次查询Caffeine中没有数据,所以输出从Redis中查询,第二次查询相同店铺时,从Caffeine中查询。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Blazor Web APP学习记录

目录 1 呈现模式1.1 静态SSR1.2 服务器端交互SSR1.3 客户端交互CSR1.4 自动交互式1.5 注意 2 Blazor Web APP项目3 会话状态 1 呈现模式 参见&#xff1a;https://learn.microsoft.com/zh-cn/aspnet/core/blazor/components/render-modes?viewaspnetcore-8.0 Blazor Web App …

torch-npu的配置

1、简单的调用npu import torch import torch_npu x torch.randn(10000, 10000).npu() y torch.randn(10000, 10000).npu() for _ in range(10000):z x.mm(y) 这个代码的出现就会导致&#xff0c;核心使用99%&#xff0c;显存| 1633 2、安装torch-npu 安装方法看官网介绍…

npm使用时报错:Could not retrieve https://npm.taobao.org/mirrors/node/index.json.

在使用npm时报错&#xff0c;报错信息如下&#xff1a; 报错的原因&#xff1a;是原来的淘宝镜像地址过期了 解决办法&#xff1a;修改镜像地址。打开nvm的安装地址 -->settings.txt文件 -->配置下载源 1、将settings.txt文件中的 node_mirror: https://npm.taobao.or…

机器学习可解释性

机器学习的稳健性、可解释性和结果正确性等是人工智能安全可信应用必须解决的关键问题。 传统机器学习&#xff1a; 内置可解释性&#xff1a;决策树IF-Then规则&#xff0c;直观可理解事后可解释性&#xff1a;训练结束后的可解释技术特定于模型体系结构的解释与解释方法及模…

删除 Word 空白页的 3 种方法总结

在使用 Word 进行文档编辑的时候&#xff0c;空白页的出现常常会让用户感到困扰&#xff0c;Word 空白页的出现可能是由于分页、段落设置以及格式问题&#xff0c;空白页可能会出现在文档的开始、中间及结尾&#xff0c;如果需要打印文档还会影响打印效果&#xff0c;那么 Word…

【论文#性能对比】Video coding with H.264/AVC: Tools, Performance, and Complexity

目录 摘要1.前言2.标准化视频编码方案的概念3. H.264/AVC 编码方案3.1 帧内预测3.2 运动补偿预测3.3 变换编码3.4 熵编码方案3.5 自适应去块滤波器3.6 错误鲁棒性和网络友好性 4.码率受限的编码器控制5. H.264/AVC 的配置文件和级别6.与先前标准的比较6.1 编码效率6.2 硬件复杂…

如何启动一个OpenSearch

创建两个集群&#xff0c;标注 不含备用节点 选择集群版本和配置集群版本 冷热存储和专用主节点这个按需开启 然后是网络&#xff0c;是否使用自定义域名&#xff0c;集群开在VPC还是公网上。 选择是否开启认证&#xff1a; 访问策略&#xff0c;其实就是资源策略 维护时段…

vue页面使用v-print指令打印表格表单的几种方法,包括页眉标题自定义设置

页面效果: 打印预览页面: 步骤: 1.安装vue-print-nb 2.在main.js里面注册 import Print from vue-print-nbVue.use(Print) 3.在页面.vue代码中定义打印范围和打印按钮&#xff0c;我这里是以id"main-div"这个div为范围进行打印 <div> <div id"main-d…

grs认证有什么好处?grs认证相关政策

GRS认证&#xff08;Global Recycled Standard&#xff09;即全球回收标准认证&#xff0c;是一项国际、自愿和全面的产品标准&#xff0c;主要针对回收材料的使用和供应链进行认证。GRS认证能够为企业带来多方面的好处&#xff0c;以下是对这些好处的详细归纳&#xff1a; 一…

【livox雷达】HAP雷达 红外 orin 交换机 ——办公室 硬件搭配

orin&#xff1a;拉一根网线&#xff0c;一端连orin&#xff0c;一端连交换机 雷达&#xff1a;接上电源&#xff0c;另一端连接交换机 红外&#xff1a;用gsml方式连到orin上 交换机&#xff1a;以交换机为中心&#xff0c;连一根网线到orin&#xff0c;一根接外网的网线连给…

CesiumLab介绍

软考鸭小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 CesiumLab是一个围绕Cesium平台设计的完整易用的数据预处理工具集&#xff0c;它旨在最大化提升三维数据可视化效率。本文将详细介绍CesiumLab的安装、主要功能…

2-119 基于matlab的合成孔径雷达(SAR)RDA(距离多普勒算法)、RMA(距离徙动算法)、CSA(线性调频变标算法)算法点目标成像与分析

基于matlab的合成孔径雷达(SAR)RDA(距离多普勒算法)、RMA(距离徙动算法)、CSA(线性调频变标算法)算法点目标成像与分析&#xff0c;RDA算法通过参考目标的多普勒历程完成对应匹配滤波器设计&#xff0c;获得同距离处不同目标相对于参考目标的方位位置。RMA是一种高分辨率的频域…

阿里测试之道-测试团队的发展之路

一、测试团队的发展之路 1.1、测试团队面临的困局 测试团队面临着不少的苦难&#xff0c;其中具有普遍性的有&#xff1a; 测试自动化难&#xff1a; 自动化测试程序编写成本高、执行时间长、维护成本高。测试的”技术债“在业务高速发展的过程中越积越多&#xff1a;一边修复…

ubuntu-24.04.1 系统安装

使用VMware虚拟机上进行实现 官网下载地址&#xff1a; https://cn.ubuntu.com/download https://releases.ubuntu.com 操作系统手册&#xff1a; https://ubuntu.com/server/docs/ &#xff08;里面包含安装文档&#xff09; 安装指南&#xff08;详细&#xff09;&#xff1a…

B3622 枚举子集

1. 注意dfs内&#xff0c;for循环的遍历&#xff0c;想清楚把什么赋值给a[x] 2.本题只需要把0或1赋值给a[x]所以 #include<bits/stdc.h> using namespace std; int n; int a[20]; int vis[20]; void pr() {for (int i 1; i < n; i) {if (a[i] 0)cout << N;els…

珀丽达医用敷料:滋养冰爽夏日三伏

虽然已经立秋&#xff0c;但是热浪高温一直都还在滚滚而来。“三伏天”、“秋老虎”&#xff0c;真的叫做“伏天伏地&#xff0c;热似火&#xff0c;不付不行”。盯着烈日灼晒&#xff0c;经历了一天工作与奔波的你&#xff0c;是否渴望一抹清凉&#xff1f;特别是爱美的女生&a…

[Linux]从零开始的网站内网穿透教程

一、前言 在上一次教程中&#xff0c;我们教了大家如何搭建一个网站并且在内网中能被访问到。这样也出现了一个问题&#xff0c;我们的网站被我们部署得再好看&#xff0c;始终只有内网中的设备可以访问。如果别人和我们不在一个局域网中&#xff0c;就无法访问我们搭建的网站了…

Allegro在PCB上开槽的三种方法操作指导

Allegro如何在PCB上开槽的三种方法操作指导 当PCB有特殊设计要求的时候&#xff0c;需要在PCB上开槽&#xff0c;Allegro支持在PCB上开槽操作&#xff0c;具体操作如下 以下图为例&#xff0c;需要在这个板框中间开槽 开方形槽 选择shape add rect命令 画在Board Geometry-o…

最新PHP礼品卡回收商城 点卡回收系统源码_附教程

最新PHP礼品卡回收商城 点卡回收系统源码_附教程 各大电商平台优惠券秒杀拼团限时折扣回收商城带余额宝 1、余额宝理财 2、回收、提现、充值、新订单语音消息提醒功能 3、带在线客服 4、优惠券回收功能 源码下载&#xff1a;https://download.csdn.net/download/m0_66047…

科技特长生是什么?如何成为一名科技特长生?

近年来&#xff0c;随着国家对创新科技的重视&#xff0c;越来越多的学生通过“科技特长生”的途径获得优质升学机会。科技特长生作为一种特殊招生方式&#xff0c;为那些在科技创新、竞赛中表现出色的学生提供了进入名校的捷径。那么&#xff0c;究竟什么是科技特长生&#xf…