首页 > 代码库 > memcache原理
memcache原理
memcache是一个免费开源的、高性能的、具有分布式内存对象的缓存系统,通过减轻数据库负载加速动态web应用,提高访问网站的相应速度。memcache将经常存取的数据以key-value的方式缓存在内存中。
memcache和数据库的协作过程:
1、客户端发送请求到memcache服务器上,memcache检查请求的数据是否存在memcache上,如果存在,直接将数据返回给客户端
2、如果数据不在memcache上,memcache会去查询数据库,数据库会将数据返回给客户端,同时将数据缓存一份到memcache上
3、每次数据库数据更新时会同时更新memcache中的数据,保持数据一致
4、当memcache的内存空间用完时,会使用LRU算法,替换掉最近最少使用的key/value。
memcache的工作过程
memcache是采用C/S架构,服务端启动服务守护进程,监听在指定的IP和端口上,一直处于等待客户端连接的状态。多个服务端可以协同工作,但各个服务器之间不通信,也不共享任何信息,通过对客户端的设计,让memcache能支持大规模缓存。
数据是以key/value的方式保存在memcache的内存中,所以存取速度快,但在服务器重启后内存中的数据就会消失。
memcache的内存分配和管理
memcache使用slab allocation机制来分配和管理内存。按照预先规定的大小,将分配给memcache的内存分割成不同长度的内存块组,其中长度相同的为一组,这些内存块不会被释放。
优点:可以重复利用
缺点:可能会造成内存浪费,如将一个100字节的数据存入一个200字节长度的内存块时,会有100字节内存被浪费掉
解决办法:在启动memcache时指定“-f”选项,控制不同内存块组之间的长度梯度,默认为1.25。
memcache的删除机制
在向memcache中存数据时,可以指定数据的过期时间,当数据过期时,客户端不能通过key取出它的值,其存储空间将被重新使用。但memcache不会监控存入的数据是否过期,而是在获取key值时检查其是否过期,采用这样的策略不会在过期检测上浪费cpu资源。
memcache在分配空间时,会优先使用已经过期的key/value空间,但内存空间被占满时,memcache会使用LRU算法来分配空间,删除最近最少使用的数据,将空间分配给新的数据。如果不想使用LRU算法,可以在启动memcache时使用‘-M’参数,这样当内存耗尽时,会返回一个报错信息。
多memcache服务器协同工作
有多个memcache服务器时,客户端上有服务器列表信息,当客户端要存入数据时,客户端先根据一定的分布式算法确定要将数据存入哪个服务器上。当获取数据时,客户端根据相同的算法确定数据所在的服务器,再到该服务器上获取数据。
优点:将不同数据分散保存在不同的服务器上,当一台服务器发生故障时,只是这台服务器上的数据无法访问,其他服务器上的数据不受影响
客户端上常见的分布式算法
1、余数分布算法:先求得键的整数散列值,然后除以服务器台数,根据余数确定数据存放在哪台服务器上。
优点:计算简单,效率高
缺点:当服务器增加或减少时,会导致所有缓存失效
2、一致性散列算法:先算出memcache服务器节点的散列值,并将其分配到0到2^32的圆上,然后算出数据的键的散列值并映射到圆上,从数据映射的位置开始顺时针查找,将数据保存在查找到的第一个服务器上。
优点:当服务器数量发生变化时,影响范围较小,可以最大限度地减少缓存的失效量。
memcache安装注意:
1、要先安装libevent
2、将/usr/local/lib加入到/etc/ld.so.conf中
[root@lzs ~]#echo "/usr/local/lib" >> /etc/ld.so.conf [root@lzs ~]#ldconfig
启动memcache
/usr/local/bin/memcached -m 20m -p 11211 -d -u root -P /var/run/memcached.pid -c 1024
-m | 指定分配给memcache的内存大小 |
-p | 指定memcache监听的tcp端口(默认11211) |
-d | 作为守护进程在后台运行 |
-u | 指定运行memcache的用户 |
-P | 指定pid文件 |
-c | 指定memcache最大并发连接的数量(默认1024) |
启动后可以使用telnet连接测试
本文出自 “90后” 博客,请务必保留此出处http://lzs66.blog.51cto.com/9607068/1859818
memcache原理