0%

Memcached 过期与删除机制:Lazy Expiration 与 LRU 策略详解

Memcached 作为内存缓存系统,其过期数据处理和内存回收机制直接影响缓存有效性和资源利用率。与传统数据库的主动过期检查不同,Memcached 采用懒惰删除(Lazy Expiration)LRU(最近最少使用) 策略,以最小的性能开销实现内存管理。本文深入解析这两种机制的原理、优缺点及实际表现。

Lazy Expiration(延迟过期):不主动检查,按需验证

核心原理

Memcached 不会主动监控数据是否过期,而是在用户尝试获取数据时才检查其过期时间:

  1. 当客户端执行 get <key> 时,Memcached 首先判断该键是否存在。
  2. 若存在,检查其时间戳是否过期(当前时间 > 过期时间)。
  3. 若已过期,返回 “键不存在”(END),并将该键标记为无效,从 curr_items 统计中移除。
  4. 若未过期,返回数据,并更新其 “最近使用时间”(用于 LRU 策略)。

优点

  • 节省 CPU 资源:无需维护定时器或线程监控所有键的过期状态,避免频繁检查带来的性能损耗。
  • 简单高效:过期检查与数据访问绑定,仅在必要时执行,适合高并发场景。

缺点

  • 内存占用延迟释放:过期数据可能长时间驻留内存(直到被访问或被 LRU 淘汰),导致短期内存利用率下降。
  • 统计数据延迟更新stats 命令中的 curr_items 会包含已过期但未被访问的键,直至其被主动获取或淘汰。

示例

  1. 存储一个 10 秒后过期的键:

阅读全文 »

Memcached 内存管理:Slab Allocator 机制详解

Memcached 作为高性能内存缓存系统,其内存管理机制直接影响性能和资源利用率。为解决传统内存分配(malloc/free)导致的内存碎片化问题,Memcached 采用了 Slab Allocator 机制,通过预分配固定大小的内存块,实现高效的内存复用。本文深入解析这一机制的原理、优缺点及优化策略。

内存碎片化问题与 Slab 机制的诞生

传统内存分配方式(如 C 语言的 mallocfree)在频繁分配和释放不同大小的内存块时,会产生大量内存碎片

  • 碎片是指无法被利用的空闲内存(如多次分配 / 释放后,内存中存在大量小于申请大小的零散空间)。
  • 碎片积累会导致内存利用率下降,甚至出现 “内存充足但无法分配连续空间” 的矛盾。

为解决这一问题,Memcached 引入 Slab Allocator 机制,核心思想是:按固定大小预分配内存块,根据数据大小匹配最合适的块,避免碎片化

Slab Allocator 核心组件与工作流程

核心组件

  • Slab(内存 slab 区):Memcached 将内存划分为多个 Slab,每个 Slab 对应一种固定大小的内存块(chunk)。
  • Page(页):每个 Slab 由多个 Page 组成,Page 是内存分配的基本单位(默认大小为 1MB)。
  • Chunk(块):每个 Page 被分割为多个大小相同的 Chunk,Chunk 是存储数据的最小单元(如 48B、60B、75B 等)。
  • Slab Class(Slab 类别):具有相同 Chunk 大小的 Slab 集合,每个类别用 class ID 标识(如 class 1 对应 48B Chunk,class 2 对应 60B Chunk 等)。

工作流程

阅读全文 »

Memcached 基本命令详解:从启动到数据操作

Memcached 是一款高性能的分布式内存缓存系统,通过简单的文本协议提供键值对存储服务。本文详细介绍其核心命令,包括服务启动、数据 CRUD、统计监控等,帮助快速上手 Memcached 操作。

服务启动命令

Memcached 启动命令通过参数配置内存、端口、运行方式等核心属性,基本格式如下:

1
memcached [参数]

常用启动参数

参数 作用 示例
-d 以守护进程(后台)方式运行 memcached -d
-m 分配的内存大小(单位:MB,默认 64MB) memcached -m 128(分配 128MB)
-p 监听端口(默认 11211) memcached -p 11212(使用 11212 端口)
-u 运行用户(需 root 权限指定) memcached -u nobody(以 nobody 用户运行)
-l 绑定 IP 地址(默认监听所有网卡) memcached -l 192.168.1.100(仅允许指定 IP 访问)
-c 最大并发连接数(默认 1024) memcached -c 2048(支持 2048 并发)
-P 保存进程 PID 的文件路径 memcached -P /var/run/memcached.pid
-v/-vv 显示详细日志(-v 基本日志,-vv 调试级日志) memcached -vv(前台运行并输出详细日志)

