正确认识memcached的缓存失效


网站: JavaEye 作者: balaschen 发表时间: 2007-05-29 10:56 此文章来自于 http://www.iteye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://www.iteye.com/topic/84142

最近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操作。




《 正确认识memcached的缓存失效 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>

推荐相关文章:
   从分布式系统的角度看REST
   Java开源框架发展的遐想




JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值