【Redis】多级缓存

news2024/10/5 9:24:12

【Redis】多级缓存

文章目录

  • 【Redis】多级缓存
    • 1. 传统缓存的问题
    • 2. 多级缓存方案
      • 2.1 JVM进程缓存
        • 2.1.1 本地进程缓存
        • 2.1.2 Caffeine
      • 2.2 Nginx缓存
        • 2.2.1 准备工作
        • 2.2.2

1. 传统缓存的问题

传统的缓存策略一般是请求到达 tomcat 后,先查询redis,如果未命中则查询数据库。这种方式存在以下两个问题:

  1. 请求要经过 tomcat 处理,tomcat 的性能成为整个系统的瓶颈。
  2. redis缓存失效时,会对数据库产生冲击。

image-20230413203944261


2. 多级缓存方案

多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻tomcat的压力,提升服务性能:

image-20230413204807451

注:用作缓存的nginx是业务nginx,需要部署为集群,再使用专门的nginx用来做反向代理


2.1 JVM进程缓存

image-20230413205008322

2.1.1 本地进程缓存

本地进程缓存:缓存在日常开发中起到了至关重要的作用,由于是存在在内存中,数据的读取速度非常快,能大量减少对数据库的访问,减少数据库的压力,我们把缓存分为两类:

  1. 分布式缓存,例如Redis:
    • 优点:存储容量大,可靠性更好,可以在集群间共享
    • 缺点:访问缓存有网络开销
    • 场景:缓存数据量较大、可靠性要求较高,需要在集群见共享
  2. 本地进程缓存,例如HashMap,GuavaCache:
    • 优点:读取本地内存,没有网络开销,速度更快
    • 缺点:存储容量有限,可靠性较低,无法共享
    • 场景:性能要求较高,缓存数据量较小

2.1.2 Caffeine

本地进程缓存Caffeine 是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库,目前spring内部的缓存使用的就算Caffeine。

引入依赖:

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

示例:

@Test
void testBasicOps() {
    //构建cache对象
    Cache<String, String> cache = Caffeine.newBuilder().build();
    //存数据
    cache.put("gf", "刘亦菲");

    //取数据
    String gf = cache.getIfPresent("gf");
    System.out.println("gf = " + gf);

    //取数据,如果未命中,则查询数据库
    //参数1:缓存的key
    //参数2:lambda表达式,表达式的参数就是缓存的key,方法体就是查询逻辑
    //优先根据key查询jvm缓存,如果未命中,则执行参数2的lambda表达式
    String defaultGF = cache.get("defaultGF", key -> {
        //根据key去数据库查询数据
        return "王祖贤";
    });
    System.out.println("defaultGF = " + defaultGF);
    System.out.println("defaultGF = " + cache.getIfPresent("defaultGF"));
}

运行结果如下:

image-20230413210838934


Caffeine 提供了三种缓存驱逐策略:

  • 基于容量:设置缓存的数量上限

    Cache<String, String> cache = Caffeine.newBuilder()
            .maximumSize(10_000)//上限为10000个key
            .build();
    
  • 基于时间:设置缓存的有效时间

    // 创建缓存对象
    Cache<String, String> cache = Caffeine.newBuilder()
        .expireAfterWrite(Duration.ofSeconds(10)) // 设置缓存有效期为 10 秒,从最后一次写入开始计时 
        .build();
    
  • 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。

在默认的情况下,当一个缓存元素过期的时候,Caffeine 不会自动立即将其清理和驱逐,而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。


2.2 Nginx缓存

2.2.1 准备工作

首先需要安装 OpenResty ,它本质上也是一个nginx服务器,它具有以下特点:

  1. 具备Nginx的完整功能
  2. 基于Lua语言进行扩展,集成了大量精良的Lua库、第三方模块
  3. 允许使用Lua自定义业务逻辑、自定义库

安装好 OpenResty 后,安装目录为 /usr/local/openresty

/usr/local/openresty/nginx/conf 目录下的nginx.conf文件添加如下模块:

