IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Memcached的LRU算法

平凡的世界 2011-11-06 22:28:32 累计浏览 3,150 次
本机暂存

    题外话

     最近计划对Memcached做一些尝试性的改造,主要是针对Memcached在处理过期数据的时候进行改造,以实现在一个缓存的过期时间达到的时候,可以对该缓存的数据进行一个验证和存储的处理。

    这个需求,主要是为了解决MySQL的写入瓶颈,通过延期、合并写入请求来减少MySQL的并发写入量。现在逐渐记录出来和有需要的朋友一起讨论。当然,今天的主要内容是关于LRU的部分。

    LRU算法

     LRU是Least Recently Used最近最少使用算法。源于操作系统使用的一种算法,对于在内存中但最近又不用的数据块叫做LRU,操作系统会将那些属于LRU的数据移出内存,从而腾出空间来加载另外的数据。

    我们来看Memcached(版本 1.4.9)的相关代码:

/* expires items that are more recent than the oldest_live setting. */
void do_item_flush_expired(void) {
int i;
item *iter, *next;
if (settings.oldest_live == 0)
return;
for (i = 0; i < LARGEST_ID; i++) {
/* The LRU is sorted in decreasing time order, and an item\'s timestamp
* is never newer than its last access time, so we only need to walk
* back until we hit an item older than the oldest_live time.
* The oldest_live checking will auto-expire the remaining items.
*/
for (iter = heads[i]; iter != NULL; iter = next) {
if (iter->time >= settings.oldest_live) {
next = iter->next;
if ((iter->it_flags & ITEM_SLABBED) == 0) {
do_item_unlink(iter);
}
} else {
/* We\'ve hit the first old item. Continue to the next queue. */
break;
}
}
}
}

     属于LRU的item是被时间逆序排序了,一个item的失效时间应该是永远比它自身上次被访问的时间大。所以在找到一个item的失效时间比oldest_live这个时间小之前,我们只需要把已经逆序排序的item继续往结尾遍历即可,一旦找到这个item,其他剩余的item也就可以判定为过期了。

    如何改动?

     我们的思路是让Memcached来作为MySQL的中间承接方,其实LRU算法并不是最适合。列举两种方案:

  • 继续采用LRU算法,我们需要对Memcached进行改造的是do_item_flush_expired这个函数的执行频度,同时改造do_item_unlink函数来适应需求。
  • 改用FIFO(先入先出)算法,彻底放弃Memcachd的整个过期处理机制或者另外添加一个FIFO算法序列,来专门为我们的业务需要服务。
  • 同分类推荐文章

    1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
    2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
    3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

    查看更多 数据库 文章 →

    建议继续学习

    1. 分布式缓存系统 Memcached 入门 (累计阅读 16,243)
    2. 30分钟3300%性能提升――python+memcached网页优化小记 (累计阅读 13,741)
    3. 关于memcache分布式一致性hash (累计阅读 11,820)
    4. Cacti 添加 Memcached 监控 (累计阅读 9,364)
    5. Redis和Memcached的区别 (累计阅读 8,071)
    6. php缓存与加速分析与汇总 (累计阅读 7,888)
    7. Using MySQL as a NoSQL (累计阅读 7,109)
    8. 系统架构的一些思考 (累计阅读 6,792)
    9. Twitter架构图(cache篇) (累计阅读 6,119)
    10. 谈谈Facebook的聊天系统架构 (累计阅读 5,731)