요청이 Tomcat에 도달한 후 먼저 Redis로 이동하여 캐시를 가져옵니다.
tomcat
동시 요청 수가 Redis보다 훨씬 적으므로 Tomcat은 병목 현상이 발생합니다
요청 처리의 각 링크를 사용하여 각각 캐시를 추가하면 Tomcat과 Tomcat에 대한 부담을 줄일 수 있습니다. 서비스 성능 향상
캐시가 메모리에 저장되어 데이터 읽기 속도가 빨라 데이터베이스에 대한 액세스를 대폭 줄이고 데이터베이스에 대한 부담을 줄일 수 있습니다
redis와 같은 분산 캐시
- 장점: 저장 용량이 크고, 안정성이 높으며, 클러스터 내 공유에서 사용 가능
- 단점: 캐시에 접근하기 위한 네트워크 오버헤드가 있음
- 시나리오: 캐시된 데이터의 양이 많고, 높음 신뢰성, 클러스터에서 공유해야 하는 데이터
HashMap, GuavaCache와 같은 로컬 캐시 처리
- 장점: 로컬 메모리 읽기, 네트워크 오버헤드 없음, 더 빠름
- 단점: 제한된 저장 용량, 낮은 신뢰성(예: 재시작 후 손실됨), 클러스터에서 공유할 수 없음
- 시나리오: 높은 성능 요구 사항, 적은 양의 캐시된 데이터
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 { /*过期策略,写完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")); } }
유효 기간 설정 캐시를 저장하고 만료 후 자동으로 삭제합니다. 다시 쿼리하면 업데이트될 수 있습니다
장점: 간단하고 편리함
단점: 적시성이 낮고 캐시가 만료되기 전에 캐시가 일치하지 않을 수 있습니다
시나리오: 업데이트 빈도가 낮고 적시성 요구 사항이 낮은 비즈니스
데이터베이스 수정 시 캐시 직접 수정
장점: 코드 침입, 캐시와 데이터베이스 간의 강력한 일관성
단점: 코드 입력, 높은 결합도
: 일관성 및 무효성 요구 사항이 높은 캐시 데이터
데이터베이스가 수정되면 이벤트 알림을 보내고, 관련 서비스는 이를 수신한 후 캐시된 데이터를 수정합니다.
장점: 낮은 결합, 동시에 알림 여러 캐시 서비스
단점: 적시성, 캐시 불일치 문제가 있을 수 있음
시나리오: 적시성은 보통, 동기화해야 하는 서비스가 여러 개 있음
은 Alibaba의 오픈 소스 프로젝트로 Java
데이터베이스 증분 로그 분석을 기반으로 증분 데이터 구독 및 소비
를 제공합니다. mysql의 마스터-슬레이브 백업
canal은 MySQL 슬레이브의 상호 작용 프로토콜을 시뮬레이션하고, 자신을 MySQL 슬레이브로 위장하고, 덤프 프로토콜을 보냅니다. MySQL 마스터로
MySQL 마스터는 덤프 요청을 수신하고 바이너리 로그를 슬레이브(예: 운하)에 푸시하기 시작합니다
canal은 바이너리 로그 개체(원래는 바이트 스트림)를 구문 분석합니다
위 내용은 Java 기반 Redis 다중 레벨 캐시 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!