java使用redis缓存案例,redis缓存解决高并发

  java使用redis缓存案例,redis缓存解决高并发

  00-1010 1.多级缓存1。传统缓存方案2。多级缓存方案2。JVM本地缓存1。实际案例3。缓存一致性1。常用方案1.1设置有效期1.2同步双写1.3异步通知2。基于Canal的异步通知2.1 mysql主从复制2.2 canal工作原理

  

目录

 

  00-1010请求到达tomcat后,去redis获取缓存,如果不命中就去mysql获取。

  

一、多级缓存

tomcat的请求并发性远不如redis,所以tomcat会成为瓶颈。利用请求处理的各个环节,分别添加缓存,减轻tomcat的压力,提高服务性能。

 

  00-1010缓存存储在内存中,可以快速读取数据,可以大大减少对数据库的访问,减轻数据库的压力。

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

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

  

1. 传统缓存方案

Caffeine是基于java8开发的,它提供了一个高性能的本地缓存库,具有近乎最佳的命中率。目前,这个依赖groupIdcom.github.ben-manes.caffeine/groupId artifactid咖啡因/artifactid版本3 . 0 . 5/version/dependency package com。Erick.cache用于spring的缓存。导入com . github . benmanes . caffeine . cache . cache;导入com.github.benmanes .咖啡因. cache .咖啡因;导入Java . time . duration;public final类CacheUtil { private static int expire seconds=2;公共静态缓存字符串,字符串cacheWithExpireSeconds。private static int max pairs=1;公共静态CacheString,字符串cacheWithMaxPairs静态{/*过期策略,在写入*/cachewithExpireSeconds=caffeine . new builder()60秒后过期。ExpireAfterwrite(持续时间。秒(ExpireSeconds))。build();/*过期策略,达到最大值* 1后删除。不会马上删除,过段时间会删除* 2。先前存储的数据将被删除*/cachewithmaxpairs=caffeine . new builder()。maximumsize (maxpairs)。build();}/*从缓存中获取数据* 1。如果缓存中有,直接从缓存中返回* 2。如果缓存中没有,则转到数据查询,返回结果*/public static string getkeywithexpire(string key){ return cachewithexpires . get(key,value-{ return getresultfromdb());});}公共静态字符串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多级缓存内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 关于redis数据库入门详细介绍图片,redis数据库的使用,关于Redis数据库入门详细介绍
  • redis队列操作命令,redis 循环队列
  • redis队列操作命令,redis 循环队列,redis实现简单队列
  • redis部署应用服务器上,redis如何启动服务器
  • redis部署应用服务器上,redis如何启动服务器,搭建Redis服务器步骤详细介绍
  • redis缓存穿透和击穿解决方案,redis缓存穿透,缓存雪崩解决
  • redis缓存穿透和击穿解决方案,redis缓存穿透,缓存雪崩解决,redis缓存穿透解决方法
  • Redis缓存,redis和缓存
  • Redis缓存,redis和缓存,Redis缓存详解
  • redis的配置,启动,操作和关闭方法有哪些,关闭redis的命令,Redis的配置、启动、操作和关闭方法
  • redis的主从配置方法详解图,Redis主从配置
  • redis的主从配置方法详解图,Redis主从配置,redis的主从配置方法详解
  • redis界面工具,mac安装redis可视化工具
  • redis界面工具,mac安装redis可视化工具,推荐几款 Redis 可视化工具(太厉害了)
  • redis正确使用的十个技巧是什么,redis正确使用的十个技巧有哪些
  • 留言与评论(共有 条评论)
       
    验证码: