Memcached源码分析之LRU操作
来源:互联网 发布:低音炮蓝牙音响淘宝 编辑:程序博客网 时间:2024/05/16 10:29
LRU是最近最少使用的简称,该技术经常用来实现cache数据更新,Memcached使用LRU技术来淘汰老的数据,Memcached默认是启用LRU操作的,在这种情况下所有的set操作都会成功,如果Memcached的内存池已经使用完,则会淘汰老数据来存放新数据,如果关闭了Memcached的LRU,则当Memcached没有多余的内存空间时,Memcached之间返回错误,下面我们分析下LRU的相关操作。
这里再附一张Memcached的内存结构图,从图中可以看到LRU队列保持这已经分配出去的item的结构(图中指针为单链表,这里画的有误,其实是双向链表),同时每个slabclass由两个指针来维护该表,即heads和tails指针,分别指向最老的数据和最新的数据,这样便于LRU链表的操作。
//每个slabclass各有一个指针static item *heads[LARGEST_ID];static item *tails[LARGEST_ID];//将item加入到对应classid的LRU链的head,这里是item加入到LRU链表中static void item_link_q(item *it) { /* item is the new head */ item **head, **tail; assert(it->slabs_clsid < LARGEST_ID); assert((it->it_flags & ITEM_SLABBED) == 0); head = &heads[it->slabs_clsid]; tail = &tails[it->slabs_clsid]; assert(it != *head); assert((*head && *tail) || (*head == 0 && *tail == 0)); it->prev = 0; it->next = *head; if (it->next) it->next->prev = it;//执行插入数据操作 *head = it; if (*tail == 0) *tail = it; sizes[it->slabs_clsid]++; return;}//将item从对应classid的LRU链上移除,这里是item从LRU链表中删除static void item_unlink_q(item *it) { item **head, **tail; assert(it->slabs_clsid < LARGEST_ID); head = &heads[it->slabs_clsid]; tail = &tails[it->slabs_clsid]; if (*head == it) { assert(it->prev == 0); *head = it->next; } if (*tail == it) { assert(it->next == 0); *tail = it->prev; } assert(it->next != it); assert(it->prev != it); if (it->next) it->next->prev = it->prev;//断开连接 if (it->prev) it->prev->next = it->next; sizes[it->slabs_clsid]--; return;}注:图片链接自 http://kenby.iteye.com/blog/1423989
0 0
- Memcached源码分析之LRU操作
- Memcached源码分析 - Memcached源码分析之LRU算法(6)
- Memcached源码分析之set操作
- Memcached源码分析之do_item_alloc操作
- Memcached源码分析之Hash表操作
- Memcached源码分析:内容包括get过程、set操作、LRU操作、Hash表操作、连接队列等
- memcached源码分析-----LRU队列与item结构体
- memcached源码分析-----item过期失效处理以及LRU爬虫
- memcached源码分析-----item过期失效处理以及LRU爬虫
- Memcached源码分析 - Memcached源码分析之增删改查操作(5)
- memcached源码分析之hashtable
- memcached源码分析之hashtable
- Memcached源码分析之二
- Memcached源码分析之三
- memcached源码分析之四
- memcached server LRU 深入分析
- memcached server LRU 深入分析
- memcached server LRU 深入分析
- error:只有静态常量整型数据成员才可以在类中初始化
- Spring集成Quartz定时任务框架介绍和Cron表达式详解
- 基数排序
- 五周 项目1 扩展 计算矩形面积 并判断该矩形是否为正方形
- Unity动态字体文字破碎的解决方法(Dynamic Font Broken)
- Memcached源码分析之LRU操作
- Directory类(DirectoryInfo类)和Path类与File类的基本方法与操作以及实例
- xcode平时经常用到的快捷键
- 做了一个手机上的直播系统
- pthread编程基础 【转】
- 背包问题的多个解法
- 再谈kmp算法 , 由poj3461
- 协方差矩阵
- 如何更改ArcGIS 10.1 for Server的端口号