MemcacheClient의 delete 결과에 따라 데이터베이스 레코드 삭제 여부를 결정하지 마십시오.
1746 단어 memcached
public boolean delete(String key){
boolean isCacheDeleted = memcachedClient.delete(key);
if(isCacheDeleted){
//delete stuffs from DB
}
//other stuffs
}
1. Memcache 클라이언트가 사용하는 gwhalin/Memcached-Java-Client v2.6.3:https://github.com/gwhalin/Memcached-Java-Client
2. 문제 분석:
해당 키가 캐시 서버에 없거나 memCachedClient.get (key) 반환값은null이고, delete () 방법의 반환값은false입니다.캐시가 만료되었거나 알고리즘에 의해 쫓겨나거나 고장난 캐시 데이터가 분실되었을 때 이런 상황이 발생할 때memCachedClient.get(key)이 null, memCachedClient로 돌아갑니다.delete(key)는false로 되돌아오기 때문에 상기 코드 블록의 delete stuffs from DB 지점을 실행할 수 없습니다.
따라서 delete의 반환값에 따라 DB의 데이터 삭제 여부를 결정하면 DB의 데이터가 일정 시간 내에 영원히 삭제되고 데이터의 일치성에 영향을 줄 수 있다.
3. 개선 사항:
delete를 하기 전에 get을 누르십시오.null이면 삭제가 성공했다고 생각됩니다.
public boolean delete(String key){
boolean isCacheDeleted = false;
Object obj = memcachedClient.delete(key);
if(obj == null){
isCacheDeleted = true;
}else{
isCacheDeleted = memcachedClient.delete(key);
}
if(isCacheDeleted){
//delete stuffs from DB
}
//other stuffs....
}
4.기타아직 gwhalin/Memcached-Java-Client v2를 보지 못했습니다.6.3의 원본 코드는 get이null이면 delete 반환값을 어떻게 처리하는지 다음에 업데이트합니다
to be continued....
>>>>>>>>>> 업데이트 <<<<<<<<<<<<<<<
MemcachedClient 소스 public boolean delete(String key, Integer hashCode, Date expiry) 섹션을 보고 서버에서 NOT FOUND를 반환할 때 아무런 처리도 하지 않고 false로 돌아갑니다.
else if ( NOTFOUND.equals( line ) ) {
if ( log.isInfoEnabled() )
log.info( "++++ deletion of key: " + key + " from cache failed as the key was not found" );
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
memcached 전면 분석 – 5memcached의 응용 및 호환 프로그램이 서버들은 이전에 데이터베이스 서버 등에 사용되었다.CPU 성능이 향상되고 메모리 가격이 하락함에 따라 우리는 데이터베이스 서버, 응용 서버 등을 성능이 더욱 강하고 메모리가 더 많은 서버로 적극적으로 바꾸었다.이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.