Redis进阶 - JVM进程缓存

news2024/11/25 6:57:29

原文首更地址,阅读效果更佳!

Redis进阶 - JVM进程缓存 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-jvm-process-cache.html

传统缓存的问题

传统的缓存策略一般是请求到达 Tomcat 后,先查询 Redis ,如果未命中则查询数据库,存在下面的问题:

  • 请求要经过 Tomcat 处理,Tomcat 的性能成为整个系统的瓶颈
  • Redis 缓存失效时,会对数据库产生冲击

多级缓存方案

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

#本地进程缓存

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

  • 分布式缓存:例如 Redis

    • 优点:存储容量更大、可靠性更好、可以再集群间共享
    • 缺点:访问缓存有网络开销
    • 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享
  • 进程本地缓存:例如 HashMap、GuavaCache

    • 优点:读取本地内存,没有网络开销,速度更快
    • 缺点:存储容量有限、可靠性能较低、无法共享
    • 场景:性能要求较高,缓存数据量较小

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

Github 地址:https://github.com/ben-manes/caffeineopen in new window

#Caffeine

Caffeine 是一个基于 Java8 开发的提供了近乎最佳命中率的高性能的缓存库。

缓存和 ConcurrentMap 有点相似,但还是有所区别。最根本的区别是 ConcurrentMap 将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但是,Caffeine 的缓存 Cache 通常会被配置成自动驱逐缓存中元素,以限制其内存占用。在某些场景下,LoadingCache 和AsyncLoadingCache 因为其自动加载缓存的能力将会变得非常实用。

Caffeine 提供了灵活的构造器去创建一个拥有下列特性的缓存:

  • 自动加载元素到缓存当中,异步加载的方式也可供选择
  • 当达到最大容量的时候可以使用基于就近度和频率的算法进行基于容量的驱逐
  • 将根据缓存中的元素上一次访问或者被修改的时间进行基于过期时间的驱逐
  • 当向缓存中一个已经过时的元素进行访问的时候将会进行异步刷新
  • key 将自动被弱引用所封装
  • value 将自动被弱引用或者软引用所封装
  • 驱逐(或移除)缓存中的元素时将会进行通知
  • 写入传播到一个外部数据源当中
  • 持续计算缓存的访问统计指标

为了提高集成度,扩展模块提供了 JSR-107 JCache 和 Guava 适配器。 JSR-107 规范了基于 Java 6 的 API,在牺牲了功能和性能的代价下使代码更加规范。

Guava 的 Cache 是 Caffeine 的原型库并且 Caffeine 提供了适配器以供简单的迁移策略。

原文地址

https://github.com/ben-manes/caffeine/wiki/Home-zh-CNopen in new window

#Caffeine示例

@Test
void testCaffeine(){
    // 1.创建缓存对象
    Cache<String,String> cache = Caffeine.newBuilder().build();

    // 2.存数据
    cache.put("username","codermast");

    // 3.1取数据,不存在则返回 Null
    String username = cache.getIfPresent("username");
    System.out.println("username = " + username);

    // 3.2取数据,不存在则从数据库查询
    String username2 = cache.get("username",key -> {
        // 这里写的是去数据库查询的业务逻辑
        // ...
        return "Hello World!";
    });
    System.out.println("username2 = " + username2);
}

#Caffeine缓存驱逐策略

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

  • 基于容量:设置缓存的数量上限,使用 LRU 规则选择

// 创建缓存对象
Cache<String,String> cache = Caffeine.newBuilder()
    .maximumSize(1) // 设置缓存大小上限为 1
    .build();
  • 基于时间:设置缓存的有效时间

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

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

注释

JVM 进程缓存和 Redis 缓存,本质上都是对数据的缓存,目的都是为了加速数据的读取。

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

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

相关文章

Qt开发实例_实时监测磁盘剩余空间

一、前言 当计算机磁盘空间不足,会导致应用程序无法继续存储数据,导致错误和不稳定的情况。所以,实时检测磁盘空间剩余大小对于许多应用程序来说都非常重要。 这种需求在许多应用程序中都存在,例如文件管理器、图像编辑器、视频播放器、云存储服务等等。在这些应用程序中…

Python+Appium自动化测试-编写自动化脚本

之前已经讲述怎样手动使用appium-desktop启动测试机上的app&#xff0c;但我们实际跑自动化脚本的过程中&#xff0c;是需要用脚本调用appium启动app的&#xff0c;接下来就尝试写Python脚本启动app并登陆app。环境为Windows10 Python3.7 appium1.18.0 Android手机 今日头条…

Apex导航菜单权限动态分配的实现

改动之处 return is_have_permission_wxx(V(WXX_USER_ID), 2,V(WXX_ROLE_ID)); 改之后 return is_have_permission_wxx(V(USER_ID), 2,V(ROLE_ID)); 创建新的动态菜单“动态菜单1” 共享组件→列表→创建→动态 selectlevel,m1.NAME label,f?p&||APP_ID.:||m1.…

17-会话机制

cookie 和 session cookie存储在本地 session是在服务器端进行用户信息的保存,一个字典 Cookie: # 1. 设置 : 通过response对象设置response redirect(xxx)response render_template(xxx)response Response(xxx)response make_response(xxx)response jsonify(xxx)# 通过…

xxl-job学习(一篇文章解决)

前言&#xff1a;学习xxl-job需要有git&#xff0c;springboot的基础&#xff0c;学起来就很简单 xxl-job是一个分布式的任务调度平台&#xff0c;其核心设计目标是&#xff1a;学习简单、开发迅速、轻量级、易扩展&#xff0c;现在已经开放源代码并接入多家公司的线上产品线&a…

