基于Java怎么实现Redis多级缓存

一、多级缓存

1. 传统缓存方案

请求到达tomcat后,先去redis中获取缓存,不命中则去mysql中获取

基于Java怎么实现Redis多级缓存

2. 多级缓存方案

tomcat的请求并发数,是远小于redis的,因此tomcat会成为瓶颈

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

基于Java怎么实现Redis多级缓存

立即学习“Java免费学习笔记(深入)”;

二、JVM本地缓存

缓存是存储在内存中,数据读取速度较快,能大量减少对数据库的访问,减少数据库压力

分布式缓存,如redis – 优点: 存储容量大,可靠性好,可以在集群中共享 – 缺点: 访问缓存有网络开销 – 场景: 缓存数据量大,可靠性高,需要在集群中共享的数据

进程本地缓存, 如HashMap, GuavaCache
– 优点:读取本地内存,没有网络开销,速度更快
– 缺点:存储容量有限,可靠性低(如重启后丢失),无法在集群中共享
– 场景:性能要求高,缓存数据量少

1. 实用案例

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

目前spring内部的缓存用的就是这个

     com.github.ben-manes.caffeine     caffeine     3.0.5 

登录后复制

package com.erick.cache;import com.github.benmanes.caffeine.cache.Cache;import com.github.benmanes.caffeine.cache.Caffeine;import java.time.Duration;public final class CacheUtil {    private static int expireSeconds = 2;    public static Cache cacheWithExpireSeconds;    private static int maxPairs = 1;    public static Cache cacheWithMaxPairs;    static {        /*过期策略,写完60s后过期*/        cacheWithExpireSeconds = Caffeine.newBuilder()                .expireAfterWrite(Duration.ofSeconds(expireSeconds))                .build();        /*过期策略,达到最大值后删除         * 1. 并不会立即删除,等一会儿才会删除         * 2. 会将之前存储的数据删除掉*/        cacheWithMaxPairs = Caffeine.newBuilder()                .maximumSize(maxPairs)                .build();    }    /*从缓存中获取数据     * 1. 如果缓存中有,则直接从缓存中返回     * 2. 如果缓存中没有,则去数据查询并返回结果*/    public static String getKeyWithExpire(String key) {        return cacheWithExpireSeconds.get(key, value -> {            return getResultFromDB();        });    }    public static String getKeyWithMaxPair(String key) {        return cacheWithMaxPairs.get(key, value -> {            return getResultFromDB();        });    }    private static String getResultFromDB() {        System.out.println("数据库查询");        return "db result";    }}

登录后复制

