美文网首页
MemCache教程(1)——MemCache介绍

MemCache教程(1)——MemCache介绍

作者: 不知名的蛋挞 | 来源:发表于2018-11-18 10:32 被阅读17次

    什么是MemCache

    MemCache是一套分布式的高速缓存系统,目前被许多网站使用以提高网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。

    MemCache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单地说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。其本质上就是一个内存key-value数据库,但是不支持数据库的持久化,服务器关闭之后数据全部丢失。

    MemCache工作流程

    MemCache的工作流程如下:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现)。

    每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
    MemCache把数据把数据全部存在内存中,因为内存读取速度更快。

    MemCache知识点

    1. memcached是键值一一对应的。
    2. memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分开多个端口开启多个memcached进程。
    3. 最大30天的数据过期时间,设置为永久的也会在这个时间过期。
    4. 最大键长为250字节,默认是128字节。
    5. 单个item最大数据是1MB,超过1MB数据不予存储。
    6. 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一次写缓存的过程:

    1. service方法里面传入需要写缓存的数据并规定key。
    2. 客户端将key传到内部的路由算法模块。
    3. 得到key对应的HashCode。
    4. 路由算法根据Key和MemCache集群服务器列表得到一台服务器编号。
    5. 由服务器编号得到MemCache的IP地址和端口号。
    6. 客户端通过通信模块和指定编号的服务器通信,将数据写入该服务器。

    MemCache读缓存和写缓存的过程差不多。

    从图中我们也可以知道:

    • 可以在同一个服务器上分出多个端口作为一个memcached节点,如图中服务器都是10.0.0.0,这台服务器分出了91000、91001和91002端口作为memcached节点;
    • 图中分为应用程序服务器和memcache服务器,也就是说,我们可以专门准备一个服务器,不装应用程序,只作为memcache服务器使用。

    MemCache实现原理

    首先要理解下面一些概念:

    1. MemCache的数据是存放在内存中的;
    2. 这里面涉及4个概念:slab_class,slab,page,chunk;
    3. MemCache将内存分为一组slab,每个slab下面又有若干个page,每个page大小都是固定的1M;
    4. 每个page里面包含一组chunk,chunk是真正存放数据的地方,同一个slab里面的chunk大小是固定的;
    5. 有相同大小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无可用连接?

    解决思路:

    1. 确认服务器上的memcached服务有没有打开——>服务器用telnet看能不能连上memcached
    2. 本地用telnet连接服务器的memcached
    3. 重启服务器

    相关文章

      网友评论

          本文标题:MemCache教程(1)——MemCache介绍

          本文链接:https://www.haomeiwen.com/subject/atzifqtx.html