2017-08-10 60 views
0

我試圖設置一個mongo,節點和redis服務器,除Redis緩存外,其他所有的緩存似乎都加載了舊數據。node.js | Redis緩存加載舊數據

將Redis取出並使用pure Mongo返回正確的數據,如果再次單擊提交,它將加載之前提交的數據,因此我知道緩存和Mongo正在更新。

這是當前代碼我有更新使用蒙戈和Redis的用戶...

updateUserById: (newUser, redis, id, callback) => { 
    User.findByIdAndUpdate(id, { 
     $set: { 
      "firstName": newUser.firstName, 
      "lastName": newUser.lastName, 
      "email": newUser.email 
     } 
    }, (err, doc) => { 
     if (err) { throw new Error(err); } 
     else if (!doc) { callback('No user with that ID to update cache.') } 
     else { 
      redis.set(id, JSON.stringify(doc), (err) => { 
       console.log('Caching updated user ' + id); 
       if (err) { callback(err); throw new Error(err); } 
       else { 
        const result = { 
         "success": "true", 
         "message": "User updated successfully" 
        }; 

        callback(result); 
       } 
      }) 
     } 
    }); 
} 

這是Redis的和蒙戈回報用戶信息...

userById: async (redis, id, callback) => { 
    redis.get(id, async (err, reply) => { 
     if (err) { 
      callback(null); throw new Error(err); 
     } else if (reply) { 
      callback(JSON.parse(reply)); 
     } else { 
      await User.findById(id, (err, doc) => { 
       if (err || !doc) { callback(null); throw new Error(err); } 
       else { 
        redis.set(id, JSON.stringify(doc),() => { 
         callback(doc); 
        }) 
       } 
      }) 
     } 
    }) 
} 

我發現它與doc有關updateUserById

回答

0

這個問題在更新方法中。

當文檔被傳遞時,它傳遞的是舊數據而不是新數據。爲了解決這個問題,我使用了傳入方法的newUser。

下面是更新後的代碼:

updateUserById: (newUser, redis, id, callback) => { 
    User.findByIdAndUpdate(id, newUser, (err) => { 

     if (err) { throw new Error(err); } 
     else { 
      redis.set(id, JSON.stringify(newUser), (err) => { 
       console.log('Caching updated user ' + id); 
       if (err) { callback(err); throw new Error(err); } 
       else { 
        const result = { 
         "success": "true", 
         "message": "User updated successfully" 
        }; 

        callback(result); 
       } 
      }) 
     } 
    }); 
}