해결책은 다음과 같습니다. 1. 캐시 침투, 빈 데이터를 캐시하고 Bloom 필터를 사용할 수도 있습니다. 2. 캐시 눈사태, 만료되지 않도록 해당 핫스팟 키를 설정하고, 여러 캐시를 결합하고, 타사 Redis를 구매할 수도 있습니다. 만료 시간에 시차를 두어 만료 시간을 무작위로 생성할 수 있습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, Redis 버전 5.0.10, DELL G3 컴퓨터.
Redis 캐시 침투 및 솔루션
1. 캐시 침투
1. 사용자가 쿼리한 키가 Redis에 존재하지 않고, 해당 ID가 데이터베이스에 존재하지 않는 경우 불법 사용자의 공격을 받게 됩니다. 많은 수의 요청이 db에 직접 적중되어 가동 중지 시간이 발생하고 이로 인해 전체 시스템에 영향을 미치는 현상을 캐시 침투라고 합니다.
2. 해결 방법 1: 빈 문자열, 빈 개체, 빈 배열 또는 목록과 같은 빈 데이터를 캐시합니다. 코드는 다음과 같습니다
if (list != null && list.size() > 0) { redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list)); } else { redisOperator.set("subCat:" + rootCatId, JsonUtils.objectToJson(list), 5*60); }
3. 해결 방법 2: Bloom 필터
Bloom 필터: 요소가 있는지 확인합니다. 아래 그림과 같이 바이너리를 사용하여 상대적으로 작은 메모리를 차지하며, 0은 존재하지 않음을 나타내고, 값이 저장될 때 쿼리 효율성이 매우 빠릅니다. . Bloom 필터 세트의 특정 위치에 해당 값을 저장합니다. 특정 위치에 키가 여러 개 있을 수 있습니다. 존재하지 않는 키 값이 전달되면 해당 세트와 일치합니다. null을 반환합니다
단점: 1. Bloom 배열에 키가 없는 경우 오판단 비율이 1%이지만, 이러한 오판단 비율로 인해 특정 상황에서는 키가 존재하는 것으로 판단됩니다. 오탐률이 낮을수록 배열이 짧을수록 오탐률이 높아집니다
2. 키 값을 삭제하려고 하면 데이터베이스와 Redis의 콘텐츠가 삭제되지만 삭제할 수는 없습니다. Bloom 배열에는 배열의 특정 위치에 한 쌍의 키가 있기 때문입니다. 이를 삭제하려면 1을 0으로 변경하지만 모든 키 값은 삭제됩니다
3. 추가 A 컬렉션을 유지해야 하기 때문에 코드 복잡성도 증가합니다. Redis 클러스터를 사용할 때 Bloom 필터는 redis
와 함께 사용해야 합니다. 2. Redis 캐시 눈사태
1. 대량으로 캐시에 실패하게 되면 이 사용에는 많은 요청이 들어오지만 Redis의 모든 키가 유효하지 않기 때문에 모든 요청이 db로 전송되어 다운타임이 발생합니다
2.
해당 핫스팟 키가 만료되지 않도록 설정여러 캐시 조합, 예: 요청이 들어오면 지금 redis를 요청할 수 있으며 redis에 존재하지 않으면 다시 시도하세요. 그렇지 않은 경우 db를 요청하세요
위 내용은 Redis Avalanche 및 침투에 대한 솔루션은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!