典型启动示例

  1. 前台启动(调试用)

    1
    memcached -m 64 -p 11211 -u nobody -vv

    输出日志将显示客户端连接和数据操作详情。

  2. 后台启动(生产用)

    1
    memcached -d -m 128 -p 11211 -u nobody -P /var/run/memcached.pid

    以守护进程方式运行,分配 128MB 内存,保存 PID 到指定文件。

数据操作核心命令

Memcached 通过简单的文本协议操作数据,支持addsetgetdelete等命令,所有命令需通过客户端(如 telnet)连接服务端后执行。

连接 Memcached 服务

使用 telnet 连接到 Memcached 服务(需先安装 telnet):

1
telnet 127.0.0.1 11211  # 连接本地11211端口的Memcached服务

1. 添加数据:add

功能:仅当键(key)不存在时,添加键值对(若键已存在则失败)。
语法

1
2
add <key> <flag> <expire> <length>\r\n
<value>\r\n
阅读全文 »

JVM 堆内存:对象存储的核心区域

堆(Heap)是 JVM 运行时数据区中最大、最核心的内存区域,几乎所有对象实例和数组都在此分配内存。作为所有线程共享的内存空间,堆的管理(如内存分配、垃圾回收)直接影响 JVM 的性能。本文将详细解析堆的结构、对象生命周期、优化机制及参数配置,帮助深入理解堆内存的工作原理。

堆的基本特性

线程共享与生命周期

  • 线程共享:堆是 JVM 中唯一被所有线程共享的内存区域,所有线程的对象实例都存放在堆中(特殊情况如栈上分配除外)。
  • 生命周期:堆随 JVM 实例启动而创建,随 JVM 退出而销毁,是 JVM 中生命周期最长的内存区域。

核心功能

堆的唯一目的是存储对象实例和数组,包括:

  • 通过 new 关键字创建的对象(如 new User());
  • 数组(如 int[] arr = new int[10])。

注意:对象的引用(如 User u = new User() 中的 u)存储在虚拟机栈的局部变量表中,而对象的实例数据(字段、方法等)存储在堆中。

内存管理特点

  • 动态分配:对象内存按需分配,大小在运行时确定(编译期无法预知)。
  • 垃圾回收:堆是垃圾回收(GC)的主要区域,不再被引用的对象会被 GC 回收,释放内存。

堆的结构划分:年轻代与老年代

为优化垃圾回收效率,堆通常按对象 “存活时间” 划分为年轻代(Young Generation)老年代(Old Generation),不同区域采用不同的 GC 策略。

堆区年轻代和老年代

年轻代:短期存活对象的 “摇篮”

年轻代用于存储新创建的对象存活时间较短的对象,进一步分为 3 个区域:

阅读全文 »

JVM 本地方法栈:本地方法执行的内存支撑

本地方法栈(Native Method Stack)是 JVM 运行时数据区的重要组成部分,专门用于支持本地方法(Native Method)的执行。它与虚拟机栈在功能上相似,但服务对象不同 —— 虚拟机栈管理 Java 方法的调用,而本地方法栈管理非 Java 语言(通常是 C/C++)实现的本地方法调用。

本地方法栈的基本特性

线程私有

与虚拟机栈一样,本地方法栈也是线程私有的内存区域,每个线程在创建时会分配独立的本地方法栈,确保不同线程的本地方法执行互不干扰。

核心功能

本地方法栈的主要作用是为本地方法的执行提供内存支撑,具体包括:

  • 存储本地方法的局部变量;
  • 维护方法调用的参数传递和返回值;
  • 记录方法调用的状态(如返回地址),确保方法执行完成后能正确恢复调用者的执行流程。

与虚拟机栈的关系

  • 功能相似:两者均通过栈帧(Stack Frame)管理方法调用,栈帧的入栈(方法调用)和出栈(方法返回)逻辑一致。
  • 服务对象不同:虚拟机栈对应 Java 方法(*.java 编译的字节码),本地方法栈对应本地方法(native 修饰,通常由 C/C++ 实现)。
  • 实现合并:部分虚拟机(如 HotSpot)将本地方法栈与虚拟机栈合二为一,统一管理 Java 方法和本地方法的调用,简化实现复杂度。

本地方法:Native 方法的本质

本地方法是指用 native 关键字修饰的方法,其特点是:

阅读全文 »