Memcached是基于客户端的一致性Hash算法来实现分布式的K/V缓存,Memcached的特性是高效以及简单,但是不能用它来持久的存储数据,也就说,使用Memcached的时候,必须考虑,Memcached挂了的影响。Memcached使用简单,不过还是了解下Memcached的内存管理机制。
Memcached内存特点
- 基于slab的内存分配策略
- 基于LRU的内存清除策略
- 基于Hash的Item检索策略(也就是说,Memcached很想是个大的Hashtable)
Memcached内存管理机制
与Memcached内存管理相关的三个概念有Slab、Page、Chunk
- Slab
Memcached将内存分成多个Slab(每个Slab),每个Slab有一个类型,这个类型了这个Slab中的块的大小,比如第一类Slab中的块大小是从0到96字节,第二类Slab是从97字节到120字节,...第42类Slab。第一块大小(默认96字节)可以通过参数调整、块大小的增长因子也是可以调整的,默认是增长25%
- Page
Page是Memcached内存分配单位,Memcached每次分配一个Page的内存空间,默认情况下,一个Page的大小是1M。这个Page具体分解分成多少块,是由把Page分配给的Slab类型决定的
- Chunk
内存分配单位,不同的Chunk在不同类型的Slab中大小是不同的,但是在相同的Slab中是相同的
Memcached Slab、Page和Chunk
内存利用不充分
如下图,180字节的item存放在Slab 4中,放下此Item后,还有12字节没被使用,但是这12个字节永远被浪费了,即使此后有小于12字节的Item来了,也不会放到这里,
Memcached的Item存储结构
Memcached内存结构图
Memcached内存回收策略
- Memcached数据清除并不是真正的清除,对于已经过期的数据占据的空间不会被回收
- Memcached优先使用已经过期的空间
- Memcached在内存空间不足时,就会使用LRU算法进行空间分配,将最近最不常使用的空间 腾出来给刚加入的Item使用,那么这些被踢的数据去哪了??另外,Memcached进行LRU是针对Slab进行的,而不是针对整个内存进行
- Memcached的命中率,受存储的数据、键值、过期以及增长因子等因素的制约
- 懒惰过期检测机制
1. 不主动检测对象是否过期
2. Get到某个Item后,判断其是否过期,如果过期则删除,但是不能释放内存
- 懒惰删除机制
1. Memcached数据清除并不是真正的清除,即不进行内存释放,但是用户永远看不到这个数据了,其存储空间可以重复利用。 此时,Memcached会写清除位,内存指针放入slot回收插槽,下次内存分配时,直接使用。
- LRU
Memcached使用LRU算法从内存中删除有效的缓存数据。Memcached优先使用已超时的缓存数据的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来 分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当Memcached的内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。
从缓存的实用角度来看,该模型十分理想。 不过,有些情况下LRU机制反倒会造成麻烦。Memcached启动时通过“-M”参数可以禁止LRU,如下所示: $ memcached -M -m 1024 启动时必须注意的是,小写的“-m”选项是用来指定最大内存大小的。不指定具体数值则使用默认值64MB。 指定“-M”参数启动后,内存用尽时Memcached会返回错误。话说回来,Memcached毕竟不是存储器,而是缓存,所以推荐使用LRU。
Memcached常见问题
1. Memcached是否可以缓存超过1M的数据
可以,在启动Memcached时,需要指定-I参数,用于指定Memcached的最大的slab page(Memcached每次申请内存的大小是Page的大小,比如默认page是1M,那么Memcached每次申请大内存是1M)
2. Memcached的过期失效数据会回收内存吗?
不会。那么问题Memcached岂不是很快用完了??不会,虽然内存没有释放,但是数据会直接覆盖
3. Memcached如何进行LRU进行数据过期失效处理,并作相应的内存回收
参见上面的LRU部分的描述
4. Memcached的Key的长度有什么限制?
Memcached的每个Key的长度不能超过250字节,并且Key是作为数据容量的一部分。
相关推荐
Memcached源码分析之内存管理Memcached源码分析之内存管理
综上所述,Memcached作为一个高效的内存缓存系统,通过客户端和服务端的协作,以及各种管理工具的辅助,可以有效地提升应用程序的性能和响应速度。在实际应用中,我们需要根据具体需求选择合适的客户端库,合理配置...
### Memcached内存分析、调优、集群 #### 1. Memcached背景 Memcached是一款高性能的分布式内存对象缓存系统,旨在通过减轻数据库负载来加速动态Web应用的响应速度。它通过在内存中缓存数据和对象来减少读取数据库...
MSM(Memcached_Session_Manager)是一个基于Java的Memcached会话管理器,它允许我们将Web应用的session数据存储在Memcached服务器上,而不是传统的保存在服务器的内存中或者硬盘上的session文件。这样,即使服务器...
Memcached是一款高性能、分布式内存对象缓存系统,主要用于加速动态Web应用,通过将数据存储在内存中,减少数据库的访问次数,从而提高应用性能。它是一个轻量级的服务,设计简单且易于部署,支持多种编程语言的...
### Memcached内存分析、调优、集群:深入理解与实践 #### 1. Memcached背景与概述 Memcached是一款高性能的分布式内存缓存服务器,它最初由LiveJournal的运营人员开发,现已成为开源社区中不可或缺的一部分。其...
总的来说,"memadmin"作为一款memcached的图形管理工具,为memcached的运维提供了极大的便利,使得memcached的管理和维护变得更加高效和直观。通过它的各种功能,用户可以更好地理解、优化和调试他们的缓存系统,...
SLAB机制是Memcached内存管理的关键组成部分,它通过一种特殊的缓存机制来存储item数据。这种机制能够有效地提高内存利用率并减少内存碎片,从而提高系统的整体性能。 **SLAB机制概述:** - **SLAB(Class)定义**...
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
`Tomcat`是一个流行的开源Java Servlet容器,而`Memcached`则是一个分布式内存对象缓存系统,常用于减轻数据库负载,提高应用性能。本篇文章将详细介绍如何使用`Tomcat`结合`Memcached`来实现高效的Session管理。 ...
Memcached是一种分布式内存对象缓存系统,广泛用于减轻数据库负载,提高Web应用的性能。由于是64位版本,这意味着它可以利用64位系统的内存优势,处理更大的数据量。 **Memcached简介** Memcached是一款高性能、轻...
计算机后端-PHP视频教程. Memcached12 memcached内存管理机制.wmv
Memcached是一种广泛使用的分布式内存对象缓存系统,它主要用于减轻数据库的负载,通过将数据存储在内存中,提高Web应用程序的响应速度。本文将深入探讨memcached的内存分配代码,理解其背后的机制,并讨论如何通过...
Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载。它通过在内存中存储数据来提供快速的数据访问,从而提高应用的性能。本篇文章将详细讲解如何安装和配置memcached,...
memcached介绍 memcached安装 memcached操作 内存存储机制 数据过期与删除机制 php操作memcached 多服务器集群算法 缓存无底洞效应 缓存雪崩 老数据被踢现象 结课作业
4. **内存管理**:memcached管理内存空间,当内存不足时,会使用LRU(Least Recently Used)策略自动删除最近最少使用的数据。 5. **非持久化存储**:由于数据存储在内存中,一旦服务器重启,所有数据将丢失。因此,...
Memcached 是一款高性能的分布式内存缓存系统,用于在Web应用中减轻数据库负载。它将数据存储在内存中,以键值对的形式提供快速访问,尤其适用于高并发场景。Memcached 使用简单,可移植性强,广泛应用于多种编程...
Memcached是一款高性能、分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的性能。它通过在内存中存储数据来快速访问,避免了反复读取硬盘上的数据,从而提高了应用程序的响应速度。 标题“memcached...