【问题标题】:How exactly memcache removes expired data?memcache 究竟是如何删除过期数据的?
【发布时间】:2018-09-19 16:06:14
【问题描述】:

我正在使用 com.google.appengine.api.memcache.MemcacheService 与 Google Memcache 合作。

存储值时,我设置了 60 秒的过期时间。但是即使在几分钟后,该值仍会从缓存中返回。

使用 Memcache 的代码:

// Config
int expirationSeconds = 60;
Expiration expiration = Expiration.byDeltaSeconds(expirationSeconds);
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();

// Write operation
memcache.put(id, value, expiration);

// Read operation
memcache.get(id);

我预计在这种情况下该值不存在,因为 Memcache documentation 表示 An expired item is removed when someone unsuccessfully tries to retrieve it

为什么仍然从 Memcache 返回过期值?

【问题讨论】:

  • 你是如何配置 Memcache 的?请分享相关代码的sn-p。
  • @Dmitry Grankin 我刚刚测试了您提供的代码,对我来说一切正常(内存缓存中没有值并且返回 null)。你还在遇到这个问题吗?

标签: java google-app-engine memcached


【解决方案1】:

文档中使用了evictedremoved这两个词,可以理解为interchangeable,但它们是aren't

默认情况下,所有值都尽可能长时间地保留在缓存中,直到由于内存压力而被驱逐、被应用明确删除或因其他原因(例如中断)而变得不可用。

in the note here 我们可以看到删除过程是如何工作的:

过期缓存数据的实际删除是延迟处理的。当有人尝试检索过期项目时,它会被移除。

在同一个地方,驱逐是这样解释的:

该值不迟于这个时间被驱逐,尽管它可以由于其他原因更早地被驱逐。增加为现有键存储的值不会更新其过期时间。

Eviction 类似于软删除,其中值不可用但仍在 Memcache 中。 Removal 进行实际删除。

【讨论】:

  • 好的,我明白了。但在我的情况下,MemcacheService 仍会返回过期(驱逐)值。我等待的时间是实际到期时间的两倍。文档说未返回过期值(我希望在我的 Java 代码中使用 null),但仍会返回一个值。至于我,行为和文档不一致。
  • 缓存中有过期数据不是很浪费空间吗?例如:如果 KV 对的ttl 是 10 秒,根据您提到的,10 秒后对象实际上不会被删除。只有当用户尝试检索它并且随后会收到不成功的null 响应时,它才会被删除。
猜你喜欢
  • 2011-12-28
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多