Memcached 不遵守缓存过期
Memcached not honouring cache expiry
问题
似乎认为无论我们将 memcached 配置为什么值作为过期时间,缓存中的所有项目都会获得 5 分钟的过期时间。
我们的尝试
- 使用 0 过期时间,所有文档都表明这意味着项目永远不会过期。
- 使用 600 秒的到期时间。
- 使用未来几个小时的 Unix 时间戳(例如 1455058122)。
在缓存项目并且我检索缓存转储的所有情况下,过期时间戳只有 5 分钟后。
这非常令人沮丧,因为 memcached 除了这个主要缺陷外工作得很棒。
设置
- .NET 3.5
- Visual Studio 2015
- NHibernate 3.1.0.4000
- EnyimCached 2.3.0.0
- 内存缓存 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>
休眠配置
<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 完美运行。
问题
似乎认为无论我们将 memcached 配置为什么值作为过期时间,缓存中的所有项目都会获得 5 分钟的过期时间。
我们的尝试
- 使用 0 过期时间,所有文档都表明这意味着项目永远不会过期。
- 使用 600 秒的到期时间。
- 使用未来几个小时的 Unix 时间戳(例如 1455058122)。
在缓存项目并且我检索缓存转储的所有情况下,过期时间戳只有 5 分钟后。
这非常令人沮丧,因为 memcached 除了这个主要缺陷外工作得很棒。
设置
- .NET 3.5
- Visual Studio 2015
- NHibernate 3.1.0.4000
- EnyimCached 2.3.0.0
- 内存缓存 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>
休眠配置
<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 完美运行。