memcache的原理总结

时间:2022-04-04 08:12:39

1       Memcache是什么
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自治理这些HashTable。
   
为什么会有Memcache和memcached两种名称?
实在Memcache是这个项目的名称,而memcached是它服务器真个主程序文件名,
    
Memcache官方网站:http://www.danga.com/memcached,
2       Memcache工作原理
首 先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户真个连接操纵,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操纵均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。留意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
与 很多 cache 工具类似,Memcached 的原理并不复杂。它采用了C/S的模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached 的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。多个 Server 可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个 Server 只是对自己的数据进行治理。Client 端通过指定 Server 真个 ip 地址(通过域名应该也可以)。需要缓存的对象或数据是以 key->value 对的形式保存在Server端。key 的值通过 hash 进行转换,根据 hash 值把 value 传递到对应的具体的某个 Server 上。当需要获取对象数据时,也根据 key 进行。首先对 key 进行 hash,通过获得的值可以确定它被保存在了哪台 Server 上,然后再向该 Server 发出请求。Client 端只需要知道保存 hash(key) 的值在哪台服务器上就可以了。

        实在说到底,memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的进步网站的运行效率。


memcache 命中率

首先查看,

在linux或window上有telnet连接memcache,然后输入stats会出现下面的命令,这些状态的说明如下:

pid
memcache服务器的进程ID

uptime
服务器已经运行的秒数

time
服务器当前的unix时间戳

version
memcache版本

pointer_size
当前操作系统的指针大小(32位系统一般是32bit)

rusage_user
进程的累计用户时间

rusage_system
进程的累计系统时间

curr_items
服务器当前存储的items数量

total_items
从服务器启动以后存储的items总数量

bytes
当前服务器存储items占用的字节数

curr_connections
当前打开着的连接数

total_connections
从服务器启动以后曾经打开过的连接数

connection_structures
服务器分配的连接构造数

cmd_get
get命令(获取)总请求次数

cmd_set
set命令(保存)总请求次数

get_hits
总命中次数

get_misses
总未命中次数

evictions
为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)

bytes_read
总读取字节数(请求字节数)

bytes_written
总发送字节数(结果字节数)

limit_maxbytes
分配给memcache的内存大小(字节)

threads
当前线程数

一、缓存命中率 = get_hits/cmd_get * 100%
二、get_misses的数字加上get_hits应该等于cmd_get
三、total_items == cmd_set == get_misses,当可用最大内存用光时,memcached就会删掉一些内容,等式就会不成立

memcached/scripts/memcached-tool

Memcached的LRU算法

LRU是Least Recently Used最近最少使用算法。源于操作系统使用的一种算法,对于在内存中但最近又不用的数据块叫做LRU,操作系统会将那些属于LRU的数据移出内存,从而腾出空间来加载另外的数据。