首页 > 其他分享 >Memcached深入学习总结

Memcached深入学习总结

时间:2023-09-14 14:36:16浏览次数:35  
标签:总结 缓存 数据 Slab Memcached 深入 内存 memcached


在上一家公司时,产品主要使用memcached做缓存。

虽然目前这家公司memcached使用的比较少(刚进公司做云存储相关服务时小规模使用了一下,后来做另一个系统时换redis做了缓存),但前几天整理资料时看到了原先写的memcached相关笔记,在此整理一下发上来。

---------------------------------------------------------------

一、Memcached特点:

1、协议简单(基于文本行的协议)。

2、基于libevent的事件处理。

3、内置内存存储方式。

4、Memcached不相互通信的分布式。

 

注:由于数据保存在内置的内存存储空间中,所以重启memcached会导致全部数据消失。内容容量达到指定值之后,就基于LRU算法自动删除不使用的缓存。Memcached服务器端没有分布式功能,这完全取决于客户端的实现。

 

二、启动参数:

-p 使用端口,默认11211。

-m 最大内存大小,默认64M。

-vv 用very verbose模式启动,调试信息和错误输出到控制台。

-d 作为daemon在后台启动。

 

三、Memcached的内存管理机制:

1、默认采用名为Slab Allocator的分配、管理内存机制。

2、该机制出现前,内存的分配是通过对所有记录简单的进行malloc和free来进行的。这种方式会导致内存碎片,加重操作系统内存管理器的负担。

3、Slab Allocator基本原理:按照预先规定的大小,将分配的内存分割成各种特定长度的块,并把尺寸相同的块分成组(chunk的集合),以完全解决内存碎片的问题。

4、Slab Allocator还有重复使用已分配内存的目的,分配的内存不会释放,而是重复利用。

5、Slab Allocator术语:

Page – 分配给Slab的内存空间,默认是1MB,分配给Slab之后跟据Slab大小切分成chunk。

Chunk – 用于缓存数据的内存空间。

Slab Class – 特定大小的chunk组。

 

Memcached根据收到数据的大小,选择最合适数据大小的Slab,Memcached内会保存slab内空闲chunk的列表。

 

四、Slab Allocator存在的问题:

由于分配的是特定长度的内存,因此无法有效利用分配的内存。

例如:将100字节的数据存入128字节的chunk,则浪费了28字节。

但如果预先知道客户端发送的数据的公用的大小,或者仅缓存大小相同的数据的情况下。只要使用适合数据大小的组的列表,就可以减少浪费。

 

五、调优:

启动时指定growth factor因子,就可以在某种程度上控制slab之间的差异,默认值为1.25。

Memcached –f 2 –vv

(查看growth factor为2时slab中chunk size的差异)

Memcached引入时,最好重新计算一下数据的预期平均长度,调整growth factor,以获得最恰当的设置。

 

六、连接Memcached 控制台:

telnet 主机名 端口号

如:telnet localhost 11211

输入stats回车,查看memcached的状态。

Memcached 软件包中Protocol.txt可以查看协议相关信息。

使用memcached-tool的Perl脚本,可以方便的获得slab的情况。

memcached-tool 主机:端口 选项

 

七、数据删除:

1、Memcached不会释放已分配的内存,其存储空间可以重复使用。

2、Lazy Expiration:

Memcached内部不会监视数据是否过期,而是在get时查看数据的时间戳,查看数据是否过期。被称为lazy expiration(惰性过期)。

3、当Memcached内存空间不足,即无法从slab class中获取到新的空间时,就从最近未被使用的数据中搜索,将其空间分配给新的数据。(如果要禁用LRU,使用-M参数,超出会报错)。

4、不指定具体值则默认数值为64M。

 

八、其它:

1、二进制协议:使用理由是不需要文本协议的解析处理,使得memcached性能更高。

2、分布式:将key保存在不同的服务器上。

3、性能可达到:请求最大15000qps,流量400Mbps,连接数超过10000个,性能非常高。

4、分布式hash算法:

(1)取模:

求得键整数的hash值,除以服务器台数,所得的余数决定服务器。

缺点:当添加或者移除服务器时,缓存重组的代价相当巨大,会影响缓存命中率。

(2)Consistent Hashing:

首先求出memcached节点的哈希值,并将其配置到0--2^32的圆上。然后用同样的方法求出存储数据的键的hash值,并映射到圆上。然后从存储数据映射的位置顺时针查找,将数据保存到找到的第一个服务器上。

Consistent Hashing最大程度的抑制了键的重新分布,只有从增加服务器地点到逆时针相邻第一台服务器之间的键会受到影响。

有的Consistent Hashing还采用了虚拟节点的思想,使用一般hash函数的话,服务器的映射地点分布非常不均匀。使用虚拟节点为每个服务器在环上分配100--200个点,这样能抑制分布不均匀,最大限度的减小服务器增减时缓存重新分布。

 

标签:总结,缓存,数据,Slab,Memcached,深入,内存,memcached
From: https://blog.51cto.com/u_6978506/7470103

相关文章

  • MongoDB Sharding深入学习
    对于MongoDB的Sharding(分片)技术并不陌生,但是发现里面其实还是有不少值得深入学习的东西。笔记整理一下发上来跟大家分享。-----------------------------------一、MongoDB分片机制:1、一个分片包含数据的某一子集。若某一分片包含多台服务器。则每台服务器都拥有完整的数据副本。......
  • 代码随想录算法训练营第9天| ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结
    28.找出字符串中第一个匹配项的下标mydemo--(mythought)--(falied)classSolution{public:intstrStr(stringhaystack,stringneedle){for(inti=0;i<haystack.size();i++){if(haystack[i]!=needle[0])continue;......
  • SQL基础总结(一):关系模型
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。--------------------------------------------------------------- 规范化父子表图示:由父表画出主键画出箭头指向子表外键。满足第一范式的表:列包含原子值,没有重复的组。 当满足下列条件时第一范式的表自动满足第二范式的表:1.......
  • SQL基础总结(二):SQL基础
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。--------------------------------------------------------------- 标识符是可以在数据库对象(任何create语句所创建的内容)层次中明确的引用一个对象的名称。 标准的SQL区分保留关键字和非保留关键字。不可以用保留关键字作......
  • SQL基础总结(三):从表中检索数据
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。---------------------------------------------------------------使用DISTINCT消除重复的行。虽然空值是未知的,但彼此绝不相等,但DISTINCT认为空值是彼此相等的。对于DISTINCT操作,DBMS执行内部排序去识别并消除重复的行。排序......
  • SQL基础总结(四):操作符和函数
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------派生列是一个计算结果。派生列不会成为表中的永久列,他们用于显示或者报表目的。 包含空值的任何算数运算的......
  • SQL基础总结(六):联结
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------限定名称是一个表名后跟一个点号和表中的列名。限定名称可以在整个数据库中唯一的标识出某个列。如:table.colu......
  • SQL基础总结(七):子查询
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------不要在子查询中使用ORDERBY子句,子查询返回的中间结果是看不到的,对子查询排序没有意义。子查询是单个SELECT......
  • SQL基础总结(五):汇总和分组数据
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)-------------------------只对单个值进行操作的是标量函数。对一组值进行操作以产生一个汇总值的是SQL聚合函数或集合函数。可以对行的集合进行......
  • SQL基础总结(十一):视图
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------除了ORDERBY子句通常是被禁止的,几乎所有有效的SELECT语句都可以定义视图。可以嵌套视图,视图的SELECT语句......