我正在尝试为我的项目构建“智能”缓存机制。关于项目的简短:它是社交网络,主要是阅读密集型,还有针对某些实时内容的nodejs的websocket连接 - 例如聊天。
这是构建这样的缓存机制的好方法吗? 使用这种方法我们得到了什么利弊?
function loadUser($id) {
$user_key = 'user_'.$id;
if( $user = Zend_Registry::get($user_key)) ) {
return $user;
}
elseif( $user = loadFromRedis($user_key) ) {
Zend_Registry::set($user_key, $user);
}
else {
$user = loadFromMysql($user_key)
setToRedis($user_key, $user);
setKeyExpire(30);
Zend_Registry::set($user_key, $user);
}
return $user;
}
答案 0 :(得分:0)
我认为这不是最好的方法,因为Zend增加了很多开销(如果你是缓存,那是因为你想要提升你的应用程序)。
在这个站点中有许多基准来解释Zend开销(以及与其他框架的比较):http://www.ruilog.com/blog/view/b6f0e42cf705.html
在我的代码中,我倾向于使用我自己的通用Model类,使用与其连接器相关的模型(MysqlModel,MongoModel,CassandraModel ...)扩展它,并使用与实体直接相关的类扩展这些类(UserModel,ArticleModel ,...)并在Model类中编写缓存处理代码,以在整个模型集中重用它。
基本方法:readCache,writeCache,deleteCache。您可以将远程缓存(如memcached或redis)与本地缓存(如xcache或apc)结合使用,以减少净开销。但我建议只有在某个标志为真时才使用本地缓存,而不是默认情况下。