|
|
게시됨 2019. 11. 19. 오전 9:55:04
|
|
|
|

Redis 캐시의 사용은 특히 데이터 쿼리에서 애플리케이션의 성능과 효율성을 크게 향상시킵니다. 하지만 동시에 몇 가지 문제도 있습니다. 그중 가장 중요한 문제는 데이터의 일관성으로, 이는 엄격히 해결할 수 없습니다. 데이터 일관성이 요구되면 캐싱을 사용할 수 없습니다.
다른 일반적인 문제로는 캐시 침투, 캐시 눈사태, 캐시 붕괴 등이 있습니다. 현재 업계에서 더 인기 있는 솔루션들도 있습니다. 이 글은 이 세 가지 문제를 더 완벽하게 해결하려는 것이 아니며, 업계에서 인기 있는 해결책을 전복하려는 것도 아닙니다. 대신 실제 코드 연산에서 이 세 가지 문제 현상을 보여드리겠습니다. 이렇게 하는 이유는 학문적 설명만으로는 머리에 매우 생생한 개념을 갖기 어렵기 때문이며, 실제 코드 시연을 통해 이 문제들에 대한 이해와 이해를 깊게 할 수 있기 때문입니다.
캐시 침투
캐시 침투는 데이터베이스에 존재하지 않는 데이터를 쿼리하는 것을 의미합니다. 키가 존재하지 않거나 만료되면 데이터베이스를 쿼리하고 쿼리한 객체를 캐시에 넣습니다. 데이터베이스 쿼리 객체가 비어 있으면 캐시되지 않은 것입니다.
코드 흐름
- 매개변수가 객체의 기본 키 ID를 전달합니다
- 키를 기반으로 캐시에서 객체를 가져옵니다
- 객체가 비어 있지 않으면 직접 반환됩니다
- 객체가 비어 있으면 데이터베이스 쿼리를 수행합니다
- 데이터베이스에서 쿼리한 객체가 비어 있지 않다면, 캐시에 넣으세요(만료 시간을 설정하세요). 이런 상황을 상상해 보세요. 전달된 파라미터가 -1이라면 어떻게 될까요? 이 -1은 존재해서는 안 되는 객체입니다. 데이터베이스는 매번 조회되고, 각 쿼리는 비어 있으며, 매번 캐시되지 않습니다. 악의적인 공격이 발생하면 이 취약점을 악용해 데이터베이스에 압박을 가하거나 심지어 과부하시킬 수 있습니다. UUID를 사용하더라도 존재하지 않는 키를 찾아 공격하는 것은 쉽습니다.
제 작업에서는 {코드 프로세스]의 5단계인 널 값을 캐싱하는 방법을 사용할 것입니다. 데이터베이스에서 쿼리된 객체가 비어 있으면 캐시에 넣지만, 설정된 캐시 만료 시간은 짧아야 합니다. 예를 들어 60초로 설정하는 식입니다.
캐시 눈사태
캐시 애벌랜치는 캐시 세트가 일정 기간 동안 만료되는 현상을 의미합니다.
눈사태의 이유 중 하나는, 예를 들어 이 글을 쓸 때 곧 열두 번째 날 0시가 되어 곧 급한 구매 물결이 일어날 것이라는 점입니다. 그리고 새벽 1시에 이 물품 보관소가 만료됩니다. 이 상품 배치에 대한 접근 조회는 데이터베이스에 속하며, 데이터베이스에서는 주기적인 압력 피크가 발생합니다.
샤오비안이 전자상거래 프로젝트를 할 때는 일반적으로 다양한 상품 카테고리를 채택하고 다른 주기를 캐시합니다. 같은 범주에 속한 상품에 무작위 요소가 더해집니다. 이렇게 하면 캐시 만료 시간을 최대한 분산시킬 수 있고, 인기 카테고리의 상품 캐시 시간은 더 길어지며, 인기 없는 카테고리의 캐시 시간은 짧아져 캐싱 서비스의 자원도 절약할 수 있습니다.
사실 중앙집중식 만료는 그리 치명적이지 않으며, 더 치명적인 캐시 눈사태는 캐시 서버의 노드가 다운되거나 연결이 끊기는 것입니다. 자연적으로 발생하는 캐시 눈사태는 일정 시간 내에 생성되어야 하므로 데이터베이스는 압력을 견딜 수 있고, 이 시점에서도 데이터베이스 역시 압력을 견딜 수 있습니다. 이것은 단지 데이터베이스에 가해지는 주기적인 압력에 불과합니다. 캐시 서비스 노드의 다운타임은 데이터베이스 서버에 예측 불가능한 부담을 주며, 이는 데이터베이스를 순식간에 압도할 가능성이 큽니다.
캐시 분해
캐시 붕괴란 매우 뜨거운 상태의 키를 의미하며, 지속적으로 큰 동시성을 유지하며, 이 시점에 접근하는 데 집중합니다. 이 키가 실패하면 연속적인 대규모 동시성이 캐시를 뚫고 데이터베이스를 직접 요청하는 것으로, 마치 장벽에 구멍을 뚫는 것과 같습니다.
샤오비안이 전자상거래 프로젝트를 할 때 이 제품을 "히트"로 만들었습니다.
사실 대부분의 경우, 이런 폭발적인 상황은 데이터베이스 서버에 압박적인 압력을 가하기가 어렵습니다. 이 정도 수준에 도달한 회사는 드물다. 따라서 실용적인 편집기는 캐시가 만료되지 않도록 주요 제품을 일찍 준비했습니다. 어떤 제품이 스스로 발효되어 히트를 만들어도, 유통기한이 지급되지 않도록 설정할 수 있습니다.
주요 경로는 단순하며, 뮤텍스 키 상호 거부 잠금장치는 거의 사용되지 않습니다.
|
이전의:MySql 8.0 보안 연결을 사용하거나, 서버의 RSA를 지정하거나...다음:외부 호스트 서비스에 접근하기 위한 도커 컨테이너
|