MemCache教程(1)——MemCache介绍

2018-11-18  本文已影响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和Redis的区别

Redis是一个开源的key-value存储系统。与memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。

它们区别如下:

总结:有持久化需求或者对数据结构和处理有高级要求的应用,选择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读缓存和写缓存的过程差不多。

从图中我们也可以知道:

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. 重启服务器
上一篇下一篇

猜你喜欢

热点阅读