동시 환경, 데이터베이스 또는 캐시의 첫 번째 작업의 첫 번째 작업?

머리말

시간 쓰기 작업, 데이터베이스 또는 캐시 그것의 첫 번째 작업의 첫 번째 작업이있는 경우 분산 시스템에서, 캐시 및 데이터베이스는 존재 하는가? 먼저 문제가 어떻게 될 것인가에 대해 생각하고 아래로 본다. 지금은 몇 가지 옵션이 정교 나눕니다.

캐시 유지 관리 프로그램

쓰기 (스레드 A) 읽기 (스레드 B) 작업, 가정 캐시의 첫 번째 작업, 데이터베이스의 작업을 . 상기 흐름도 도시 태그 :

1) 스레드 A는 기록 동작을 개시하고, 첫 번째 단계 델 캐시

2) 스레드의 제 2 단계는 DB에 새로운 데이터를 기록

3) 스레드 B는 판독 동작, 캐쉬 미스를 개시하고,

4) 스레드 B가 DB의 최신 데이터를 얻을

5) B를 동시에 캐시 설정 요청

이보기, 아무것도 문제 . 우리는 두 번째 플로우 차트를 보면, 다음과 같은 :

1) 스레드 A는 기록 동작을 개시하고, 첫 번째 단계 델 캐시

2)이 때, 스레드 B는 읽기 작업, 캐시 미스를 시작합니다

3) 스레드 B는 DB를 읽기 이전 데이터의 판독을 계속

4) 이전 데이터 캐시에 다음

5) 스레드는 최신 데이터를 기록

OK, 지앙 닫아은 문제가 캐시에 이전 데이터는 각각의 데이터가 오래된 친구 읽고, 데이터 캐시 및 데이터베이스 데이터 불일치 .

캐시 유지 관리 계획 II

쓰기 작업을 두 번 캐시의 첫 번째 작업, 데이터베이스의 작업을 .

1) 스레드 A는 기록 동작, 캐쉬 설정하는 첫 번째 단계를 개시

2) 스레드의 제 2 단계는 DB에 새로운 데이터를 기록

3) 스레드 B가 초기화 기록 동작 세트 캐시

4) 단계 B 스레드 DB에 새로운 데이터를 기록

이 뷰는,도 문제 없다. 하지만 때때로 우리는 다음과 같은 두 번째 플로우 차트를 보면, 역화 수 있습니다 :

1) 스레드 A는 기록 동작, 캐쉬 설정하는 첫 번째 단계를 개시

2) B 스레드가 기록 동작을 개시 첫번째 단계 setcache

3) 데이터베이스 DB B로 스레드

4) 스레드는 데이터베이스 DB에 기록

실행 한 후, 데이터 B의 작업 후, 캐시에 저장된 데이터 데이터베이스 동작 일관성 데이터 캐시 데이터베이스 .

캐시 유지 보수 프로그램 세

기입 (스레드 A) 읽기 (스레드 B) 작업, 데이터베이스의 첫 번째 작업 한 다음 캐시를 운영 .

1) 스레드 A는 기록 동작을 개시하고, 첫 번째 단계는 DB 쓰기

2) 제 2 단계 델 캐시 스레드

3) 스레드 B는 판독 동작, 캐쉬 미스를 개시

4) 스레드 B가 DB의 최신 데이터를 얻을

5) 스레드 B를 동시에 캐시 세트

이 프로그램은 명백한 동시성 문제 없다 , 그러나 가능한 2 단계 캐시를 삭제하는 데 실패 확률이 상대적으로 적은 있지만, 옵션 1과 옵션 2보다 더 일상적인 일이 옵션 III의 사용이다.

요약 비교에서, 우리는 일반적으로 프로그램 세 가지를 사용하지만, 단점에게 그것을 해결하기 위해 세 가지 완벽한 전체를 프로그램 할 수있는 방법은 없습니다?

유지 보수 캐시 옵션 IV

이 프로그램 세 가지 개선 프로그램, 우리는, 우리는 플로우 차트를 보면 데이터베이스 다음 캐시 작업을 작동 처음이다 :

데이터베이스에 의해 바이너리 로그가 하는 키 제거 비동기 수 MySQL의에 예를 들어, 알리의 운하 바이너리 로그의 로그 수집을 사용 MQ 대기열로 전송됩니다 내부, 후 처리하는 ACK 메커니즘에 의해 확인 일관성을 보장하기 위해, 데이터 캐시를 캐시 삭제,이 소식입니다.

그러나 다음이 가 마스터 - 슬레이브 데이터베이스 인 경우 문제는 ?

캐시 유지 보수 프로그램 오

DB를에서 주요 문제 : 마스터 DB의 경우에서 동기화 지연 시간이있는 동안, 동기화 요청이왔다 전에 대기 데이터베이스에 캐시 데이터를 삭제 한 후, 때문에 백업 데이터베이스에서 더티 데이터를 읽어 , 그것을 어떻게 해결? 해결 플로우 차트는 다음과 같습니다 :

캐시 유지 보수 요약

캐시와 데이터베이스가 존재하는 경우 시간 쓰기 조작이있는 경우, 분산 시스템에서, 정리해 데이터베이스의 첫 번째 작업 한 다음 캐시를 운영 . 다음과 같습니다 :

이 있는지 여부 데이터는 (1) 캐시 읽기

(2) 캐시에있는 경우 해당 데이터 값하고 Return

캐시에 데이터가없는 경우 (3), 캐시 키 -> 값, 다음 반환에 데이터베이스에서 관련 데이터를 읽어

(4) 데이터를 업데이트하면 데이터가 먼저 업데이트 한 다음 캐시를 삭제한다

(5) 바이너리 로그 삭제 비동기 사용 캐시 삭제 네번째 단계의 성공을 보장하기 위해서

(6) 마스터 - 슬레이브 데이터베이스의 경우, 라이브러리에서 촬영 binglog

이 라이브러리에서 수집해야하는 각 바이너리 로그에서 다중 마스터 인 경우 그냥 캐시 (7)를 삭제 한 다음 최종 소비자가 바이너리 로그 데이터를 최종 수신

개인 공공 번호

우려에, 우리가 함께 연구 할 것이다 환영, 카자흐스탄에 대해 설명합니다.

추천

출처juejin.im/post/5d4a3196f265da03ab423727