广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于Java实现Redis多级缓存方案
  • 956
分享到

基于Java实现Redis多级缓存方案

2024-04-02 19:04:59 956人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、多级缓存1. 传统缓存方案2. 多级缓存方案二、JVM本地缓存1. 实用案例三、缓存一致性1. 常见方案1.1 设置有效期1.2 同步双写1.3 异步通知2. 基于Canal

一、多级缓存

1. 传统缓存方案

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

2. 多级缓存方案

  • tomcat的请求并发数,是远小于redis的,因此tomcat会成为瓶颈
  • 利用请求处理每个环节,分别添加缓存,减轻tomcat压力,提升服务性能

二、JVM本地缓存

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

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

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

1. 实用案例

  • Caffeine是一个基于java8开发的,提供了近乎最佳命中率的高性能的本地缓存库
  • 目前spring内部的缓存用的就是这个
<dependency>
     <groupId>com.GitHub.ben-manes.caffeine</groupId>
     <artifactId>caffeine</artifactId>
     <version>3.0.5</version>
 </dependency>
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<String, String> cacheWithExpireSeconds;

    private static int maxPairs = 1;
    public static Cache<String, String> cacheWithMaxPairs;

    static {
        
        cacheWithExpireSeconds = Caffeine.newBuilder()
                .expireAfterWrite(Duration.ofSeconds(expireSeconds))
                .build();

        
        cacheWithMaxPairs = Caffeine.newBuilder()
                .maximumSize(maxPairs)
                .build();
    }

    
    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 异步通知

  • 修改数据库时发送事件通知,相关服务监听到后修改缓存数据
  • 优势:低耦合,可以同时通知多个缓存服务
  • 缺点:时效性一把,可能存在缓存不一致问题
  • 场景:时效性一般,有多个服务需要同步

2. 基于Canal的异步通知

  • 是阿里旗下的一款开源项目,基于java开发
  • 基于数据库增量日志解析,提供增量数据订阅和消费
  • 基于mysql的主从备份的思想

2.1 mysql主从复制

2.2 canal 工作原理

  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  • MySQL master 收到 dump 请求, 开始推送 binary log 给 slave (即 canal )
  • canal 解析 binary log 对象(原始为 byte 流)

到此这篇关于Redis多级缓存方案分享的文章就介绍到这了,更多相关Redis多级缓存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 基于Java实现Redis多级缓存方案

