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