首页 > 代码库 > 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原理