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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。