MemcacheClient의 delete 결과에 따라 데이터베이스 레코드 삭제 여부를 결정하지 마십시오.

1746 단어 memcached
오늘 동료에게 CodeReview를 만들다가 문제가 하나 발견됐어요.코드는 대체로 다음과 같습니다.
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" );
			}

좋은 웹페이지 즐겨찾기