首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

正确认识memcached的缓存失灵

2012-10-30 
正确认识memcached的缓存失效最近javaeye上memcached相当火,不少人把它当作sna架构的中心session服务器来

正确认识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的失效,必须在每次访问的时候,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返回缺省的失效时间(单位为秒) 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 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。 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","");

热点排行