`
balaschen
  • 浏览: 192234 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

正确认识memcached的缓存失效

阅读更多
最近javaeye上memcached相当火,不少人把它当作sna架构的中心session服务器来用。由于memcached是作为一个cache服务器而设计的,而session的存放有自己特点,其中一个就是session的失效时间。通常session的失效算法是“当前时间>=session最后访问时间+失效时间”,那么memcache的缓存失效是怎么实现的呢?我们看看代码:
1、失效时间的计算:
rel_time_t realtime(time_t exptime) {
    /* no. of seconds in 30 days - largest possible delta exptime */

	if (exptime == 0) return 0; /* 0 means never expire */

    if (exptime > REALTIME_MAXDELTA)
        return (rel_time_t) (exptime - stats.started);
    else {
        return (rel_time_t) (exptime+ current_time);
    }
}

代码很简单,假如失效时间是120妙,那么计算后的失效时间就是120+current_time(当前时间和server启动时间差)

2、失效算法:
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 && (it->it_flags & ITEM_DELETED)) {
        /* it's flagged as delete-locked.  let's see if that condition
           is past due, and the 5-second delete_timer just hasn't
           gotten to it yet... */
        if (!item_delete_lock_over(it)) {
            if (delete_locked) *delete_locked = true;
            it = 0;
        }
    }
    if (it != NULL && settings.oldest_live != 0 && settings.oldest_live <= current_time &&
        it->time <= settings.oldest_live) {
        do_item_unlink(it);           // MTSAFE - cache_lock held
        it = 0;
    }
    [b]if (it != NULL && it->exptime != 0 && it->exptime <= current_time) {
        do_item_unlink(it);           // MTSAFE - cache_lock held
        it = 0;
    }[/b]

    if (it != NULL) {
        it->refcount++;
        DEBUG_REFCNT(it, '+');
    }
    return it;
}

失效算法是通过比较it->exptime <= current_time来实现的,而it->exptime值,只有在cache值update的时候(set/add/replace)才回更新,仅仅get操作是不会更新这个时间的!

所以如果想让memcached正确的处理session的失效,必须在每次访问的时候,
引用
执行一次add操作(add操作当cache已存在时,仅仅更新exptime时间)

更正:昨天晚上又看了下代码,发现add操作如果cache已存在,并不更新exptime,仅仅刷新最后访问时间,所以应该使用set或replace操作。
分享到:
评论
5 楼 zzeric 2007-06-04  
倒不如hack一下assoc.c里的assoc_insert方法,在方法的最前面加上一句
it->exptime += it->current_time;
提前更新exptime。在每次session.getAttribute("XXX")或cache.get("XXX")的时候先调一下mcClient.add("XXX","");
4 楼 balaschen 2007-05-29  
calmness 写道
balaschen 写道

    if (exptime > REALTIME_MAXDELTA)
        return (rel_time_t) (exptime - stats.started);
    else {
        return (rel_time_t) (exptime- current_time);
    }


代码很简单,假如失效时间是120妙,那么计算后的失效时间就是120+current_time(当前时间和server启动时间差)


应该是减吧,120-current_time or 120-stats.started

是+代码我贴错了,已修改,贴成我hack过的代码,不好意思
另外,memchaced接受两种格式的失效时间,一种是当前时间,一种是失效时长(120就属于这种),如果是当前时间,执行return (rel_time_t) (exptime - stats.started);分支,结果依然是失效时长+current_time。
3 楼 calmness 2007-05-29  
balaschen 写道

    if (exptime > REALTIME_MAXDELTA)
        return (rel_time_t) (exptime - stats.started);
    else {
        return (rel_time_t) (exptime- current_time);
    }


代码很简单,假如失效时间是120妙,那么计算后的失效时间就是120+current_time(当前时间和server启动时间差)


应该是减吧,120-current_time or 120-stats.started
2 楼 balaschen 2007-05-29  
PS:我自己是通过hack memcache的LRU算法,仅把失效的cache踢出,如果你也需要,可修改:
item.c的item_alloc方法:
for (search = tails[id]; tries>0 && search; tries--, search=search->prev) {
            [b]if (search->refcount==0)[/b] {
                item_unlink(search);
                break;
            }
        }

增加条件:search->exptime && search->exptime <= current_time

另外还可以增加缺省失效时间,这可以通过修改memcahced.c的realtime方法,当exptime=0返回缺省的失效时间(单位为秒)
1 楼 balaschen 2007-05-29  
介绍完memcached的失效实现,再说说memcahced对于失效的cache内存回收时机,
对于失效的cache,严格来说,只有在get操作的时候,才真正回收(可供新的cache使用),网上流传的item_flush_expired()是用来处理过期失效的cache,是一种谬传,这个方法只有在flush_all是,也就是清空memcached所有缓存时,才会执行。
那么如果我们某个cache失效了,但之后我们就不再执行get操作了(比如session过期了),岂不是一直要占据我们宝贵的内存?答案是不一定,如果通过-M选项关闭了LRU算法,答案就是是,如果启用LRU算法,那么在给item分配内存的时候,LRU算法会正确回收失效的缓存。所以-M选项一定要慎用!
另外启用LRU算法时,一定要注意设置足够大的内存,否则未失效的session也可能被踢出。

相关推荐

    memcached缓存使用演示

    **Memcached缓存系统详解与应用实践** Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。它通过将数据存储在内存中,使得数据的读取速度大大提高,...

    搭建Memcached缓存服务器1

    搭建Memcached缓存服务器1 Memcached是一种高性能的缓存服务器,通常用于加速动态网页和减少数据库的负载。在本文中,我们将详细介绍如何搭建Memcached缓存服务器。 标题解释 Memcached缓存服务器是一种流行的缓存...

    php memcached缓存操作类

    在PHP开发中,缓存是提高网站性能的关键技术之一,Memcached是一款广泛应用的分布式内存对象缓存系统。这个“php memcached缓存操作类”旨在简化开发者对Memcached的使用,提供一个方便、高效的接口来处理数据缓存。...

    Memcached缓存机制 用好Cache,优化应用

    3. **缓存失效策略**:采用适当的缓存失效策略,如Least Recently Used (LRU) 或者 Time-to-Live (TTL),来管理内存空间。 4. **负载均衡**:根据服务器的负载情况,动态调整数据的分布,避免单点过载。 ### 源码...

    MemCached 缓存系统配置说明

    这里需要解释说明一下,很多开发者觉得Memcached是一种分布式缓存系统,但是其实Memcached服务端本身是单实例的,只是在客户端实现过程中可以根据存储的主键做分区存储,而这个区就是Memcached服务端的一个或者多个...

    memcached缓存

    memcached 缓存 jar包,tomcat共享缓存可用,java开发数据库缓存也可用。

    韩顺平 PHP Memcached缓存技术资料源码笔记图解PPT_Ady

    Memcached是一款分布式内存对象缓存系统,广泛应用于高性能网站和应用中。它设计的目标是简化并加速动态Web应用程序的数据存储,通过将数据存储在内存中,避免频繁读取或写入数据库,从而提高系统响应速度。 二、...

    使用spring aop对web 应用数据进行memcached缓存

    标题 "使用Spring AOP对Web应用数据进行Memcached缓存" 涉及到的关键技术是Spring AOP(面向切面编程)和Memcached,这是一种常见的高性能、分布式内存对象缓存系统。在Web应用程序中,使用缓存可以显著提高数据访问...

    memcached缓存处理

    **memcached缓存处理** **一、什么是memcached** `memcached`是一个高性能、分布式内存对象缓存系统,用于在动态系统中减少数据库负载。它通过将数据存储在内存中来加速读取操作,而不是每次请求都去查询数据库。...

    php memcached 缓存

    6. **缓存过期时间**: 存储数据时可以通过设置第三个参数为过期时间(秒),例如`Memcached::set('key', 'value', 3600)`,数据将在1小时后自动失效。 7. **分片存储**: `Memcached`扩展支持基于键的分片,这意味着...

    memcached 缓存图片

    Memcached是一种高性能、分布式内存对象缓存系统,用于在动态应用中减少数据库负载,提高网站性能。它通过在内存中存储数据,使频繁访问的数据能够快速获取,从而减少了对硬盘I/O操作的依赖。在本示例中,我们将探讨...

    memcached缓存服务器

    **Memcached缓存服务器详解** Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。这个“memcached缓存服务器”压缩包提供的版本是1.2.1,适用于...

    memcached缓存安装配置.pptx

    3. 缓存失效率:Memcached 的缓存失效率是指缓存中不存在的数据的百分比。 六、Memcached 的参数 1. `-l` 选项:指定 Memcached 监听的 IP 地址。 2. `-p` 选项:指定 Memcached 监听的端口。 3. `-m` 选项:指定 ...

    memcached缓存服务器64位

    memcached缓存服务器 ,64位安装包 ,内有简单的使用说明

    .net c# memcached缓存获取所有缓存键的方法步骤.docx

    .NET C# Memcached 缓存获取所有缓存键的方法步骤 在软件开发中,缓存机制是提高系统性能和减少数据库访问频次的重要手段之一。Memcached 是一种流行的分布式缓存系统,广泛应用于各种 Web 应用程序中。.NET 平台下...

    SSM整合memcached缓存

    SSM整合Memcached缓存是将Spring、SpringMVC和MyBatis这三大Java Web开发框架与Memcached相结合,以实现高效的数据缓存功能。Memcached是一款轻量级的分布式内存对象缓存系统,用于减少数据库负载,提高应用程序性能...

    缓存服务器memcached下载

    **缓存服务器Memcached详解** Memcached是一款高性能、分布式内存对象缓存系统...正确地使用和配置Memcached,可以有效地提高系统的整体效率。在实际应用中,结合具体业务场景,不断优化和调整,才能充分发挥其优势。

    memcached缓存数据库jar包

    因此,将`memcached`的jar包放入`$CATALINA_HOME/lib`目录,可以确保在运行Web应用时,能够正确加载并使用`memcached`的相关功能。 在实际操作中,你需要: 1. 下载对应的`memcached` Java客户端库,例如...

    Memcached缓存技术资料源码

    **Memcached缓存技术详解** Memcached是一款高性能的分布式内存对象缓存系统,它被广泛应用于Web应用中,用于缓解数据库的压力,提高数据访问速度。本文将深入探讨Memcached的基本概念、工作原理、安装配置、使用...

Global site tag (gtag.js) - Google Analytics