为什么memcache不自动更新

#1 totalstotal

有个页面的数据需要memcache缓存,这个功能2月底就已经做好了的,可是用memcache类的getExtendedStats查询这个页面一个memcache变量的详细信息时,发现其超时时间是3月14号的,这个日期不是早就过了么,怎么里面变量的数据还没被注销掉,还是那天的?自己弄了个20秒后过期的测试程序,发现运行也是正常的。可能原因是什么?

2013-03-26 12:02:03

#2 jake

这个要从memcache的过期机制说一下

当memcache的变量过期,一般只会在索引层做一个删除标识,而真实在内存里面的变量数据是不会被删除。当下一次get该变量的时候,会发现索引上面的删除标识,而被返回false。

那么变量数据什么时候删除呢?memcache不会主动删除数据,而是直接把新的数据盖上去。因为memcache只认自己索引上面的变量,索引以外的都当作是空闲的空间。

memcache这样做有两个原因:1. 因其存在内存。2. 删除其实很麻烦。

其实现在windows,linux等等的磁盘也是这样用的,比如说php里面删除文件的函数叫unlink,意思就是文件索引“不再链接”该文件了,那么就是“删除文件”了。

2013-03-26 13:07:31

#3 totalstotal

谢谢!了解了memcache的一点深入机制了,可是为什么过期时间是3月14号的变量没有被添加删除标记呢?我是用 if($memcache->get()){直接调用}else{按键名重生成覆盖} 这种方法的,可实际是一个在set时设置了超时值为3600的memcache缓存,状态中的过期时间一直都是3月14号?无论怎么刷都不过期?服务器是 windows的,最近这些天还出现过memcache连接不稳定,刷新多次,有时提示不能连接到memcache,有时正常,难道要更新版本?

2013-03-26 13:39:23

#4 jake

不是没有添加删除标签,而是在 $memcache->get() 的时候会返回false。用起来就好像已经删除了一样,内存空间也会被释放。

windows做服务器,链接不正常是正常的~~~最好用linux

2013-03-26 16:17:35

#5 totalstotal

谢谢,还是重新部署在linux吧。

2013-03-28 12:44:11