erlang 캐시 뚫기 처리의 장점
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포인트 절감 효과
4. 요약
정보 전달 메커니즘을 합리적으로 이용하면 몇몇 고전적인 문제를 쉽게 해결할 수 있다.어쩌면 이것이 일종의 범례일지도 모른다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.