Redis 캐 시 에 대한 3 대 문제 및 해결 방안
1.캐 시 관통
캐 시 관통 이란 캐 시 와 데이터베이스 에 없 는 데 이 터 를 가리 키 며,사용자 가 id 가-1 인 데이터 나 매우 큰 존재 하지 않 는 데 이 터 를 요청 하 는 것 을 말한다.해커 가 구멍 공격 을 이용 해 응용 데이터 베 이 스 를 무 너 뜨 릴 수도 있다.
1.일반적인 해결 방안
캐 시 관통 문제 에 대해 흔히 볼 수 있 는 해결 방안 은 다음 과 같은 세 가지 가 있다.
4.567917.인증 차단:인터페이스 층 을 검사 합 니 다.예 를 들 어 사용자 권한 을 감정 하고 ID 와 같은 필드 를 기본 적 인 검 사 를 합 니 다.예 를 들 어 id<=0 의 필드 를 직접 차단 합 니 다4.567917.캐 시 빈 데이터:데이터 베 이 스 를 조회 한 데이터 가 비어 있 을 때 도 이 데 이 터 를 캐 시 하지만 캐 시 의 유효성 은 정상 적 인 데이터 캐 시 에 영향 을 주지 않도록 짧게 설정 해 야 합 니 다
Copypublic Student getStudentsByID(Long id) {
// Redis
Student student = redisTemplate.opsForValue()
.get(String.valueOf(id));
if (student != null) {
return student;
}
// , Redis
student = studentDao.selectByStudentId(id);
if (student != null) {
redisTemplate.opsForValue()
.set(String.valueOf(id), student, 60, TimeUnit.MINUTES);
} else {
// ,
redisTemplate.opsForValue()
.set(String.valueOf(id), null, 60, TimeUnit.SECONDS);
}
return student;
}
부 릉 필 터 를 사용 합 니 다:부 릉 필 터 는 비교적 독특한 데이터 구조 로 일정한 오차 가 있 습 니 다.데이터 가 존재 하 는 것 을 지정 할 때 반드시 존재 하 는 것 은 아니 지만 데이터 가 존재 하지 않 는 다 고 지정 할 때 존재 하지 않 을 것 입 니 다.2.부 릉 필터
부 릉 필 터 는 비교적 특수 한 데이터 구조 로 HashMap 과 유사 합 니 다.업무 중 에 우 리 는 HashMap 을 사용 하여 하나의 값 이 존재 하 는 지 여 부 를 판단 할 수 있 습 니 다.O(1)시간 복잡 도 에서 결 과 를 되 돌 릴 수 있 고 효율 이 매우 높 지만 저장 용량 에 제한 을 받 습 니 다.만약 에 판단 해 야 할 값 이 억 단 계 를 초과 할 수 있다 면그럼 HashMap 이 차지 하 는 메모리 가 굉장 합 니 다.
블 룸 필터 가 이 문 제 를 해결 하 는 방안 은 간단 하 다.먼저 여러 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트
하나의 요소 가 존재 하 는 지 판단 할 때 이 값 해시 가 나 온 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트하지만 비트 비트 가 1 이 아니라면 이 키 는 존재 하지 않 을 것 이다.
메모:BloomFilter 는 삭제 작업 을 지원 하지 않 고 추가 작업 만 지원 합 니 다.이 점 은 쉽게 이해 할 수 있 습 니 다.데 이 터 를 삭제 하려 면 해당 하 는 bit 위 치 를 0 으로 해 야 하기 때 문 입 니 다.그러나 이 Key 에 대응 하 는 bit 위 치 는 다른 Key 도 대응 할 수 있 습 니 다.
3.캐 시 빈 데이터 와 부 릉 필터 의 비교
위 에서 이 두 가지 방안 에 대해 간단 한 소 개 를 했 습 니 다.캐 시 빈 데이터 와 부 릉 필 터 는 캐 시 투과 문 제 를 효과적으로 해결 할 수 있 지만 사용 장면 은 약간 다 릅 니 다.
4.567917.일부 악의 적 인 공격 조회 키 가 각각 다 르 고 수량 이 많 을 때 캐 시 빈 데 이 터 는 좋 은 해결 방안 이 아니다.모든 키 를 저장 해 야 하기 때문에 메모리 공간 이 높 습 니 다.그리고 이런 상황 에서 많은 key 는 한 번 만 사용 할 수 있 기 때문에 저장 하 는 것 은 의미 가 없다.그래서 이런 상황 에서 부 릉 필 터 를 사용 하 는 것 은 좋 은 선택 이다4.567917.빈 데이터 와 의 Key 수량 이 제한 되 어 있 고 Key 중복 요청 효율 이 높 은 장면 에서 빈 데 이 터 를 캐 시 하 는 방안 을 선택 할 수 있 습 니 다2.캐 시 뚫 기
캐 시 격 차 는 현재 핫 이 슈 데이터 저장 이 만 료 되 었 을 때 여러 스 레 드 가 동시에 핫 이 슈 데 이 터 를 방문 하 는 것 을 말한다.캐 시가 만 료 되 었 기 때문에 모든 동시 요청 은 데이터베이스 에 가서 데 이 터 를 조회 합 니 다.
해결 방안
4.567917.핫 이 슈 데 이 터 를 기한 이 지나 지 않 는 것 으로 설정 합 니 다4.567917.상호 배척 자물쇠 추가:상호 배척 자 물 쇠 는 데이터 베 이 스 를 조회 하 는 스 레 드 접근 을 제어 할 수 있 지만 이런 방안 은 시스템 의 스루풋 이 떨 어 지고 실제 상황 에 따라 사용 해 야 한다
Copypublic String get(key)
{
String value = redis.get(key);
if (value == null)
{
// // 3min , del ,
load db if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {
//
value = db.get(key);
redis.set(key, value, expire_secs);
redis.del(key_mutex);
}
else {
// load db ,
sleep(50);
get(key);
//
}
}
else {
return value;
}
}
3.캐 시 눈사태캐 시 눈사태 가 발생 하 는 몇 가지 상황 이 있 습 니 다.예 를 들 어 대량의 캐 시가 집중 되 거나 캐 시가 동시에 큰 범위 에서 효력 을 잃 고 데이터 베 이 스 를 방문 하 라 는 요청 이 많이 발생 하여 CPU 와 메모리 가 과부하 되 고 심지어 정지 되 었 습 니 다.
간단 한 눈사태 과정:
4
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
그래프 구조를 무상으로 취급할 수 없는 것은 싫기 때문에, redisgraph를 WSL2에 극치고 설치해 보았습니다.제목은 만우절이므로. 그렇다, 역시, 앞으로는 그래프 구조 데이터베이스라고 생각했다. 생각한 것은 몇 년 전인가. 전부터 Neo4j는 시험하고 있지만, 영업 분들로부터 상용 라이센스가 높다고 가르쳐 주었으므로, 전전...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.