Memcached 不遵守缓存过期

Memcached not honouring cache expiry

问题

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

我们的尝试

在缓存项目并且我检索缓存转储的所有情况下,过期时间戳只有 5 分钟后。

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

设置

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>

休眠配置

<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

解决方案

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

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 完美运行。