memcached 简介和特点
memcached 是一个自由开源的,高性能,分布式内存对象缓存系统
特点:
- 协议简单 (通信不适用 xml,而是使用简单的基于 文本行的协议)
- 基于libevent的事件处理
- 内置内存存储方式 (数据存储在内存中)
- memcached不互相通信的分布式 (由客户端决定写到哪个memcached ) 一致性hash
命令
add 当键不存在时,插入成功
replace 当键存在时,替换才会成功
set 都会成功
保存数据时,如果不指定过期时间,按照 LRU 方式淘汰数据
其他命令:
参考: https://www.runoob.com/memcached/memcached-get-data.html
Slab Allocation 机制
解决的问题
在没有 Slab Allocation 之前, memcached 只是简单记录 malloc 和 free 对应的内存块,会产生内存碎片
slab Allocation 基本原理
就是 按照预定的大小,将分配的内存,分割成各种尺寸的块(chunk),并把相同尺寸的块 分成组(class ),以解决内存碎片的问题
实际分配过程
memcached根据收到的数据的大小,选择最适合数据大小的 slab 。memcached中保存着 slab内空闲 chunk的列表,根据该列表选择 chunk,然后将数据缓存于其中
优缺点:优点 解决了内存碎片,缺点 内存使用率降低
内存删除机制: 惰性删除。 也就是 key 过期之后,不会直接释放内存空间,而是做个标记,客户端无法查看过期数据。
一致性hash
首先求出 memcached服务器(节点)的哈希值,并将其配置到 0~232 Consistent Hashing
的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数 据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过 232 仍然找不到 服务器,就会保存到第一台 memcached服务器上。
好处:Consistent Hashing最大限度地抑制了键的重新分布。添加一台 memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化 而影响缓存的命中率,但 Consistent Hashing中,只有在 continuum上增加服务器的地点逆时针方向 的第一台服务器上的键会受到影响