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

原创 2015年07月07日 15:03:23


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删除,实现的代码如下:

<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="font-family:Microsoft YaHei;font-size:14px;"><?
      //删除过期的item代码
      item *do_item_get_notedeleted(const char*key,const size_t nkey,bool *delete_locked){
             item *it = assoc_find(key ,nkey);
             if(delete_locked) *delete_locked =false;
             if(it != NULL && (it ->it_flags & ITEM_DELETED)){
                    if(!item_delete_lock_over(it)){
                           if(delete_locked)*delete_locked = true;
                           it = null;
                    }
             }
             if(it != null &&settings.oldest_live != 0 && settings.oldest_live <= current_time&& it -> time <= settings.oldest_live){
                    do_item_unlink(it);
                    it = null;
             }
             if(it != null && it ->exptime != 0 && it -> exptime <= current_time){
                    do_item_unlink(it);
                    it = null;
             }
             if(!it = null ){
                    it -> refcount ++;
                    DEBUG_REFCNT(it,'+');
             }
             return it;
}</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


使用memcached进行并发控制

引子一个使用缓存进行并发控制的讨论,让我学习到成本与收益间的平衡,以及何为真正的可用性......防止并发有多种方式,本文只涉及使用缓存memcached控制。并发场景:     用例:SNS系统中具...
  • JiangBo_HIT
  • JiangBo_HIT
  • 2011年02月27日 18:57
  • 8112

Memcached 并发控制 CAS 协议

Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题。 ...
  • xiaobaismiley
  • xiaobaismiley
  • 2014年05月27日 15:46
  • 3788

memcached在大负载高并发网站上的应用

转自 以上两个两个链接的内容
  • fengbaokeji
  • fengbaokeji
  • 2017年01月11日 16:16
  • 305

memcached的并发问题

什么是CAS协议 Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程...
  • jackyxwr
  • jackyxwr
  • 2013年03月18日 20:06
  • 6157

深入分析Memcached的线程接入模型---上

memcached是一个分布式的内存cache系统,目前被大量地运用于各种各样的站点中,以不断提高站点的总体访问性能,而另外一方面,memcached的使用是非常简单的,可以说,使用门槛很低,这也许是...
  • tenfyguo
  • tenfyguo
  • 2010年01月31日 00:31
  • 5704

memcached主线程工作线程通信机制

accept/dispatch:         memcached使用"主线程统一accept/dispatch子线程"网络模型处理客户端的连接和通信,也就是《UNIX网络编程 卷1 ...
  • qq_15457239
  • qq_15457239
  • 2015年09月16日 10:28
  • 845

Memcached多线程技术解读

在前面一篇博文 Memcached软件源码级执行流程解读 中,以有过对多线程技术的介绍。在那里只是简单的介绍了其初始化,工作实体函数加载的一些过程,并没有对其中涉及到的细节部分作详细描述。在这篇博文中...
  • fox_hacker
  • fox_hacker
  • 2014年11月20日 15:50
  • 775

Memcached之你真正理解LRU吗(4)

众所周知,Memcached使用的是LRU(Least Recently Used最近最少使用)算法来回收缓存,将那些属于LRU的数据移出内存,从而腾出空间来加载另外的数据。那么Memcached的最...
  • qianshangding0708
  • qianshangding0708
  • 2015年08月25日 21:58
  • 4349

探究redis和memcached的 LRU算法--------redis的LRU的实现

一直对这redis和memcached的两个开源缓存系统的LRU算法感兴趣。今天就打算总结一下这两个LRU算法的实现和区别。 首先要知道什么是LRU算法:LRU是Least Recently Use...
  • wallwind
  • wallwind
  • 2015年04月06日 23:18
  • 6205

memcached源码分析-----LRU队列与item结构体

转载请注明出处: LRU队列:         之前的《slab内存分配》博文已经说到一个slab class里面的所有slab分配器都只分配相同大小的item,不同的slab class...
  • luotuo44
  • luotuo44
  • 2015年01月19日 09:46
  • 4471
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解memcached,高并发、懒惰与LRU(一)
举报原因:
原因补充:

(最多只允许输入30个字)