# 加载lua 模块  
 lua_package_path "/usr/local/openresty/lualib/?.lua;;";  
 # 加载c模块 
 lua_package_cpath "/usr/local/openresty/lualib/?.so;;";

/api/item 这个路径进行监听:

 location /api/item {
     # 响应类型,这里返回json
     default_type application/json;
     # 响应数据由 lua/item.lua这个文件来决定
     content_by_lua_file lua/item.lua;
 }

注:lua/item.lua的lua目录和nginx同级,完整路径为/usr/local/openresty/lua,在这个文件下面就可以编写缓存脚本。

2.2.2

待续

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

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

相关文章

微服务高级篇【3】之分布式缓存Redis集群

文章目录前言一 单机Redis存在的问题二 Redis的安装三 Redis持久化3.1 RDB持久化3.1.1 触发条件3.1.2 RDB原理3.1.3 小结3.2 AOF持久化3.2.1 AOF原理3.2.2 AOF配置3.2.3 AOF文件重写3.3 RDB与AOF对比四 Redis主从集群4.1 搭建主从架构4.2 搭建主从集群4.2.1 集群结构4.2.2 准备…

【FFmpeg】自定义编码器适配

目录1 编码流程1.1 整体流程1.2 内部流程2 适配接口2.1 init、close2.2 option2.3 receive2.4 encode2.5 零拷贝的设计1 编码流程 FFmpeg是一个开源的多媒体框架&#xff0c;底层可对接实现多种编解码器&#xff0c;下面参考文件doc/examples/encode_video.c分析编码一帧的流程…

Adobe Illustrator2023(AI2023)图文安装教程

Adobe Illustrator2023(AI2023)简称AI&#xff0c;是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。该软件主要应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等&#xff0c;也可以为线稿提供较高的精度和控制&#xff0c;适合生产任…

【Camunda】 -- Docker 安裝及使用

【Camunda】 -- Docker 安裝及使用1. Docker install Camunda platform1.1 Web2. Big Data -- Postgres1.1 Big Data -- Postgres3.Awakening1.1 Big Data -- PostgresCamunda platform 是一個任務監控的平台。 Camunda Modeler是建模工具。 1. Docker install Camunda platfor…

【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory

一、参考资料 error while loading shared libraries的解决方案 libascend_hal.so: cannot open shared object file:No such…解决办法-云社区-华为云 (huaweicloud.com) 二、相关介绍 1. -lxxx.so命名 lxxx means lib lib-name .solc means libc.so, lltdl means lib…

C++学习从基础到高阶(基于黑马程序员教程)

视频链接&#xff1a;黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难&#xff08;52个小时&#xff09; C语言中文网&#xff1a;http://c.biancheng.net/cplus/ Visual Studio 2022 下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/downloads/ Visu…

软件设计模式 | 动态代理模式

文章目录一、动态代理概述1.1 代理的概述和作用1.2 动态代理的优点1.3 代理对象的创建1.4 代理对象调用方法的执行流程二、动态代理举例2.1 歌手经纪人2.2 业务功能的性能统计2.3 动态代理在 Spring 框架中的应用三、基于子类的动态代理一、动态代理概述 1.1 代理的概述和作用…

英语语法——动词

文章目录分类时态一般时态三单过去式进行时态现在分词完成时态过去分词完成进行时态情态语态否定强调非谓语动词分类 时态 时态用于表示动作发生的时间和状态&#xff0c;它通过谓语动词的形式变化来体现&#xff0c;时态是每个动词必须要有的。在英语中有以下十六种时态&…

MySQL怎么卸载干净

卸载干净MySQL的步骤&#xff1a;首先关闭MySQL服务&#xff1b;然后卸载MySQL软件&#xff1b;接着删除MySQL在电脑中的残存文件&#xff1b;最后删除MySQL注册表信息即可。 很多人都遇到过一个问题&#xff0c;那就是在安装MySQL的时候操作错误&#xff0c;最后结果不是自己想…

C++【深入理解继承】

