【问题标题】:Memcache not able to fetch valueMemcache 无法获取值
【发布时间】:2015-11-01 11:23:41
【问题描述】:

我在内存缓存中设置了 10000 个键

for i in 1..10000
  Rails.cache.write("short_key#{i}", i)
end

大约 500 秒后(未进行基准测试,但发生在 10m 左右),当我这样做时

_random = rand(10000) 
Rails.cache.read("short_key#{_random}")

返回零。这可以。 Memcached LRU 策略可能已经破坏了这些键。

但是,问题是我看到服务器上有很多可用内存。

另外,当我在 telnet 会话中运行以下命令时,

stats cachedump 1 10

我得到了一些我之前在循环中设置的随机键,即使我尝试通过 rails 或 telnet/get 获取它们,memcached 也无法读取该值。

那些键/值正在消耗内存,但不知何故被破坏了。

我使用dalli 连接memcached。

我该如何纠正这个问题?

【问题讨论】:

    标签: ruby-on-rails memcached dalli


    【解决方案1】:

    乍一看,如果默认保持活动时间值较低(10 分钟或 500 秒都是可能的默认值),这似乎是可能的。

    由于您没有设置expires_in(或等效的time_to_live 字段),因此密钥将设置为默认时间,之后该值将过期。

    转介here

    设置:expires_in 将在缓存上设置过期时间。所有缓存都支持在指定秒数后自动过期的内容。该值可以指定为构造函数的一个选项(在这种情况下,所有条目都会受到影响),也可以提供给 fetch 或 write 方法以仅影响一个条目。

    【讨论】:

    • 我不认为:expires_in 是问题所在。因为dalli默认ttl默认为0,表示没有过期。此外,当我们经常使用某些键时,它们不会消失。
    • @geek_guy 你的 memcached 有多少内存?
    • 16 GB。它现在有 7.5 GB 的可用内存。所以我不认为它的 LRU 会导致关键的驱逐。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多