深入理解memcached,高并发、懒惰与LRU(一)

转载,原文 http://blog.csdn.net/u012675743/article/details/46789695

深入理解memcached,高并发、懒惰与LRU(一)


1. Memcached如何支持高并发

        Memcached使用多路复用I/O模型。传统阻塞I/O中,系统可能随时因为某个用户连接还没做好I/O准备而一直等待,知道这个连接做好准备。如果这是有其他的用户连接服务器,就很可能因为系统阻塞得不到响应。

而多路复用I/O是一种消息通知模式,用户连接做好I/O准备后,系统才会通知我们这个连接可以进行I/O操作。这样就不会阻塞在某个用户连接。因此memcached才支持高并发。

        此外,memcached使用了多线程模式,在开启memcached服务器时 使用‘-t’参数可以指定要开启的线程数。但并不是线程数越多越好。一般设置为CPU核数,这样效率最高。因为线程越多,系统需要的线程调度时间越多。而把CPU线程数设置成CPU核数,系统调度的时间最少。

2. 删除过期item

          Memcached为每个item设置了一个过期时间,但不是到期就把item从内存中删除,而是访问item时如果到了有效期,才把item删除,实现的代码如下:

  1. <span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:14px;"><?  
  2.       //删除过期的item代码  
  3.       item *do_item_get_notedeleted(const char*key,const size_t nkey,bool *delete_locked){  
  4.              item *it = assoc_find(key ,nkey);  
  5.              if(delete_locked) *delete_locked =false;  
  6.              if(it != NULL && (it ->it_flags & ITEM_DELETED)){  
  7.                     if(!item_delete_lock_over(it)){  
  8.                            if(delete_locked)*delete_locked = true;  
  9.                            it = null;  
  10.                     }  
  11.              }  
  12.              if(it != null &&settings.oldest_live != 0 && settings.oldest_live <= current_time&& it -> time <= settings.oldest_live){  
  13.                     do_item_unlink(it);  
  14.                     it = null;  
  15.              }  
  16.              if(it != null && it ->exptime != 0 && it -> exptime <= current_time){  
  17.                     do_item_unlink(it);  
  18.                     it = null;  
  19.              }  
  20.              if(!it = null ){  
  21.                     it -> refcount ++;  
  22.                     DEBUG_REFCNT(it,'+');  
  23.              }  
  24.              return it;  
  25. }</span></span>  


       使用do_item_get_notedeleted函数在memcached中查找指定的item,从上面代码可知,当item过期时间早于当前时间时,便会删除此item。

       延迟删除过期的iten到查找进行,可以提高memcached的效率。这样不必每时每刻检查过期item,从而提高CPU工作效率。

3. 使用LRU算法淘汰数据

       使用slabs_alloc函数申请内存失败时,就开始淘汰数据了。淘汰规则是,从数据项列表尾部开始遍历,在列表中查找一个引用计数器为0的item,把此item释放掉。

        为什么要从item列表尾部开始遍历呢? 因为memcached会把刚刚访问过的item放到item列表头部,所以尾部的item都是没有或很少访问的,这就是LRU算法的精髓。

        如果在item列表找不到计数器为0的item,就查找一个3小时没有访问过的item。把他释放,如果还是找不到,就返回NULL(申请内存失败)。

         从上面的分析可以知道,当内存不足时,memcached会把访问比较少或者一段时间没有访问的item淘汰,以便腾出内存空间存放新的item。

更多可以参考:

http://www.cnblogs.com/xianbei/archive/2011/01/18/1924893.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值