package com.erick.cache;import java.util.concurrent.TimeUnit;public class Test {    @org.junit.Test    public void test01() throws InterruptedException {        CacheUtil.cacheWithExpireSeconds.put("name", "erick");        System.out.println(CacheUtil.getKeyWithExpire("name"));        TimeUnit.SECONDS.sleep(3);        System.out.println(CacheUtil.getKeyWithExpire("name"));    }    @org.junit.Test    public void test02() throws InterruptedException {        CacheUtil.cacheWithMaxPairs.put("name", "erick");        CacheUtil.cacheWithMaxPairs.put("age", "12");        System.out.println(CacheUtil.getKeyWithMaxPair("name"));        System.out.println(CacheUtil.getKeyWithMaxPair("age"));        TimeUnit.SECONDS.sleep(2);        System.out.println(CacheUtil.getKeyWithMaxPair("name")); // 查询不到了        System.out.println(CacheUtil.getKeyWithMaxPair("age"));    }}

登录后复制

三、缓存一致性

1. 常见方案

1.1 设置有效期

给缓存设置有效期,到期后自动删除。再次查询时可以更新

优势:简单,方便

缺点:时效性差,缓存过期之前可能不一致

场景:更新频率低,时效性要求比较低的业务

1.2 同步双写

在修改数据库的同时,直接修改缓存

优势:有代码侵入,缓存与数据库强一致性

缺点:代码进入,耦合性高

场景:对一致性,失效性要求较高的缓存数据

1.3 异步通知

修改数据库时发送事件通知,相关服务监听到后修改缓存数据

优势:低耦合,可以同时通知多个缓存服务

缺点:时效性一把,可能存在缓存不一致问题

场景:时效性一般,有多个服务需要同步

基于Java怎么实现Redis多级缓存

基于Java怎么实现Redis多级缓存

2. 基于Canal的异步通知

是阿里旗下的一款开源项目,基于java开发

基于数据库增量日志解析,提供增量数据订阅和消费

基于mysql的主从备份的思想

2.1 mysql主从复制

基于Java怎么实现Redis多级缓存

2.2 canal 工作原理

canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议

MySQL master 收到 dump 请求, 开始推送 binary log 给 slave (即 canal )

canal 解析 binary log 对象(原始为 byte 流)

以上就是基于Java怎么实现Redis多级缓存的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2603307.html

(0)
上一篇 2025年3月6日 19:39:13
下一篇 2025年2月28日 01:16:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • java获取到heapdump文件后怎么快速分析

    heapdump文件介绍 heap dump: heap dump文件是一个二进制文件,它保存了某一时刻jvm堆中对象使用情况。heapdump文件是指定时刻的java堆栈的快照,是一种镜像文件。 产生heap dump(内存溢出)错误原因…

    2025年3月6日 编程技术
    200
  • Java怎么实现登录与注册页面

    用java实现的登录与注册页面,实现了客户端(浏览器)到服务器(tomcat)再到后端(servlet程序)数据的交互。这里在注册页面加入了验证码验证。 注册的html代码 登录后复制登录后复制    注册页面    function ch…

    2025年3月6日
    200
  • Java如何实现鲜花商城系统

    项目介绍 该项目为前后台项目,分为普通用户与管理员两种角色,前台普通用户登录,后台管理员登录; 管理员角色包含以下功能: 管理员登录,用户管理,鲜花类别管理,鲜花管理,订单管理并发货,留言管理,系统公告管理等功能。 用户角色包含以下功能: …

    2025年3月6日 编程技术
    200
  • Java中的SPI机制是什么

    1: SPI机制简介 spi 全称是 service provider interface,是一种 jdk 内置的动态加载实现扩展点的机制,通过 spi 技术我们可以动态获取接口的实现类,不用自己来创建。这个不是什么特别的技术,只是 一种设…

    2025年3月6日
    200
  • Java语言中的医疗健康应用开发介绍

    随着医疗科技的发展和互联网的普及,医疗健康应用越来越受到人们的关注。使用java语言来开发医疗健康应用不仅可以提高开发效率,还可以保证软件的稳定性和安全性。本文将介绍java语言在医疗健康应用开发中的应用。 一、Java语言的优点 Java…

    编程技术 2025年3月6日
    200
  • Java语言应用服务器的搭建方法

    随着互联网的普及和应用开发的需要,java语言应用服务器也逐渐成为了重要的支撑平台之一。它不仅可以提供运行环境,还可以支持多种程序开发语言,如java、php和python等。本文将介绍java语言应用服务器的搭建方法,帮助广大读者快速搭建…

    编程技术 2025年3月6日
    200
  • Java语言中的社交应用开发介绍

    随着社交媒体越来越普及,社交应用也成为了人们生活中不可或缺的一部分。而随着java语言的发展,越来越多的社交应用开始使用java语言来进行开发。那么本文将从java语言的角度出发,向读者介绍java语言中的社交应用开发。 一、 Java语言…

    编程技术 2025年3月6日
    200
  • Java语言中的数据库操作技巧

    java语言中的数据库操作技巧 作为一门广泛应用于企业级开发的语言,Java语言中数据库操作是必不可少的一部分。在Java开发中使用数据库为应用程序提供数据存储和管理,而大量的数据查询和数据操作又需要高效的技巧来操作数据库。本篇文章将介绍一…

    编程技术 2025年3月6日
    200
  • Java API 开发中使用 Camel 进行 ESB 集成

    esb(enterprise service bus)是随着soa(service-oriented architecture)架构的普及而兴起的一种集成方式,它提供了一种解决企业不同系统间通信及传输数据的手段。而camel则是一种用于构建…

    编程技术 2025年3月6日
    200
  • Java API 开发中使用 JNDI 进行数据库连接

    java api 开发中使用 jndi 进行数据库连接 JNDI(Java Naming and Directory Interface)是 Java API 中用于访问命名和目录服务的标准 API。在 Java 开发中,JNDI 被广泛应…

    编程技术 2025年3月6日
    200

发表回复

登录后才能评论