关于spAccess,求解惑求思路

#1 SunPSP

关于spAccess的一个小疑问:
貌似spAccess过期自动删除是在第二次访问的时候触发的
那么如果某个资源很悲催的在第一次出发生成缓存之后就再没人访问了
这个缓存不就无法被触发清除了?就这么一直占着空间不释放了?
几个好说,要是多了不就是个悲剧啊。。。。

不是没这个可能,做时效性较短的网站出现这个情况的概率很高
正热的情况下没问题,不断有人请求,生成清除转得的过来
一旦过了这一阵,没人关注了自然就没人访问这个资源了
那么这个时候这个缓存就不会被触发清除程序,也就一直存在了?

然后为了达到不会因为某个请求触发了清除程序而出现找不到资源的情况
一般设计程序的时候的思路是先尝试读取该记录的缓存
缓存不存在再从数据库读取生成缓存同时输出
这样出现的情况就是
无论如何,只要有请求,那么这个缓存就一定会出现
因为程序设计的时候就是如此,如果没有则生成,如果过期则删除旧的再生成新的
而在有请求的时候,这个缓存即使过期了也会因为无法触发清除程序而一直存在

目前我的方法是定时清除全部缓存
不管有没过期全部杀掉然后让其自行根据访问情况再生成
这样出现的一个问题就是在清除缓存后的一段时间内,CPU动不动狂飙,居高不下很痛苦
求各路大神上仙解惑,最好能给个思路解决这个问题

2013-03-15 08:35:12

#2 jake

缓存的出现,本身就是为了热数据可以更快地重用,对冷数据,也就是没人访问的数据或者很久才有人访问一次的数据,就不要用了,提高也提高不了多少性能。

删除缓存,基本上是全部删除,或者基于某些策略删除——比如说每次随机删除五分之一。

缓存清理后,的确会出现所谓的“雪崩”情况,也就是大量的新缓存重建。但是如果冷热数据分开后,这情况会减轻很多。

对楼上,我有几个建议:

1. 缓存的基本逻辑就是这样的。所以你可以尝试按业务逻辑来进行缓存的生成,业务逻辑把冷热数据区分开,比如说当月的文章进行缓存,从前的文章不缓存。

2. 清除缓存可以全盘清除,也可以按上面所说的区分冷热数据删除,每个生成的缓存都是有记录的,所以要区分也不难。通常是使用定时任务,在系统负载比较小的时候,比如说凌晨进行清除。不过,缓存本来就是“空间换时间”,可不能不舍得“空间”。

3. spAccess一开始默认的是文件缓存,如果在上面说的两条建议之后,还是无法解决性能问题(不够快,或者雪崩情况非常严重),那么你的系统规模估计需要考虑用spAccess的其他缓存类型了,比如APC或者memcache等支持

2013-03-15 09:00:28