2013-08-19 52 views
1

我正在嘗試使用node.js爲不同客戶端的數據交付工具實現緩存系統。 這是一個http服務,我用express來處理請求。我的緩存系統需要支持三種情況:強制x客戶端等待node.js中客戶端y的回調的最佳實踐

案例1 - 沒有緩存: 程序通過給定的get方法接收數據。如果成功,則寫入緩存。

案例2 - 有一個緩存: 該程序接收緩存。

案例3 - 沒有緩存,但相同請求的get方法已被另一個客戶端調用並且當前正在處理中。 程序需要等到另一個請求通過get方法接收到它的數據並傳遞新寫入的緩存。

我用事件解決了「情況3」的問題。我爲每個客戶/請求組合註冊一個事件。但是註冊一個開放的事件並不是很優雅。另外使用隊列並不是最好的解決方案之一。

回答

1

IMO你不需要事件來實現你的緩存系統,但我沒有看到它如何實現沒有隊列。

這是我將如何實現緩存:

var cache = {}; 

function get(uri, cb) { 
    var key = uri; // id of the resource, you might want to strip some URI parts 
    var cacheEntry = cache[key]; 

    if (!cacheEntry) 
    cache[key] = cacheEntry = {}; 

    if (cacheEntry.value) { 
    // cache hit - return the cached value 
    return process.nextTick(function() { cb(null, cacheEntry.value }); 
    } 

    if (cacheEntry.waiting) { 
    // another request is in progress - queue the callback 
    cacheEntry.waiting.push(cb); 
    return; 
    } 

    // we are the first client asking for this value 
    cacheEntry.waiting = [cb]; 
    request.get(uri, handleResponse); 


    function handleResponse(err, resp, body) { 
    // process the response headers and body and save it to the cache 
    var content = body; 
    cacheEntry.value = content; 

    // fire callbacks waiting for the cached value 
    if (cacheEntry.waiting) { 
     var q = cacheEntry.waiting; 
     delete cacheEntry.waiting; 
     q.forEach(function(cb) { cb(null, content); }) 
    } 
    } 
}