本文链接: https://www.lsjlt.com/news/143507.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Java实现Redis多级缓存方案
    目录一、多级缓存1. 传统缓存方案2. 多级缓存方案二、JVM本地缓存1. 实用案例三、缓存一致性1. 常见方案1.1 设置有效期1.2 同步双写1.3 异步通知2. 基于Canal...
    99+
    2022-11-13
  • 基于Java怎么实现Redis多级缓存
    这篇文章主要介绍“基于Java怎么实现Redis多级缓存”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Java怎么实现Redis多级缓存”文章能帮助大家解决问题。一、多级缓存1. 传统缓存方案请...
    99+
    2023-06-29
  • redis实现多级缓存同步方案详解
    目录前言多级缓存数据同步如何使用Redis6客户端缓存总结前言 前阵子参加业务部门的技术方案评审,故事的背景是这样:业务部门上线一个专为公司高管使用的系统。这个系统技术架构形如下图 按理来说这个系统因为受众很小,可以说...
    99+
    2022-12-21
    redis多级缓存同步 redis多级缓存 redis缓存同步
  • 基于Spring Cache实现Caffeine+Redis二级缓存
    目录一、聊聊什么是硬编码使用缓存?二、Spring Cache简介1、Cache接口2、CacheManager接口3、常用注解说明三、使用二级缓存需要思考的一些问题?四、Caffe...
    99+
    2022-11-13
  • Redis实现多级缓存
    本文实例为大家分享了Redis实现多级缓存的具体代码,供大家参考,具体内容如下 一、多级缓存 1. 传统缓存方案 请求到达tomcat后,先去redis中获取缓存,不命中则去mysql中获取 2. 多级缓存方案 tom...
    99+
    2022-07-28
    Redis 多级缓存
  • 基于Spring Cache如何实现Caffeine+Redis二级缓存
    这篇文章主要为大家展示了“基于Spring Cache如何实现Caffeine+Redis二级缓存”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“基于Spring Cache如...
    99+
    2023-06-29
  • redis如何实现多级缓存
                                 ...
    99+
    2022-10-18
  • 基于微前端qiankun的多页签缓存方案实践
    目录一、多页签是什么?1.1 单页面应用实现多页签1.2 使用qiankun进行微前端改造后,多页签缓存有什么不同二、方案选择2.1 方案一:多个子应用同时存在2.2 方案二:同一时...
    99+
    2022-11-13
    微前端qiankun多页签缓存 微前端qiankun
  • 基于Redis缓存怎么实现分布式锁
    本篇内容介绍了“基于Redis缓存怎么实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是分布式锁首先我们先来简单了解一下什么是...
    99+
    2023-06-19
  • Java实现本地缓存、分布式缓存及多级缓存
    以下均为自己参考其它博主文章或自己理解整理而成,如有错误之处,欢迎在评论区批评指正! 0. 缓存简介        像MySql等传统的关系型数据库已经不能适用于所有的业务场景,比如电商系统的秒杀场景,APP首页的访问流量高峰场景,很容易造...
    99+
    2023-09-17
    java
  • Redis百亿级Key存储方案怎么实现
    本篇内容主要讲解“Redis百亿级Key存储方案怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis百亿级Key存储方案怎么实现”吧!1.需求背景该...
    99+
    2022-10-19
  • 基于Redis验证码发送及校验方案实现
    在我们的业务中,经常存在需要通过发送验证码、校验验证码来完成的一些业务逻辑,比如账号注册、找回密码、用户身份确认等。 在该类业务中,发送验证码的方式可以有各种各样,比如最常见的手机验证,最古老的邮箱验证,到现在相对少见的...
    99+
    2023-01-04
    Redis验证码发送及校验 Redis验证码发送
  • 浅谈SpringCache与redis集成实现缓存解决方案
    缓存可以说是加速服务响应速度的一种非常有效并且简单的方式。在缓存领域,有很多知名的框架,如EhCache 、Guava、HazelCast等。Redis作为key-value型数据库,由于他的这一特性,Redis也成为一种流行的数据缓存工具...
    99+
    2023-05-30
    spring cache redis
  • MySQL与Redis实现二级缓存的方法是什么
    这篇文章将为大家详细讲解有关MySQL与Redis实现二级缓存的方法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。redis简介Redis 是完全开源免费的,遵守B...
    99+
    2022-10-18
  • 基于Redis实现延时队列的优化方案小结
    目录一、延时队列的应用二、延时队列的实现三、总结一、延时队列的应用 近期在开发部门的新项目,其中有个关键功能就是智能推送,即根据用户行为在特定的时间点向用户推送相应的提醒消息,比如以下业务场景: 在用户点击充值项后,半小...
    99+
    2022-07-05
    Redis延时队列 Redis延时队列优化
  • 详解基于MybatisPlus两步实现多租户方案
    1.定义一个TenantLineHandler的实现类: import com.baomidou.mybatisplus.extension.plugins.handler.Te...
    99+
    2022-11-12
  • Java基于LoadingCache实现本地缓存的示例代码
    目录一、 添加 maven 依赖二、CacheBuilder 方法说明三、创建 CacheLoader四、工具类五、guava Cache数据移除一、 添加 maven 依赖 <...
    99+
    2022-11-12
  • 利用Redis实现分布式缓存穿透解决方案
    利用Redis实现分布式缓存穿透解决方案随着互联网业务的不断发展,数据访问量也在不断增加,为了提高系统的性能和用户体验,缓存技术逐渐成为了必不可少的一部分,其中Redis作为一种高效、可扩展的缓存中间件方案,备受开发者的青睐。在使用Redi...
    99+
    2023-11-07
    redis 分布式缓存 缓存穿透
  • 利用Redis实现分布式缓存失效解决方案
    利用Redis实现分布式缓存失效解决方案,需要具体代码示例在分布式系统中,缓存是提高性能和减轻数据库负载的重要组成部分。而缓存的失效是一个常见的问题,当缓存中的数据发生变化时,我们需要及时将缓存失效,保证数据的一致性。Redis是一个高性能...
    99+
    2023-11-08
    分布式 redis 缓存失效
  • 基于 Spring Aop 环绕通知实现 Redis 缓存双删功能(示例代码)
    基于 spring aop 常规应用场景多是用于日志记录以及实现 Redis 分布式锁,在 github 中也有项目是把它拿来当作缓存的异常捕捉。从而避免影响实际业务的开发;在某天,笔者有个业务开发是给某个服务模块增加 ...
    99+
    2022-08-16
    Spring Aop Redis 缓存双删 Spring Aop Redis 缓存
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作