What is Memcached?
Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.
Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.
Memcached is simple yet powerful. Its simple design promotes quick deployment, ease of development, and solves many problems facing large data caches. Its API is available for most popular languages.
Memcached是什么?
免费和开源、高性能、分布式内存对象缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态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服务器,则只在圆上添加的逆时针方向的第一台服务器上的键会受到影响.
Memcached最大的好处就是大大提升应用的可扩展性,特别是在巨大的系统中。由于客户端自己做了一次哈希,那么我们可以增加大量memcached到集群中。memcached 之间没有相互通信,所以也不会增加 memcached的负载;没有多播协议,不会网络通信量爆炸(implode)
参考文档:https://blog.csdn.net/chenleixing/article/details/47035453
https://blog.csdn.net/zhao1299002788/article/details/90215666
https://www.cnblogs.com/liunianmoshi/p/memcached.html
https://www.cnblogs.com/codershuai/p/6150002.html