正确认识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); }}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;}