我们在Ruby on Rails应用程序中使用Memcached。我正在尝试更详细地研究它,并在每个请求结束时我注销CACHE.stats[:curr_items]
的值,我认为是缓存中保存项目的数量。
我在请求的开头和结尾记录了CACHE.stats[:curr_items]
的值,这样我就可以看到在该请求中有多少新东西被保存到缓存中(页面加载)。很多时候,这是一个负数 - 也就是说,CACHE.stats[:curr_items]
的价值已经下降。
我无法理解它为什么会减少。我们永远不会删除任何缓存键,我无法想象为什么它只会通过重新加载相同的页面而减少。
我也希望CACHE.stats[:curr_items]
在做CACHE.flush
之后变为0,但它保持不变。
我有另一种列出当前memcache密钥的方法,它使用telnet连接到memcache并使用stats items
和stats cachedump
列出当前密钥。这个数字通常与CACHE.stats[:curr_items]
不同,而且,如果我做CACHE.flush
,也不会变为零。
谁能解释一下CACHE.stats[:curr_items]
究竟做了什么?
另外,为什么这些方法在CACHE.flush
之后都没有变为零?也许CACHE.flush使缓存键无效,但实际上并没有删除它们。这是公平的,如果是这样的话,也是有道理的。
编辑:我刚做了一个实验:
> CACHE.stats[:curr_items]
=> [529]
> CACHE.stats[:total_items]
=> [1080]
> stored = CACHE.add("qwrexcv#{rand(10000000)}", User.last, 604800)
=> nil
> CACHE.stats[:curr_items]
=> [529]
> CACHE.stats[:total_items]
=> [1081]
所以,我在缓存中添加了一个新东西。 curr_items保持不变,total_items也增加了,这进一步支持了curr_items不是我认为的那种想法。
如memcached docs中所述,curr_items
显示当前缓存中的项目数。 total_items
是自服务器启动以来保存的所有项目的数量。
据我所知,curr_items
计数器有四种减少方式:(i)删除密钥,(ii)刷新,(iii)到期,以及(iv)缩小memcached服务器可用的内存。驱逐通常不会减少物品,因为物品通常被驱逐以为新物品腾出空间。
flush_all
memcached命令确实将curr_items
计数器设置为0,至少在memcached 1.5中。您可以使用telnet连接验证。对于memcached 1.4,行为可能会有所不同,因为很多版本已从1.4版更改为1.5版。