만료 정책이 무엇인지 인터뷰 시리즈 (14) 레디 스

(1) 유효 시간을 설정할

 

우리가 키를 설정하면, 당신은 만료 시간을 제공 할 수 있습니다, 예를 들어, 한 시간 만 살아남을 수있는이 키를 지정한다 만료 시간? 십분? 이것은 우리 스스로가 캐시 만료가 비효율적이된다 지정할 수 유용하다.

 

당신은 한 시간 만, 그 다음 후 1 시간 살아남을 수있는 주요 가정의 숫자를 설정 한 경우 레디 스 키의 배치를 삭제하는 방법은?

 

대답은 : + 불활성 주기적으로 삭제 삭제

 

은 레디 스 기본을 말한다 삭제 주기적으로 소위 것은 몇 가지의 무작위 표본에 100ms마다, 그것은 만료되었는지 여부를 확인하기 위해, 키의 만료 시간을 설정 삭제 만료되었습니다. 레디 스는 10 만 키를 넣어 가정, 당신의 검사에서, CPU 부하가 매우 높은 것, 레디 스 기본적으로 사망 한 후, 소비, 당신에게 모든 몇 백 밀리 초 만료 시간을 설정 100000 키를 확인했다 에 만료 키를 누릅니다. 성능에 재앙이기 때문에이 100ms로는, 만료 시간 간격을 설정되지 않은 모든 키를 통과 할 수 있습니다. 사실 키 레디 스의 일부는 무작위로 검사하고 삭제 100ms마다 선택됩니다.

 

그러나, 주기적으로 키를 삭제하는 문제는 그것을 zezheng 제거되지 않은 시간에 다시이 많이 발생할 수 있습니다? 그래서 불활성 삭제됩니다. 이것은 당신이 만료 시간이 만료 않는 설정 한 경우, 레디 스 키 있는지 확인합니다 당신은 키 시간을 얻을 수 있다는 것을 의미? 이번에는 삭제됩니다 만료 당신에게 대가로 아무것도 제공하지 않습니다.

 

그것은 제거 된 시간의 열쇠가 아니라이 키를 쿼리 할 때, 다시 확인 게으른 레디 스

 

위의 두 가지 방법을 결합하여 그 만료 된 키가 살해 될 것입니다 보장합니다.

 

매우 간단하고, 그 정기적으로 삭제되지 만료 된 키는 시스템이 키를 확인하지 않는 한 여전히 레디 스 삭제할, 그것의 메모리와 함께 복용, 메모리에 남아, 삭제, 말을하는 것입니다.

 

그러나 사실이 문제가 정기적으로 삭제 다시 키를 많이 놓친 경우에, 당신은 또한 삭제 불활성 가지 않았다, 다음 무슨 일이 일어날 것이다 조사 할 시간이 없다,있다? 만약 메모리에 만료 된 키의 많은 수의 축적, 메모리 블록 레디 스이 zezheng을 소진의 원인?

 

대답은 : 메모리 메커니즘에서 이동합니다.

 

(2) 메모리 중

 

메모리 풋 프린트 레디 스 너무 많은 시간,이 시간의 메모리가있을 경우, 우리는 다음과 같은 전략을 가지고 :

 

레디 스 (10) 창 키, 이제 전체, 레디 스 다섯 개 가지 키를 삭제해야

 

키는, 최근 일분 100 회 조회

키, 최근 십분 50 회 조회

키, 가까운 일시간 두 번 쿼리 1

 

1) noeviction : 메모리는 기록 된 새로운 데이터를 수용하기에 충분하지 않을 때, 새로운 기록 동작이 일반적으로 아무도없는 것을 불평, 그냥 무섭다

2)해서 AllKeys-LRU : 메모리 키 공간에 기록 된 새로운 데이터를 수용하기에 불충분 한 경우에, 키는 제거되고 가장 최근에 (사용이 가장 보편적이다)

3)해서 AllKeys 랜덤 : 메모리가 무작위 키를 제거 키 공간에 기록 된 새로운 데이터를 수용하기에 충분하지 않을 때, 이것은 왜해야 무작위, 확실히 가장 최근에 사용 된 핵심입니다, 사람들이 그것을 사용 일반적으로하지 않습니다 아 죽일

4) 휘발성 LRU는 : 새로운 데이터를 기록하기위한 충분한 메모리 키 만료 시간을 제공하는 공간에 수용되면, 키는 가장 최근에 (사용하는 제거 방법이 일반적으로 적절하지 않다)

5) 휘발성 랜덤 : 메모리는 새로운 데이터가 만료 시간에 제공되는 키 스페이스에 기록되는 수용하기 충분하지 않으면, 랜덤 키를 삭제

6) 휘발성 TTL : 새로운 데이터를 기록하기 위해 충분한 메모리 공간에 수용되면 키 만료 시간 제공은 만료 시간 이전 우선 키 삭제를 갖는다

 

온라인 바이두, 문제가 아, 동거

 

바이두 경우 일부 API 작업은 지식 항목은, 좋아, 어떤 블로그를 찾을 수 있습니다

 

일부 높은 수준의, 레디 스 단일 스레드 모델

 

아주 간단합니다, 당신은 너무 많은 데이터를 기록, 메모리는 최근에 사용 된 일부 데이터를 정리 어떤 조건은, 레디 스 LRU, 자동으로 부여 가득, 또는 트리거


(3) 당신은 왜 LRU 알고리즘을 손으로하지 않습니다?

 

나는 우리가 코딩 기술을 볼 수 있습니다, 참으로 이상 다섯 개 가지 장애물은, 이전의 질문에 대답하는 경우 일부 후보가 아주 좋은이기 때문에 사실,이 질문, 그래서 그를 LRU 알고리즘에 대해 쓸 수 있도록 때때로 않습니다

 

당신은 내가 현실을 생각하지 않는다, 그 코드가 너무 커서의 LRU 알고리즘의 가장 독창적 인 필기를 발견 할 수 있습니다

 

공용 클래스 LRUCache <K는, V>의 LinkedHashMap <K를, V> {확장
    
민간 최종 INT의 CACHE_SIZE;
 
    이것은 데이터의 최대 수에 전달됩니다 // 캐시 할 수 있습니다
    공공 LRUCache (INT의 CACHESIZE) {
        슈퍼 ((INT) Math.ceil (CACHESIZE / 0.75) + 1 0.75f ​​사실은) //이, 해시 맵의 초기 크기를 설정하는 정렬하려면의 LinkedHashMap 따라서 액세스를 허용하는 마지막 수단에 해당하지만, 최근에 나는 머리에 방문 꼬리에서 가장 오래된 방문
        CACHE_SIZE = CACHESIZE;
    }
 
    @보수
    보호 부울 위해서, removeEldestEntry (의 Map.Entry 장남) {
        크기 ()> CACHE_SIZE를 리턴 //이 수단은, 상기 데이터 맵은 캐시 시간 지정된 수보다 클 경우, 자동적으로 가장 오래된 데이터를 삭제한다는 것이다
    }
 
}


제가 위에서 당신에게 코드를 보여줄 것, 그것은 자신의 LRU를 만드는 처음부터 내 자신의 손으로 추구하지, 그 위의 코드를 작성하는 방법을 적어도 당신이 한 얘기이지만, 적어도 JDK를 달성하기 위해 기존의 데이터 구조를 사용하는 방법을 알고 LRU의 자바 버전

추천

출처www.cnblogs.com/xiufengchen/p/11258943.html