文章目录一、继承概念与定义二、基类和派生类对象赋值转换三、派生类的默认成员函数&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;拷贝构造函数&#xff08;3&#xff09;赋值重载&#xff08;4&#xff09;析构函数四、复杂的菱形继承及菱形虚拟继承&#xff0…

python 不指定参数个数---args基础用法

前言&#xff1a; 在有些时候&#xff0c;设计函数的时候&#xff0c;可能不知道要传入的参数类型或者参数个数&#xff0c;此时args可以很好地解决。 一、*args的基本用法 1。传入不指定个数的参数&#xff0c; 2。参数的类型也不指定&#xff0c;可以是任意类型数据&…

k8s学习(三十五)飞腾2000+麒麟V10离线部署metrics-server

文章目录1、下载metrics-server配置文件2、下载推送metrics-server镜像3、修改metrics-server配置4、启动metrics-server1、下载metrics-server配置文件 在有网机器上从网站https://github.com/kubernetes-incubator/metrics-server下载 拷贝其到离线机器K8S的master节点。 2…

九龙证券|又3个涨停,退市风险急升!

*ST新海退市危险急剧上升&#xff01; 到4月14日&#xff0c;*ST新海收盘价接连14个买卖日低于1元/股。按照退市新规&#xff0c;若*ST新海在接下来6个买卖日收盘价继续低于1元/股&#xff0c;将触及买卖类强制退市景象而终止上市&#xff0c;公司股票将不进入退市整理期。 面…

Android Audio音量设置原理流程分析

Android Audio音量设置原理流程分析 简介 本篇文章主要介绍Android音量设置从App应用层到framework层执行流程&#xff0c;以及相关的细节和原理分析&#xff0c;建议在阅读此文章前去看博主的混音理论篇的声音的音量属性和声音相关公式的推导章节&#xff0c;这对阅读时理解音…

2023年泰迪杯数据挖掘挑战赛B题完整数据分析与预测(5.针对完整数据的组合预测-机器学习+深度学习)

背景 2023年泰迪杯完整数据最新出炉&#xff0c;博主根据最新完整数据对原来的预测方案进行了调整&#xff0c;采用机器学习深度学习的组合预测来实现最终预测 全部数据已经出炉&#xff0c;可以看出训练样本和预测样本都增加了十倍&#xff0c;这对于数据的处理复杂程度也有…

linux驱动开发 - 04_Linux 设备树学习 - DTS语法

文章目录Linux 设备树学习 - DTS语法1 什么是设备树&#xff1f;2 DTS、DTB和DTC3 DTS 语法3.1 dtsi 头文件3.2 设备节点3.3 标准属性1、compatible 属性2、model 属性3、status 属性4、#address-cells 和#size-cells 属性5、reg 属性6、ranges 属性7、name 属性8、device_type…

FreeRTOS 任务切换

文章目录一、PendSV 异常二、FreeRTOS 任务切换场合1. 执行系统调用 taskYIELD()2. 系统滴答定时器(SysTick)中断 SysTick_Handler三、PendSV 中断服务函数 PendSV_Handler()四、查找下一个要运行的任务 vTaskSwitchContext()五、FreeRTOS 时间片调度六、时间片调度实验RTOS 系…

ECF机制:信号 (Signal)

&#x1f4ad; 写在前面&#xff1a;ECF (异常控制流) 机制是存在于系统的所有层级中的&#xff0c;所以这一块的知识我们需要系统地去学习。前几章我们探讨过了异常 (Exceptions)&#xff0c;由硬件触发&#xff0c;在内核代码中处理。讲解了进程的上下文切换 (Process Contex…

Shiro整合SpringBoot项目实战

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

阿里入局,通义千问备受期待

目录官宣内测体验内容鸟鸟分鸟后言继百度文心一言发布三周之后&#xff0c;4月7日阿里通义大模型终于推出通义千问&#xff0c;阿里正式加入ChatGPT战局。下午市场一片大热&#xff0c;对于深耕NLP多年的阿里&#xff0c;大家有足够的期待。 官宣内测 “你好&#xff0c;我叫通…