分布式缓存memcache原理

一、简介

1、memcache是一个自由、开源、高性能,分布式内存对象缓存系统。

2、memcache是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用,API调用或者页面渲染的结果。

3、memcache简洁而强大。简洁设计便于快速开发,减轻开发难度,解决了大数据缓存的很多问题。他的API兼容大部分流行的开发语言。

4、使用目的:通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度、提高可扩展性。

二、工作原理

 二.1 、服务端缓存实现

(1)memcache特性

          

     

 普通缓存memcache缓存
特性缓存与特定的应用实例绑定,每个应用实例只能访问特定的缓存。实例独立于各个应用服务器实例运行,每个应用实例可以访问任意内存。
特点整个应用所能访问的缓存容量变小;缓存中存在数据冗余;缓存系统整体效率降低。整个应用所能访问的缓存容量变大;缓存中无数据冗余;缓存系统整理效率较高。

(2)缓存服务器结构的组织

当前服务器各个服务实例的负载情况

若;CPU使用率较高,空余内存较大

则:在其上可运行memcache实例

若:CPU使用率不高,空余内存较少

则:在其上可运行多个memcache实例

若:所使用服务器均无过多内存

则:需要使用一系列独立的服务器扩容

 

(3)数据的存取过程

                                         

              

客户端对缓存信息的访问客户端对缓存信息的存入

该客户端知道服务端缓存系统中所包含的所有memcache服务实例。在需要访问具有特定键值的数据时,该客户端内部会根据所需要读取的数据的键值,如”f00“,以及当前memecache缓存服务的配置来计算相应的哈希值,以决定到底是哪个memcache实例记录了用户所需要信息。在决定记录了所需要信息的memcache实例之后memcache客户端从配置中读取该memcache服务实例所在地址,并向该memcache实例发送数据访问请求,以从该实例中读取具有键值”f00“的信息。

 

     这些记录在服务端缓存中的数据是全局可见,也就是说,一旦在memcache服务端缓存中成功添加了一条新的纪录,那么其他使用该缓存服务的应用实例将同样可以访问该纪录。

                                             

(4)记录的组成及时间特性

         在memcache中,每条记录都有四部分组成:记录的键、有效期、一系列可选的标记以及表示记录内容的数据。

         由于记录的内容的数据中并不包含任何数据结构,因此我们在memcache中所记录的数据需要时经过序列化之后的表示。

  二.2、内存管理

     (1)内存管理模型

          memcache使用一种叫Slab的结构。在该分配算法中,内存将按照1MB的大小划分为页,而该页内存则会继续被分割为一系列具有相同大小的内存块。

             

     (2)数据的存储

                      

   

memcache使用这种方式来分配内存的好处在于:
(1)其可以降低由于记录的多次读写而导致的碎片化
(2)由于memcache时根据记录的大小选择需要插入到的块类型,因此为每个记录非配得块的大小常常大于该记录所实际需要的内存大小,从而造成内存的浪费。

一般情况下,根据业务要求,通过memcache的配置文件来指定各个块的大小,从而减小内存浪费

   (3)内存调优 {最小块、递增倍数、mamcache实例的个数}

              

(1)数据的大小

  (2) 各个数据的差异幅度

若:数据在通常情况下都很小

则:将最小块的大小调正得小一些

若:数据的大小变动不是很大

则:将块得大小得递增倍数设置的小一些

                                              

(4)内存清理机制

               memcache所使用的过期算法时延迟过期:当用户从memcache实例中读取数据时,其将首先通过配置中所设置的过期时间来决定该数据是否过期。如果是,那么在下一次写入数据却没有足够空间的时候,memcache会选择该过期数据所在的内存块作为新数据的目标地址。如果在写入时没有相应的记录被标为过期,则执行LRU算法,从而找到最久没有被使用的需要被替换的数据。

LRU算法:
   基于计算机操作系统基础理论的 “最近使用的页面数据会在未来一段时期内依然被使用,已经很久没有使用过的页面很有可能在未来较长时间内仍然不会被使用” 得来。每次从内存中找到最久未使用的数据然后置换出来,从而存入新的数据。
主要衡量指标:
   使用的时间。
附加指标:
   使用的次数。




LRU是在slab范围内的,而不是全局。也就是说,如果memcache中最常用的数据都存储在A中,但不同类型的B中有空余位置,但其中数据并不常用。当需要插入新的数据时,memcache没有足够内存再分配一个slab实例时,它会释放A,并将新数据存入其中。

  二.3、高可用实现原理

      memcache所使用的解决方法就是Consistent Hashing(一致性Hash),在该算法的帮助下,memcache实例数量的变化将只可能导致其中一部分键的哈希值发生改变。

      也就是说,若一个节点宕掉,剩下的数据会在其他节点上,只损失一部分数据。

        

三、memcache应用场景

 (1)web缓存

           

           当这个过程首次发生时,数据正常地从数据库或其他数据源加载,然后再存储到memcache内。当下一次访问此信息时,直接从memcache中取出,而不是从数据库加载,节省了时间和CPU循环。 

        

memcache中更新数据:
  更新数据库中分类的信息 --------》 找到memcache中的key值,删除 ------》 重新插入到你的memcache中。


memcache内的存储操作是原子的,所以信息的更新不会让客户机只获得部分数据;它们获取的胡总和是老版本或者是新版本。

(2)数据库缓存

四、memcache特点

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值