详解过滤器Filter和拦截器Interceptor的区别和联系

目录 前言 区别 联系 前言 过滤器(Filter)和拦截器(Interceptor)都是用于在Web应用程序中处理请求和响应的组件&#xff0c;但它们在实现方式和功能上有一些区别。 区别 1. 实现方式&#xff1a; - 过滤器是基于Servlet规范的组件&#xff0c;通过实现javax.servlet.Filt…

热烈祝贺重庆融能成功入选航天系统采购供应商库

经过航天系统采购平台的严审&#xff0c;重庆融能机电设备股份有限公司成功入选中国航天系统采购供应商库。航天系统采购平台是航天系统内企业采购专用平台&#xff0c;服务航天全球范围千亿采购需求&#xff0c;目前&#xff0c;已有华为、三一重工、格力电器、科大讯飞等企业…

酒店资产如何管理提升资产利用效率

酒店资产管理系统是一种专门为酒店行业设计的管理软件&#xff0c;可以帮助酒店实现资产的全生命周期管理。一个好的酒店资产管理系统应该具备以下功能&#xff1a;  资产登记&#xff1a;可以对酒店的各种资产进行登记&#xff0c;包括房间、家具、设备等&#xff0c;记录资…

结合近日核污水排放问题浅析数字孪生技术革命对城市环境保护的作用

近期&#xff0c;日本核电站排放核污水引发全球关注&#xff0c;环境保护再次成为重要议题。随着数字孪生技术的进步&#xff0c;数字孪生技术正展现出其强大潜力&#xff0c;为环境保护提供前所未有的洞察和解决方案。本文将深入探讨数字孪生技术如何在环境保护领域发挥作用&a…

Mybatis-plus的saveBatch()造成雪花ID重复问题解析

前言 本文主要是针对Mybatis-plus框架&#xff0c;在调用 saveBatch() 方法时&#xff0c;出现的 id 重复导致的异常报错进行分析&#xff0c;提供后续场景出现相同场景时应该如何定位问题&#xff0c;如何进行调整方案。 问题分析及解决方案 一、场景分析 1、Yaml配置文件…

平衡二叉树及其应用详解

平衡二叉树 定义与性质 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;是计算机科学中的一种数据结构&#xff0c;它是二叉排序树的一种特殊情况。 平衡二叉树满足以下性质&#xff1a; 左子树和右子树的高度差不超过 1。也就是说&#xff0c;对于任意节点&#…

TopicExchange主题交换机

目录 一、简介 二、代码展示 父pom文件 pom文件 配置文件 config 生产者 消费者 测试 结果 一、简介 主题交换机&#xff0c;这个交换机其实跟直连交换机流程差不多&#xff0c;但是它的特点就是在它的路由键和绑定键之间是有规则的。 简单地介绍下规则&#xff1…

ABeam×Startup | 德硕管理咨询(深圳)创新研究团队拜访微漾创客空间

近日&#xff0c;德硕管理咨询&#xff08;深圳&#xff09;&#xff08;以下简称&#xff1a;“ABeam-SZ”&#xff09;创新研究团队前往微漾创客空间&#xff08;以下简称&#xff1a;微漾&#xff09;拜访参观&#xff0c;并展开合作交流。会议上&#xff0c;双方相互介绍了…

python爬虫12:实战4

python爬虫12&#xff1a;实战4 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产生不好…

高精度的石英可编程压控温补振荡器

高精度的石英可编程压控温补振荡器&#xff1a;YSV531PT系列&#xff0c;七大产品特点&#xff0c;让我们一起来了解下~ 1、Q-MEMS VC-TCXO介绍 什么是石英可编程压控温补振荡器&#xff08;Q-MEMS VC-TCXO&#xff09;&#xff1f; “可编程”顾名思义就是其参数可根据用户…

Javascript——循环调接口

需求&#xff1a;同一个接口每个输入框的code传参数不一样&#xff0c;填一个接口成功后循环♻️调接口 <div class"inching-box-radio-btn"><!-- 启动 --><el-button:disabled"noSecValue true"class"inching-btn inching-open"…

cs231n assignmen3 Extra Credit: Image Captioning with LSTMs

文章目录 嫌墨迹直接看代码Extra Credit: Image Captioning with LSTMslstm_step_forward题面解析代码输出 lstm_step_backward题面解析代码输出 lstm_forward题面解析代码输出 lstm_backward题面解析代码输出 CaptioningRNN.loss解析代码输出 最后输出结语 嫌墨迹直接看代码 …

【ES6】—【新特性】—Symbol详情

一、一种新的原始数据类型 定义&#xff1a;独一无二的字符串 二、 声明方式 1. 无描述声明 let s1 Symbol() let s2 Symbol() console.log(s1, s2) // Symbol() Symbol() console.log(s1 s2) // falsePS: Symbol 声明的值是独一无二的 2. 有描述的声明 let s1 Symb…

Android自定义view实现横向滚动弹幕

参考文章 此方案使用动画方式实现&#xff0c;只适合轻量级别的弹幕滚动效果实现&#xff0c;数据量过大时会出现内存激增的情况。 效果&#xff1a; 自定义view代码 public class TumbleLayout extends ViewGroup {private final String TAG "TumbleLayout";priva…

Camunda 7.x 系列【30】中间事件

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 消息中间事件3. 定时器中间事件4. 信号中间事件5. 错误中间事件6. 条件中间事件7…