item的分配
1.首先计算这个item需要的空间。
2.计算该item所在的lru链表。
3.从lru的尾部往前查找超时或者flushed的item。
3.1 如果item对应的桶号相同或者加锁失败忽略
3.2 refcount_incr(&search->refcount) != 2的情况
3.3 超时或者flush的情况
3.3.1 slabs_adjust_mem_requested修改slab头的一些统计信息
3.3.2 do_item_unlink_nolock(it, hv);从hash表和链表中移除item
4.如果查找失败,就重新分配
5.初始化item。
item *do_item_alloc(char *key, const size_t nkey, const int flags,
const rel_time_t exptime, const int nbytes,
const uint32_t cur_hv) {
uint8_t nsuffix;
item *it = NULL;
char suffix[40];
//1.计算这个item需要占用的空间,用来存储key、value等信息
//最多查询5次,之前版本文章说是50次。
//计算该item对应桶的序号
//如果hr==cur_hv对应桶号相同,再加锁就死锁了。
item的回收
调用的是do_slabs_free函数。