Memcache原理分析
来源:互联网 发布:linux内核裁剪步骤 编辑:程序博客网 时间:2024/06/05 12:00
转自 :http://www.cnblogs.com/jiajinyi/p/3527225.html
memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
Memcached使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和Apache不同,它更多的时候是面向稳定的持续连接的,所以它实际的并发能力是有限制的。在保守情况下memcached的最大同时连接数为200,这和Linux线程能力有关系,这个数值是可以调整的。关于libevent可以参考相关文档。 Memcached内存使用方式也和APC不同。APC是基于共享内存和MMAP的,memcachd有自己的内存分配算法和管理方式,它和共享内存没有关系,也没有共享内存的限制,通常情况下,每个memcached进程可以管理2GB的内存空间,如果需要更多的空间,可以增加进程数。
Memcached适合什么场合?在很多时候,memcached被滥用了,它不适用所有场合。Memcached是 “分布式”的内存对象缓存系统。因此,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,使用memcached根本不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用memcached是非常不划算的。
Memcached深度分析
Memcached用途:
(一)Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。
Memcached注意事项:
(一)memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所以memcached不能用来持久保存数据。
(二)memcached的实际瓶颈在于网络连接。很多人的错误理解,memcached的性能非常好,好到了内存和硬盘的对比程度,其实 memcached使用内存并不会得到成百上千的读写速度提高,因为他的瓶颈在于网络连接。它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。
(三)memcached之间不互相通信。
(四)memcached缺乏认证以及安全管制,所以memcached服务器应该放置在防火墙后。
范例
将纯粹使用数据库查询的程式码加上memcached支援是很简单的,假设这是原来的程式码:
//最原始的方法,直接从数据库获取数据
function get_foo (int userid) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
return result; //加上memcached的快取机制后:
function get_foo (int userid) {
result = memcached_fetch("userrow:" + userid);
if (!result) {
result = db_select("SELECT * FROM users WHERE userid = ?", userid);
memcached_add("userrow:" + userid, result);
}
return result;
上述的程式会先到memcached检查是否有userrow:userid的资料,如果有则直接传回结果,如果不存在时再去数据库查询,并将结果放到memcached内。
有一个问题,如果在memcached内已经有缓存数据时,而数据库的数据被更新后,上述的程式会抓到旧的数据,这是属于Cache coherency的问题。其中一种解决的方法是在更新数据库时,同时更新memcached内的数据:
//数据库更新数据的方法
function update_foo(int userid, string dbUpdateString) {
result = db_execute(dbUpdateString);
if (result) {
data = createUserDataFromDBString(dbUpdateString);
memcached_set("userrow:"+userid, data);
}
}
0 0
- Memcache原理分析
- memcache内存使用原理及监控分析
- Memcache分布式实现原理---Java_Memcache 源码分析
- memcache分布式部署的原理分析
- memcache内存使用原理及监控分析 --重在监控分析
- memcache原理
- memcache原理
- memcache原理
- memcache 原理
- Memcache原理
- memcache分析
- memcache分析
- [文档] Memcache 原理简介
- Memcache工作原理
- memcache的工作原理
- memcache 原理探究
- 深入理解Memcache原理
- Memcache工作原理总结
- iscroll4中滑动页面触发点击事件
- Java图形界面(GUI) 动态获取上传或下载文件的路径问题
- 大数据技术Hadoop面试题,看看你能答对多少?答案在后面
- 关于Android使用ActionBarDrawerToggle时导航图标没有动画效果
- 导出Javadoc文件时的编码问题
- Memcache原理分析
- Android 之 子线程中创建子线程以及子线程中toast 问题
- web开发-阿里云服务器自定义镜像设置和快照设置-学习笔记十一
- 关于ArcObjects图层编辑的读写编辑锁
- nginx+tomcat集群负载均衡
- web.xml加载自定义配置文件(.xml)
- FJHttp.request获取网络数据示例
- git 问题总结
- 【Java开发手册之编程规约(八)】注释规约