在 Memcached 中存储大对象

use*_*286 5 memcached caching spymemcached

我在 Memcached 中存储了一个大小为 7-10MB 的对象,在放置该对象后,尝试检索它。在这种情况下我会遇到缓存未命中的情况。知道为什么吗?该解决方案适用于较小的物体尺寸。

背景信息:

我使用 Memcached 存储一组大约 7-10 MB 大小的大型对象。由于某种原因,我不可能将该对象拆分为多个较小的键。我希望缓存是冗余且温暖的,因此,我使用稍微复杂的缓存放置过程,如下所述:

keySet = makeRedundantKeys(key) // Appends a unique num to the key
putAsync(keys in keyset)
while(!timeout || countNonNullKeys > desiredQuorumOfKeys) {
    countNonNullKeys = getSyncKeys(key in keySet)
    sleep(backoffTime);
}
Run Code Online (Sandbox Code Playgroud)

我遇到很多失败,其中 getSyncKeys 需要大约 700 毫秒才能获取一个密钥。知道为什么会发生这种情况吗?仅对于大物体才能观察到这种情况。<1MB 的较小对象可以正常工作并在 ~2ms pAvg 内返回数据。这些是良好的 m4.2xlarge EC2 主机,具有高网络性能。另外,我的 TCP 重传段图飙升至 1500/分钟,这看起来很可疑。

jay*_*oby 6

默认情况下,memcached 只会存储最大 1MB 的对象:

许多人要求 memcached 能够存储大于 1MB 的项目,虽然通常建议不要这样做,但现在命令行上支持它。

您可以使用 -I 选项来增加此值

在你的情况下,你需要设置-I10m. 您正在使用 AWS,因此如果您运行自己的 memcached 服务器,您将能够自己执行此操作,但如果您使用 AWS Elasticache,则需要创建一个参数组,将max_item_size1MB 更改为( 1048576) 到 10MB ( 10485760) 并将其应用到需要重新启动的 Elasticache 集群。