4월에 한 친구가 인터뷰를 위해 Meituan에 갔습니다. 그는 Redis와 MySQL 간의 이중 쓰기 일관성을 보장하는 방법에 대한 질문을 받았다고 말했습니다. 이 질문은 실제로 이중 쓰기 시나리오에서 캐시와 데이터베이스의 일관성을 보장하는 방법을 묻습니다. 이 기사에서는 이 질문에 대답하는 방법에 대해 논의할 것입니다.
일관성은 분산 시스템에서 데이터의 일관성을 의미합니다. 노드 값이 일관됩니다.
캐싱을 사용하면 성능이 향상되고 데이터베이스 부담이 완화될 수 있지만, 캐시를 사용하면 데이터 불일치가 발생할 수도 있습니다. 일반적으로 캐시를 어떻게 사용합니까? 세 가지 기본 캐싱 패턴이 있습니다.
Cache-Aside Pattern, 즉 Bypass Cache Mode입니다. 캐시와 데이터베이스 간의 데이터 불일치 문제를 최대한 해결하기 위해 제안되었습니다.
Cache-Aside Pattern읽기 요청 프로세스는 다음과 같습니다.
Cache-Aside Pattern쓰기 요청 프로세스는 다음과 같습니다.
업데이트할 때 먼저데이터베이스를 업데이트한 다음 캐시를 삭제하세요.
Read-Through/Write-Through(읽기-쓰기 침투)Read/Write Through 모드에서는 서버가 캐시를 주요 데이터 저장소로 사용합니다. 애플리케이션과 데이터베이스 캐시 간의 상호 작용은 추상 캐시 레이어를 통해 완성됩니다.
Read-ThroughRead-Through간단한 과정은 다음과 같습니다
Cache-Aside와 비슷합니까? 실제로 Read-Through는 Cache-Provider의 추가 계층입니다. 프로세스는 다음과 같습니다.
Read-Through는 실제로Cache-Aside 위에 있는 캡슐화 계층입니다. 그러면 프로그램 코드가 더욱 간결해지고 데이터 소스의 로드도 줄어듭니다.
Write-ThroughWrite-Through 모드에서는 쓰기 요청이 발생하면 캐시 추상화 계층도 데이터 소스 및 캐시된 데이터의 업데이트를 완료합니다.
Write Behind( 비동기 캐시 쓰기 )Write Behind는 Read-Through/Write-Through와 유사합니다. 는 캐시와 데이터베이스를 읽고 쓰는 역할을 합니다. 둘 사이에는 큰 차이가 있습니다. Cache Provider
Read/Write Through는 캐시와 데이터를 동기식으로 업데이트하는 반면, Write Behind는 데이터베이스를 직접 업데이트하지 않고 캐시만 업데이트하며, batch asynchronous를 통해 데이터베이스를 업데이트합니다.
일관성 요구 사항이 높은 시스템은 주의해서 사용해야 합니다. 그러나 빈번한 쓰기 시나리오에 적합합니다. MySQL의 InnoDB 버퍼 풀 메커니즘은 이 모드를 사용합니다.
캐시 운영시 캐시를 삭제해야 할까요, 아니면 업데이트를 해야 할까요? 일반적인 비즈니스 시나리오에서는Cache-Aside 모드를 사용합니다. 일부 친구들은 캐시 제외요청을 작성할 때 왜 캐시를 업데이트하는 대신 캐시를 삭제합니까?라고 물을 수 있습니다.
캐시를 운영할 때 캐시를 삭제해야 할까요, 아니면 업데이트를 해야 할까요? 먼저 예를 살펴보겠습니다.
이때, 캐시는 A의 데이터(기존 데이터)를 저장하고, 데이터베이스는 B의 데이터(새 데이터)를 저장하며, 데이터가 일관되지 않고 더티 데이터가 나타납니다. 캐시를 업데이트하는 대신 캐시를 삭제하면 이러한 더티 데이터 문제는 발생하지 않습니다.
캐시를 업데이트하는 것은 캐시를 삭제하는 것에 비해 두 가지 단점이 있습니다:
캐시 제외
캐시 모드에서 일부 친구들은 요청을 작성할 때 왜 Cache-Aside
缓存模式中,有些小伙伴还是有疑问,在写入请求的时候,为什么是先操作数据库呢?为什么不先操作缓存呢?
假设有A、B两个请求,请求A做更新操作,请求B做查询读取操作。
酱紫就有问题啦,缓存和数据库的数据不一致了。缓存保存的是老数据,数据库保存的是新数据。因此,Cache-Aside
데이터베이스를 먼저 작동
A와 B라는 두 가지 요청이 있다고 가정해 보겠습니다. A는 업데이트 작업을 수행하도록 요청하고 B는 쿼리 및 읽기 작업을 수행하도록 요청합니다.
스레드 A 쓰기 작업 시작, 첫 번째 단계는 캐시 삭제
이때 스레드 B가 읽기 작업을 시작하고 캐시 누락에 씁니다. Jiang Zi에 문제가 있습니다. 캐시와 데이터베이스의 데이터가 일치하지 않습니다. 캐시는 오래된 데이터를 저장하고, 데이터베이스는 새로운 데이터
를 저장합니다. 따라서Cache-Aside
캐싱 모드는 캐시를 먼저 작동하는 대신 데이터베이스를 먼저 작동하도록 선택합니다. 어떤 친구들은 데이터베이스를 먼저 운영할 필요 없이캐시 지연 이중 삭제
캐시를 먼저 삭제
한 다음 데이터베이스를 업데이트하세요. 잠깐(예: 1초) 잠자기 상태에서 캐시를 다시 삭제하세요.
잠깐 잠드는 데 보통 얼마나 걸리나요? 모두 1초인가요?
쓰기 요청을 도입하여 데이터베이스를 업데이트할 수 있습니다
몇 가지 이유로 캐시 삭제에 실패했습니다위 내용은 Redis와 MySQL 간의 이중 쓰기 일관성을 보장하는 방법은 무엇입니까? (메이투안 에르미안)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!