memcache源码分析系列之四 item内存分配与回收

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函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值