在
的
)
中,是不能存储任意的数据的(只能是
查询结果)。而利用
(()'
,可以搭建出各种高效的缓存。如,可以执行多个独立的查询,构建出一个用
户对象(
&;
),然后将用户对象缓存到
(()'
中。而
)
是
语句
级别的,不可能做到这一点。在并发量小的业务需求,
)
会有所帮助,但随着网
站规模的增加,
)
的弊将大于利。
)
能够利用的内存容量受到
服务器实际空闲内存空间的限制。给数据库服
务器增加更多的内存来缓存数据,固然是很好的。但是,有了
(()'
,只要您有空闲
的内存,都可用来增加
(()'
集群规模,可以缓存更多的数据。
3. memcached
和
localcache
(
PHP APC
、
mmap
),有什么优缺点?
首先,
)
有许多与如上
< )=
相同的问题。
)
能够利用的内存容量
受到(单台)服务器空闲内存空间的限制。不过,
)
有一点比
(()'
和
)
都要好,是它不但可以存储任意的数据,而且没有网络存取的延迟。
)
的数据查询更快,考虑把
))((
的数据放在
)
中;如每个页面
都需要加载一些数量较少的数据,考虑放在
)'
。
)
缺少集体失效(
+'"
)的特性。在
(()'
集群中,删除或更新
一个
$
会让所有的观察者觉察到,可以使用此特性做防会话失效的机制。但在
)
中
只能通知所有的服务器刷新
)
(很慢,不具扩展性),或者仅仅依赖缓存超时失效
机制。
此外,
local cache
面临着严重的服务器物理实际内存限制,只能纵向扩展。
4. memcached
的
cache
机制
()'
主要的
)
机制是
#9
(最近最少用)算法
>
超时失效。
当客户存数据到
(()'
中,可以指定该数据在缓存中可以呆多久。如果
(()'
的内存不够,过期的
&
会优先被替换,接着就轮到最老的未被使用的
&
。
5. memcached
如何实现冗余机制?
不实现!
()'
应该是应用的缓存层。它的设计本身就不带有任何冗余机制。如果一个
(()'
节点失去了所有数据,可从数据源(比如数据库)再次获取到数据。此场景下,
缓存从数据库重新搂数,对数据库
89
和内存造成巨大压力,严重的会造成数据库宕机。
从而形成一系列连锁反应,造成整个系统崩溃。
注意,因为
Memcached
没有做数据持久化处理,数据失效引起的数据重新加载,会导致缓
存雪崩现象。为了防止此现象,通常处理途径为:
1.
加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免
失效时大量的并发请求落到底层存储系统上。
2.
简单方案为将缓存失效时间分散开;
3.
给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则
评论