Memcached介绍

一、介绍

Memcached是一个开源的、支持高性能,高并发的分布式内存缓存系统。

Memcached的作用
传统场景中,多数Web应用都将数据保存到关系型数据库中(例如: MySQL),Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,关系型数据库的负担就会出现加重、响应缓慢、导致网站打开延迟等问题,影响用户体验。
这时就需要 Memcached软件出马了。使用 Memcached的主要目的是,通过在自身内存中缓存关系型数据库的査询结果,减少数据库被访问的次数,以提高动态Web应用的速度、提高网站架构的并发能力和可扩展性。
Memcached服务的运行原理是通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直接高并发访问,从而提升大规模网站集群中动态服务的并发访问能力。
生产场景的 Memcached服务一般被用来保存网站中经常被读取的对象或数据,就像我们的客户端浏览器也会把经常访问的网页缓存起来一样,通过内存缓存来存取对象或数据要比磁盘存取快很多,因为磁盘是机械的,因此,在当今的IT企业中,Memcached的应用范围很广泛。

常见的内存缓存服务软件如下:

二、Memcached在企业中的应用场景

1、作为数据库的查询数据缓存

(1)完整数据缓存

 (2)热点数据缓存

2、作为集群节点的session会话共享缓存

即把客户端用户请求多个前端应用服务集群产生的session会话信息。同一存储到一个Memcached缓存中。由于session会话数据是存储在内存中的,所以速度很快。

三、Memcached的特点与工作机制

1、Memcached的特点
Memcached作为高并发、高性能的缓存服务,具有如下特点:
(1)协议简单。 Memcached的协议实现很简单,采用的是基于文本行的协议,能通过telnet/nc等命令直接操作 Memcached服务存取数据。

(2)支持epol/ kqueue异步IO模型,使用 libevent作为事件处理通知机制。简单的说, libevent是一套利用C开发的程序库,它将BSD系统的 kqueue、 Linux系统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能。 Memcached就是利用这个 libevent库进行异步事件处理的。

(3)采用key/value键值数据类型。被缓存的数据以 key/value键值形式存在

(4)全内存缓存,效率高。 Memcached管理内存的方式非常高效,即全部的数据都存放于 Memcached服务事先分配好的内存中,无持久化存储的设计,和系统的物理内存一样,当重启系统或 Memcached服务时,Memcached内存中的数据就会丢失。
         如果希望重启后,数据依然能保留,那么就可以采用 Redis这样的持久性内存缓存系统,更多的开源软件见http://blog.51cto.com/oldboy/775056
         当内存中缓存的数据容量达到服务启动时设定的内存值时,就会自动使用LRU算法删除过期的缓存数据。也可以在存放数据时对存储的数据设置过期时间,这样过期后数据就自动被清除, Memcached服务本身不会监控数据过期,而是在访问的时候查看key的时间戳判断是否过期。

(5)可支持分布式集群。
         Memcahced没有像 MySQL那样的主从复制方式,分布式 Memcahced集群的不同服务器之间是互不通信的,每一个节点都独立存取数据,并且数据内容也不一样。通过对web应用端的程序设计或者通过支持hash算法的负载均衡软件,可以让 Memcached支持大规模海量分布式缓存集群应用。

2、Mecached工作原理与机制

(1)Mecached工作原理

    Memcached是一套类似C/S模式架构的软件,在服务器端启动Memcached服务守护进程,可以指定监听本地的P地址、端口号、并发访问连接数,以及分配了多少内存来处理客户端请求。
(2)Socket事件处理机制
    Memcached软件是由C语言来实现的,全部代码仅有2000多行,采用的是异步epoll/kqueue非阻塞I/o网络模型,其实现方式是基于异步的 libevent事件单进程、单线程模式。使用libevent作为事件通知机制,应用程序端通过指定服务器的IP地址及端口,就可以连接 Memcached服务进行通信
(3)数据存储机制
    需要被缓存的数据以 key/value键值对的形式保存在服务器端预分配的内存区中每个被缓存的数据都有唯一的标识key,操作 Memcached中的数据就是通过这个唯一标识的key进行的。缓存到 Memcached中的数据仅放置在 Memcached服务预分配的内存中,而非存储在 Memcached服务器所在的磁盘上,因此存取速度非常快。
    由于 Memcached服务自身没有对缓存的数据进行持久化存储的设计,因此,在服务器端的Memcached服务进程重启之后,存储在内存中的这些数据就会丢失。且当内存中缓存的数据容量达到启动时设定的内存值时,也会自动使用LRU算法删除过期的数据。
    开发 Memcached的初衷仅是通过内存缓存提升访问效率,并没有过多考虑数据的永久存储问题。因此,如果使用 Memcached作为缓存数据服务,要考虑数据丢失后带来的问题,例如:是否可以重新生成数据,还有,在高并发场合下缓存宕机或重启会不会导致大量请求直接到数据库,导致数据库无法承受,最终导致网站架构雪崩等.
(4)内存管理机制
    Memcached采用了如下机制
    采用sab内存分配机制
    采用LRU对象清除机制
    采用hash机制快速检索item。
(5)多线程处理机制
    多线程处理时采用的是 pthread(POSIX)线程模式。
    若要激活多线程,可在编译时指定:./configure--enable-threads
    锁机制不够完善。
    负载过重时,可以开启多线程(-t线程数为CPU核数)。

原文地址:https://www.cnblogs.com/Mr-Ding/p/9745435.html