erlang 캐시 뚫기 처리의 장점

2032 단어
캐시 관통은 데이터베이스에 존재하지 않는 데이터를 조회하는 것을 가리킨다.정상적인 캐시 사용 절차는 대체로 데이터 조회가 먼저 캐시 조회를 하고 키가 존재하지 않거나 키가 기한이 지났을 때 데이터베이스에 대한 조회를 하고 조회된 대상을 캐시에 넣는 것이다.데이터베이스 조회 대상이 비어 있으면 캐시에 넣지 않습니다.

1. 캐시가 뚫은 위조 코드

Value find(Key){
    RedisKey = RedisKeyFunc(Key);
    V = redisGet(RedisKey);
    if (V != null){
        //  
        return V;
    }
    V = dbLookUp(Key);
    if (v != null){
       redisPut(RedisKey,V);
    }
    //  , , 
    return V;
}



2. 전통적인 캐시 뚫기 처리 방안

redis 전역 자물쇠 + 자전거 자물쇠 사용
이렇게 하면 이 문제를 해결할 수 있지만, 가져오는 부정적인 영향은 헛걸음 CPU이다
위조 코드:
Value find(Key){
    RedisKey = RedisKeyFunc(Key);
    V = redisGet(RedisKey);
    if (V != null){
        //  
        return V;
    }
    
    RedisLockKey = RedisLockKeyFunc(Key)
    while(true){
        if(redisLock(RedisLockKey)){
            V = redisGet(RedisKey);
            if( V == null){
               //  
               V = dbLookUp(Key);
               redisSet(RedisKey,V);
            }
            redisUnLock(RedisLockKey);
            return V
        }
        //  CPU
    }
}

3.erlang actor의 모형

actor의 메시지 전달 메커니즘을 이용하여 자전거 자물쇠(공중달리기)를 가볍게 피한다.
위조 코드:

handle_call({find,Key},From,#{req=Req}=State) ->
  case lists:keyfind(Key,1, Req) of
   {_,L} ->
     Req2 = lists:keyreplace(Key,1,Req,{Key,[From|L]}),
     {noreply,State#state{req = Req2};
   false ->
     Actor = self(),
     %  proc , 
     erlang:spawn(fun()-> V = lookup(Key), Actor ! {Key,V}), 
     Req2 = [{Key,[From]}|Req],
     {noreply,State#state{req = Req2};


handle_info({Key,V},#state{req = Req})->
  case lists:keyfind(Key,1, Req) of
   {_,L} ->
     %  ,CPU 
     [ gen_server:reply(From,V) ||  From
     {noreply,State#state{}};

2포인트 절감 효과
  • 자전거 잠금으로 인한 CPU 사용량
  • 분포식 자물쇠를 획득한 후에 캐시를 검사하고 분포식 자물쇠를 방출하며 2회 IO 소모
  • 4. 요약


    정보 전달 메커니즘을 합리적으로 이용하면 몇몇 고전적인 문제를 쉽게 해결할 수 있다.어쩌면 이것이 일종의 범례일지도 모른다.

    좋은 웹페이지 즐겨찾기