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服务器,则只在圆上添加的逆时针方向的第一台服务器上的键会受到影响.
U2FsdGVkX18cvbJ5SPr4z3KKEU5v+KDW022sGhIJYpoyQfhgzwC+bwuu4+s575P/
IjhpdzdwKv2iAWtNJTKfwJIfdyoCODqvD1D6W6CMBQp5kOsX7prA6WalzauX4S3+
1CBLbounwwEtW8eM5IdAYSUI94k6inGsd6b/Pzkt1R7btcsTJz9a9yCaAzbTcdtA
LDOpWWhirNwR6E1oiLqPZfRXS3kneKTeTJ6osB1hzAYStp6StLpL1wH4B/HPGLZI
HYF1DiKAPnei/uK5c4lMLGu8SH9IuCSx8dDRemd2Z0rKQ+N26LkYLmnQRjmwuT8Y
EL5GVyGZtPNlakdfqeCG4R1obMXwr76Dh5gDZwBAN33eWUL2tuSkeXmjnXKrPdYB
5TZfP4fFPKqzjVkmEVu3GK62qbLm5xDr5YkQndUxPVgH9VJH7Ma0H/gMyeSDpX9i
bebSddauyca/ULphmlRqf/NoudcfA0/IdSHk8geB3HqZomzKpJMy/7rLZijsvdTR
yxmTK2IiyJRc7Mt4HHDDladSajkBiMvu07DNSCnvyY9hVlBAgUNf9RzqDVh2IK0p
D79tnP3ZqC7XYSowst6m7Ky7geScJJEFeNVWIbk4l2GQyNJCkZz5ZtbyETH8U2nB
10fOdCtZOFe53rRxz9JbqN/j5rwMeXowf2sDtpcYFgwtPO692bxg5vewHPIRROF5
GpzZP8O0kXWWrH5win70BXMSFGhHVv4wX6mAA9SEKPtQyoRSG2PVLVzVRl4XQxA+
HblxbD8v4C6vEBfZTIiKHyKT0nbbzif187ZYdK80vgnxp2Y388SpJktyVqiZcXuO
5tbA3oYw98ksQFF7PfXKnsJY5sFiCy6FwUSLdVJJmV4GfENEuisR8TJNKHZb5ShJ
pBW9IpUN5rO3t7F2KHSgsq9PEP8UYneh5y23Dj7TsDtv7BzBVUIRqBFHzbQkZjdL
1d4xy4DXXctkSbD+IFvlz7RAxg3kKB1nzgay7KC8urXS+5TgRaE6JsWATfzdp13i
Y1QCabEC9pps/XnEq3bSCx9x+R0PRmchCZpLSf4CILai7C7lV913dKh/3qK0Zwpm
x1qYtctpt0a/tpVu3pXA3gV1YpiVcHhOLOcEEHNovou6IWbt2IGqVofBDKzhB+0V
ULzdRghiLfZFBv9obFZrlTwZ9tNX+S835lXegay/JlCXNLeGjN+pKOYLMTHvZrIz
NBgh6U5B6zEtXSKsKC+5X6nlHV3pAFnBoPgHvhVg6zcsSxycaeREmlEnfagEH3yv
MbbuBTAg5VOwWHcySpz24ztdFL8OlXyIl8iuSMsoXtyfBAcjRAVGyAJLcSCbMfD9
LCGSvKDLMN5GG/uBjOaCQAL4EwFwZlRmrW9MIS+ew4pPGbt3AZ8xn1mLWBbN4OF8
l1PgLOxy42kHOOekgLRLXgGJeYXDW1LVzQVnThnZzj4ucKHSk89WbBCjSBzCS6Cg
/lnUzA2QNfSOFrI04hGSXtlUmPVwEE6cLRlloP1usJjr9jQViqK+RtY8EKyFIM6r
Vnku23sQvFhwb99R5w3pk/sgbecP7oT7GLQAeFg46wQ70oiITu7yUuIpDbOuhZ64
z6TUZt3/tynuBIIBW/9hKUHERRHrTq+OTzfF2H/HQO8w5RGtcK+a1YoiuTBdJjDv
sYoCc83M5fZyRuytudEMiClkDWDInLUEW+rTo2wkVBtl/zcgybxt/b3ofjoUaxE8
8w3sxdi4noikC22+KQpD/tIAL6imiGJYJ/8gXZ3OOebna4MT61f0GKLUj2+wz5e7
tFr5Q0fxgN96Y1hwPmsg6FaHKvBZ7TFz63XYaYiiv5ARN2ezMpE45mXs8EtdKVnH
oTHZHRZhlTsgvctAM3ys8l310iggolJAjpWW7KcSDAu9MZ3tC4IMfhwn9SAOibrU
bdJ82pCZPdqqQlgsnJrOgjmg07NHIFyGfaYCAtEzqSx3kTxlm0iFlqD864vDPHrP
mxUyjtMtglf8ZAZWNms83sZOW9v1cd2/9uq1tM1ZLgynmgyL63xJuiYF5uvp+3Qc
PXadqRPjOPq1RblSL0obIjjlltf6EkU8vjSUPn6VXCM1yqUwzKRwwQGGrYIXN/JB
P7d0ynTCGo6c9ejqiRuC96gZPnHfpAoMm/iH2G5SX5u7zcw735kIVXwnEOMjZfSA
GNI+yZxYw2vVcyjGqoAqQlPMAmfJ8HpCl/agPTsEaNtodNRtb+MeZrhOWeAMjqtE
qtvgtwHs5nw5viK3Hc/BwxZoz6KlZ2S++Tpc5u0TLZvpGOnrL0bHYxRcAFQ3fQhL
3nOfDeLFZldogi5aDLqHiayq/3Lqk+88Ubu51M4b4G/6wBFPOFymuRdNfecRPGOc
W3H6nhPYs9W4xhkgerWQrv0a44khBVOCrUs+Dw92g/Kne5yPEJtsHgxYEINDvOpb
lchVbO3hf1zJmsHEt6UKTd6UFmalu4dll9SAKNU5h7jQH6mPW1QtS96ZXezNKLvx
q1q3iJsYYf26Ky0x3uzpbBLqsnFpJ9rYGq/gveNu0UDJnQ3UrjsCEa5Rg52NRQoa
Id4Z4C9x/8PSq3eUTr0209BrKTAeBXPclSdkLRz+d3/tunB+bqtyZewhfwZeVwxj
NKzjjCM0gOuXi3FLqoWaHwGz7w6oaN/zmg8Vu8522OTHsdyqJdEI/EP+4rBdVzql
6+jGI3CSHn88iSfrc4KLxQ2VbirlgDrWM8bQlzYzvlRSQVAGtgbnAN1fQLvMzjTe
gdgYqO/y+fiHS6wyIjBtRjttmFhrR4WsAGOlsHs2nrjQNY5SickHQfg2rEZvBLuF
W+NyPioK715+lYXHLZye92qPWDfdZqxWcUQEbb+SN/YYctJMcxNzTWUm0Ct33PDZ
Memcached最大的好处就是大大提升应用的可扩展性,特别是在巨大的系统中。由于客户端自己做了一次哈希,那么我们可以增加大量memcached到集群中。memcached 之间没有相互通信,所以也不会增加 memcached的负载;没有多播协议,不会网
- 点赞
- 收藏
- 分享
- 文章举报
- ehcache、memcache、redis三大缓存比较
- Memcached
- 说说IIS环境下安装memcache的方法
- 使用telnet操作memcache,一般不常用,
- telnet测试memcached服务器
- Memcache 提高缓存命中率
- memcache和redis的区别、联系
- 【实践】Memcached实例解析
- SUSE10安装memcached
- memcached 使用
- django之memcache缓存
- Memcache知识点梳理
- memcached/memcache安装
- 从 Memcached 分布式应用看一致性哈希散列函数的选择
- 应对Memcache缓存失效,导致高并发查询DB
- openstack私有云布署实践【7.2 keystone + memcache (办公网环境)】
- windows下ThinkPHP3.2.3使用memcache缓存
- 常见的开源项目(Castle, nVelocity, Memcached, Lucene.net等)
- Python之路第十一天,高级(3)-Python操作 Memcached、Redis
- python使用memcached