您的位置:首页 > 数据库 > Memcache

Memcached简介

2020-02-17 09:57 645 查看

免费和开源、高性能、分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态web应用程序。

Memcached是一个内存中的键值存储,用于存储来自数据库调用、API调用或页面呈现结果的小块任意数据(字符串、对象)。

Memcached简单而强大。其简单的设计促进了快速部署、易于开发,并解决了大型数据缓存面临的许多问题。它的API可用于大多数流行的语言。

为何要用Memcached?

设计web应用的时候,高并发与海量数据的处理一直是比较棘手的问题,传统的数据库都是关系型数据库,本身处理数据的过程就比较耗时,如果执行的sql和事务机制设计的不合理,一旦访问量激增,达到万级以上,那时候应用的处理性能就会直线下降,这期间如果跟其他系统还有交互,那整个应用体系都将受灾,甚至会出现雪崩。

这时候你就发现使用memcache能很好的解决这个问题。

我们可以把数据查出来保存到Memcache中,这样可以降低访问数据库的频率,从而减少数据库的负担,web应用的响应速度和可扩展性也会大大提升。

Memcached的工作就是通过一台机器将我们常用到的数据和文件放入一张hash表中,供应用程序使用,Memcached是一种内存型数据库,从而可以大大提升网站的运行效率。

Memcached的内存分配机制:

之前的内存分配大多数都是采用malloc和free来进行的,这样的方式很容易导致大量的内存碎片,时间久了就会影响内存管理器的运行。Memcached采用的是slab allocation机制分配和管理内存。Slab Allocation的基本原理就是按照预先规定的大小,将分配的内存分割成特定长度的块,并把尺寸相同的块分成组(chunk的集合),如果需要申请内存时,memcached会划分出一个新的内存页并分配给需要的slab区域。一旦被分配在重启前不会被回收或者重新分配,这样就解决了内存碎片问题。参考一下网上的图:

Slab Allocation的缺点:

虽然Slab Allocation机制确实解决了内存碎片的问题,不过通过上图可以发现,slab1的chunk为88字节,slab2为112字节,我们分配内存都是采用固定长度,这样就会出现不能充分利用分配的内存。比如:把100字节的数据放到128字节的chunk中,那就会导致28字节的浪费

memcached在启动时指定 Growth Factor因子(通过-f选项), 就可以在某种程度上控制slab之间的差异。默认值为1.25。

分配的过程:

首先初始化若干个Slab,为每个Slab分配一个Page的内存空间,Page缺省为1MB,每个Page根据Slab规格被划分为若干个相同Size的Chunk,每个Chunk里保存一个Item,每个Item同时包含了Item结构体、k和V,相同Size的Chunk合成一组Slab Class

用Growth Factord对分配策略进行调优,默认值是1.25,Growth Factor的值不同,分配的Chunk的Size就不同,且不同Slab Class中的Chunk数量也会不同,根据需要进行调整。

Memcached的数据失效策略:Lazy expiration + LRU

Lazy Expiration

Memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,Memcached不会在过期监视上耗费CPU时间。

LRU机制

Memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

Memcached的分布式算法:

当向memcached集群存入/取出Key/value时,memcached客户端会根据一定算法计算存入那台服务器.(第一步 : 选择服务器,第二步 : 存取数据)
余数算法 : 先求得键的整数散列值,再除以服务器数量,根据余数觉得存储那台服务器.(特点 : 简单,高效.但是扩展性差,服务器数量变更时,几乎所有的缓存都会失效)
散列算法 : 先计算memcached的散列值,并将其发布在0-2^32的圆上,然后用同样的方法算出存储数据键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,
将数据保存在查找到的第一台服务器,如果超过2^32还是找不到,则将数据保存在第一台memcached服务器上.如果添加一台memcached服务器,则只在圆上添加的逆时针方向的第一台服务器上的键会受到影响.
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

Memcached最大的好处就是大大提升应用的可扩展性,特别是在巨大的系统中。由于客户端自己做了一次哈希,那么我们可以增加大量memcached到集群中。memcached 之间没有相互通信,所以也不会增加 memcached的负载;没有多播协议,不会网

  • 点赞
  • 收藏
  • 分享
  • 文章举报
站内首发文章 xmh_sxh_1314 发布了63 篇原创文章 · 获赞 2 · 访问量 1万+ 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: