캐시는 아래의 사항들을 고려해야한다.
- 데이터 무결성 : 모든 유저에게 캐시가 동일한 데이터를 제공하는 방법
- 상호 배제 : 캐시가 업데이트되는 동안 다른 유저의 캐시 업데이트 요청이 들어왔을 경우에 대한 대처방법
=============================================================
아래의 코드는 위의 두가지를 만족시키기 위한 NodeJS 의 캐시를
Q 라이브러리의 Promise 객체를 이용하여 구현한 틀이되는 소스다.
Updating 이라는 flag 를 두고, 들어온 요청에 대해서는 Promise 객체를 생성하고 업데이트를 시작하거나
이미 생성된 Promise 객체를 리턴받아 뒤쪽 로직으로의 진행을 묶어둘 수 있다.
var Q = require('q');
module.exports = function () {
var updating = false;
var cacheDefer = null;
// some cache implementation
var cache = {};
var updateCache = function(){
// do something
// return promise
};
return {
refresh: function () {
if(!updating){
updating = true;
cacheDefer = Q.defer();
updateCache().then(function (refreshResult) {
if(refreshResult.isSuccess){
updating = false;
cacheDefer.resolve("Cache updated");
}else{
cacheDefer.reject("Error occurred");
}
}, cacheDefer.reject)
}
return cacheDefer.promise;
},
getData: function(){
// return data from cache
}
}
};
그럼 끝!





