memcache原理

memcache是一个免费开源的、高性能的、具备分布式内存对象的缓存系统,经过减轻数据库负载加速动态web应用,提升访问网站的相应速度。memcache将常常存取的数据以key-value的方式缓存在内存中。web

memcache和数据库的协做过程:算法

    一、客户端发送请求到memcache服务器上,memcache检查请求的数据是否存在memcache上,若是存在,直接将数据返回给客户端
数据库

    二、若是数据不在memcache上,memcache会去查询数据库,数据库会将数据返回给客户端,同时将数据缓存一份到memcache上
缓存

    三、每次数据库数据更新时会同时更新memcache中的数据,保持数据一致
bash

    四、当memcache的内存空间用完时,会使用LRU算法,替换掉最近最少使用的key/value。
服务器

memcache的工做过程架构

memcache是采用C/S架构,服务端启动服务守护进程,监听在指定的IP和端口上,一直处于等待客户端链接的状态。多个服务端能够协同工做,但各个服务器之间不通讯,也不共享任何信息,经过对客户端的设计,让memcache能支持大规模缓存。并发

数据是以key/value的方式保存在memcache的内存中,因此存取速度快,但在服务器重启后内存中的数据就会消失。tcp

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服务器时,客户端上有服务器列表信息,当客户端要存入数据时,客户端先根据必定的分布式算法肯定要将数据存入哪一个服务器上。当获取数据时,客户端根据相同的算法肯定数据所在的服务器,再到该服务器上获取数据。

优势:将不一样数据分散保存在不一样的服务器上,当一台服务器发生故障时,只是这台服务器上的数据没法访问,其余服务器上的数据不受影响

客户端上常见的分布式算法

    一、余数分布算法:先求得键的整数散列值,而后除以服务器台数,根据余数肯定数据存放在哪台服务器上。

    优势:计算简单,效率高

    缺点:当服务器增长或减小时,会致使全部缓存失效

    二、一致性散列算法:先算出memcache服务器节点的散列值,并将其分配到0到2^32的圆上,而后算出数据的键的散列值并映射到圆上,从数据映射的位置开始顺时针查找,将数据保存在查找到的第一个服务器上。

    优势:当服务器数量发生变化时,影响范围较小,能够最大限度地减小缓存的失效量。

memcache安装注意

    一、要先安装libevent

    二、将/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链接测试

相关文章
相关标签/搜索