Memcached不尊重缓存过期

时间:2016-02-09 20:20:59

标签: .net nhibernate memcached

问题

似乎无论我们将memcached配置为什么值作为到期时间,高速缓存中的所有项都会获得5分钟的到期时间。

我们尝试过什么

  • 使用0到期时,所有文档都表明这意味着项目永远不会过期。
  • 使用600秒的到期时间。
  • 将来几个小时使用Unix时间戳(例如1455058122)。

在所有情况下,当一个项目被缓存并且我检索到cachedump时,到期时间戳将来只有5分钟。

这非常令人沮丧,因为除了这个主要缺陷外,memcached的工作非常棒。

设置

  • .NET 3.5
  • Visual Studio 2015
  • NHibernate 3.1.0.4000
  • EnyimCached 2.3.0.0
  • Memcached 1.4.5_4_gaa7839e

的Web.config

<enyimmemcache>
    <memcached protocol="Binary">
        <servers>
            <add key="MemcachedAddress" address="127.0.0.1" port="11211" />
            <!-- Add new servers here -->
        </servers>
        <socketPool connectionTimeout="00:00:02" />
        <cache region="system" expiration="0" priority="5" />
    </memcached>
</enyimmemcache>

Hibernate配置

<property name="cache.provider_class">NHibernate.Caches.EnyimMemcached.MemCacheProvider,NHibernate.Caches.EnyimMemcached</property>
<property name="cache.use_second_level_cache">true</property>

Stats.bat

@echo off>nul

setlocal EnableDelayedExpansion

IF "%1"=="-o" rm dump.log

set SAVESTAMP=%DATE:/=-%@%TIME::=:%

echo --------------[%SAVESTAMP%]-------------- >> dump.log

echo stats items | nc 127.0.0.1 11211 > statsitems

SET myvar=""

FOR /f "tokens=1,2,3 delims=:" %%i in (statsitems) do (
    if NOT %%j==!myvar! (
        SET myvar=%%j
        echo stats cachedump !myvar! 1000000 | nc 127.0.0.1 11211 >> dump.log
    )
)

rm statsitems

1 个答案:

答案 0 :(得分:0)

解决方案

因此事实证明我对该主题的分散信息来源导致我使用不正确的配置设置。最后,我决定从github上获取Enyim源并自己调查这个问题,结果发现web.config中的配置甚至没有被使用。由于Enyim正在寻找名为enyim.com的部分,而我正在使用com.enyim,因此请使用语法。正确的配置如下。

<强>的Web.config

<sectionGroup name="enyim.com">
    <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
    <section name="log" type="Enyim.Caching.Configuration.LoggerSection, Enyim.Caching" />
</sectionGroup>

<enyim.com>
    <log factory="Enyim.Caching.Log4NetFactory, Enyim.Caching.Log4NetAdapter" />
    <memcached protocol="Binary">
      <servers>
        <add address="127.0.0.1" port="11211" />
        <!-- Add new servers here -->
      </servers>
      <socketPool connectionTimeout="00:00:02" />
    </memcached>
</enyim.com>

<强> Hibernate.config

<property name="cache.provider_class">NHibernate.Caches.EnyimMemcached.MemCacheProvider,NHibernate.Caches.EnyimMemcached</property>
<property name="cache.use_second_level_cache">true</property>
<property name="cache.default_expiration">2419200</property>

所以我们拥有它。所有商品的有效期均为28天,memcached完美无缺。