什么是MemCache
MemCache是一套分布式的高速缓存系统,目前被许多网站使用以提高网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。
MemCache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单地说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。其本质上就是一个内存key-value数据库,但是不支持数据库的持久化,服务器关闭之后数据全部丢失。
MemCache工作流程
MemCache的工作流程如下:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现)。
每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
MemCache把数据把数据全部存在内存中,因为内存读取速度更快。
MemCache知识点
- memcached是键值一一对应的。
- memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分开多个端口开启多个memcached进程。
- 最大30天的数据过期时间,设置为永久的也会在这个时间过期。
- 最大键长为250字节,默认是128字节。
- 单个item最大数据是1MB,超过1MB数据不予存储。
- memcached分服务端和客户端,可以配置多个服务端和客户端,应用于分布式的服务非常广泛。
MemCache常用命令
- Memcache::set:保存数据到Memcache服务器上。
- Memcache::get:提取一个保存在Memcache服务器上的数据。
- Memcache::replace:替换一个已经存在Memcache服务器上的项目(功能类似Memcache::set)。
- Memcache::delete:从Memcache服务器上删除一个保存的项目。
- Memcache::flush:刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目)。
MemCache和Redis的区别
Redis是一个开源的key-value存储系统。与memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。
它们区别如下:
- Redis只是用单核,而MemCache可以使用多核。
- Redis有部分存在硬盘上,这样能保证数据的持久性,支持数据的持久化;而MemCache把数据全部存在内存中,断电后会挂掉,数据不能超过内存大小。
- Redis在数据支持上要比MemCache多得多,Redis不仅仅支持简单的k/v类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
总结:有持久化需求或者对数据结构和处理有高级要求的应用,选择Redis;其他简单的key/value存储,选择MemCache。
使用MemCache作为缓存有什么优点
1、使用MemCache之前,每个服务器的缓存是分开的,总的容量等于单个服务器的缓存容量,还要分出精力去维护所有服务器上缓存的数据,让它们保持一致。
2、 使用MemCache之后,把每个使用了缓存的服务器称作结点,MemCache则是把这些节点组成一个节点池。
- 容量增大,总的容量是所有服务器缓存容量的总和。
- 一个指定的数据将在同一个节点上进行读写,不需要保持节点间的数据一致。
MemCache的访问模型
MemCache一次写缓存的过程:
- service方法里面传入需要写缓存的数据并规定key。
- 客户端将key传到内部的路由算法模块。
- 得到key对应的HashCode。
- 路由算法根据Key和MemCache集群服务器列表得到一台服务器编号。
- 由服务器编号得到MemCache的IP地址和端口号。
- 客户端通过通信模块和指定编号的服务器通信,将数据写入该服务器。
MemCache读缓存和写缓存的过程差不多。
从图中我们也可以知道:
- 可以在同一个服务器上分出多个端口作为一个memcached节点,如图中服务器都是10.0.0.0,这台服务器分出了91000、91001和91002端口作为memcached节点;
- 图中分为应用程序服务器和memcache服务器,也就是说,我们可以专门准备一个服务器,不装应用程序,只作为memcache服务器使用。
MemCache实现原理
首先要理解下面一些概念:
- MemCache的数据是存放在内存中的;
- 这里面涉及4个概念:slab_class,slab,page,chunk;
- MemCache将内存分为一组slab,每个slab下面又有若干个page,每个page大小都是固定的1M;
- 每个page里面包含一组chunk,chunk是真正存放数据的地方,同一个slab里面的chunk大小是固定的;
- 有相同大小chunk的slab被组织在一起,被称为slab_class
详细的过程:
1)MemCache中的value过来存放的地方是由value的大小决定的,value总会被存放到与chunk大小最接近的一个slab中;
2)比如slab[1]的chunk大小为80字节,slab[2]的chunk大小为100字节,slab[3]的chunk大小为128字节(相邻slab内的chunk基本以1.25为比例进行增长,MemCache启动时可以用-f指定这个比例),那么过来一个88字节的value,这个value将被放到2号slab中;
3)放slab的时候,首先slab要申请内存,申请内存是以page为单位的,所以在放入第一个数据的时候,无论大小为多少,都会有1M大小的page被分配给该slab。
4)申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk数组,最后从这个chunk数组中选择一个用于存储数据。
常见问题
【问】 memcache和memcached的区别?
memcache是项目的名称,memcached是memcache服务端可执行文件的名称。
【问】 memcache无可用连接?
解决思路:
- 确认服务器上的memcached服务有没有打开——>服务器用telnet看能不能连上memcached
- 本地用telnet连接服务器的memcached
- 重启服务器
网友评论