保持PHP中缓存对象的视图的最佳位置?

时间:2010-12-14 23:42:48

标签: php caching memcached

我的应用程序缓存页面,因此不会对数据库发出不必要的请求。它们作为文件系统中的文件缓存,具有适当的名称(它们的唯一标识符)。

我需要能够保留这些缓存页面的查看次数,一种方法是将它们存储在 memcached 中,并每次将值递增1。清理缓存后,将使用批量查询在数据库中收集和更新值。

我不确定这是个好主意,因为我注意到访问memcached会降低速度。有没有更好的解决方案?

编辑:我没有缓存小字节的数据,我正在缓存HTML页面,以及其中很多。每个用户大约有30个页面,有一百万用户需要缓存的数据量很大。

3 个答案:

答案 0 :(得分:1)

我会设置一个夜间运行的cronjob来解析访问日志文件并更新计数。我不确定memcache方法(还没有尝试过),但如果你每次请求更新数据库,我认为它不会非常有效。更新查询很昂贵,更新计数列将涉及至少锁定行。

或者,您可以在每个视图的“views”表中插入记录,然后每晚运行一个cronjob来聚合视图计数,将其添加到pages表中的“views”列,然后清除记录聚合

然后,如果您可以使用第三方,也可以使用Google Analytics(分析)。

答案 1 :(得分:1)

缓存有其缺陷,主要是你所描述的。使用缓存时,您要么获得快速读取时间,要么损害最新数据;或者在不使用缓存时获取较慢的读取时间,但使用最新数据。

在我看来,实时更新缓存首先会使缓存点无效。你最好实时编写数据库并从缓存中读取数据。您只需及时更新缓存,以使前端尽可能保持最新状态(此最新声明具有高度相关性)。

答案 2 :(得分:1)

  

我不确定这是个好主意,而且   因为我注意到访问   memcached减慢速度。有没有   更好的解决方案?

INCR / DECR

我不明白?他们在memcached中有incr/decr个命令,特别是这个命令应该是闪电般的。

我查了一些benchmarks

[patg@vidya perl]$ ./memtest.pl -l 1000
Operation  Cache::Memcached libmemcached   C::M/libmem %  libmem/C::M % 
set        0.083264         0.061046       136.40         73.32         
get        0.164471         0.054142       303.78         32.92         
replace    0.081321         0.060575       134.25         74.49         
increment  0.080247         0.056108       143.02         69.92         
decrement  0.07893          0.052921       149.15         67.05         
delete     0.07416          0.056302       131.72         75.92         
total      0.562456         0.341165       164.86         60.66         
[patg@vidya perl]$ ./memtest.pl -l 10000
Operation  Cache::Memcached libmemcached   C::M/libmem %  libmem/C::M % 
set        0.838437         0.63161        132.75         75.33         
get        1.676396         0.552247       303.56         32.94         
replace    0.846411         0.615959       137.41         72.77         
increment  0.812054         0.538519       150.79         66.32         
decrement  0.787005         0.532655       147.75         67.68         
delete     0.744186         0.515013       144.50         69.20         
total      5.7046           3.386127       168.47         59.36         
[patg@vidya perl]$ ./memtest.pl -l 100000
Operation  Cache::Memcached libmemcached   C::M/libmem %  libmem/C::M % 
set        8.436679         6.469707       130.40         76.69         
get        16.641089        5.553091       299.67         33.37         
replace    8.438474         6.239129       135.25         73.94         
increment  8.110361         5.765341       140.67         71.09         
decrement  8.272824         5.615784       147.31         67.88         
delete     7.648199         5.32153        143.72         69.58         
total      57.547827        34.964783      164.59         60.76

争用

你还在使用mysql吗?也许你在mysql上有contention,这就是为什么慢?因为incr / decr应该快?