gpt4 book ai didi

Memcached、锁定和竞争条件

转载 作者:行者123 更新时间:2023-12-03 12:49:10 25 4
gpt4 key购买 nike

我们在写入数据库时​​尝试更新 memcached 对象,以避免在插入/更新后必须从数据库中读取它们。

对于我们的论坛帖子对象,我们有一个 ViewCount 字段,其中包含查看帖子的次数。

我们担心我们会通过更新 memcached 对象来引入竞争条件,因为可以在场中的另一台服务器上同时查看同一个帖子。

知道如何处理这些问题 - 似乎需要某种锁定,但如何在场中的服务器之间可靠地做到这一点?

最佳答案

如果您正在处理不一定需要实时更新的数据,并且对我来说 View 计数就是其中之一,那么您可以将 expires 字段添加到存储在 memcache 中的对象中。

一旦到期,它将返回数据库并读取新值,但在此之前它将不理会它。

当然,对于新帖子,您可能希望更频繁地更新此内容,但您可以为此编写代码。

Memcache 仅在其中一个实例中存储您的对象的一份副本,而不是在其中的许多实例中,因此我不会担心对象锁定或任何事情。那是由数据库处理,而不是您的缓存。

编辑:

Memcache 不保证当您从不同的服务器获取和设置数据时,您的数据不会被破坏。

来自内存缓存文档:

  • 一系列命令不是原子的。如果您对某个项目发出“get”,对数据进行操作,然后希望将其“设置”回 memcached,则不能保证您是唯一处理该值的进程。同时,您最终可能会覆盖由其他东西设置的值。

  • 竞争条件和陈旧数据

    在设计应用程序以缓存数据时要记住的一件事是如何处理竞争条件和偶尔的陈旧数据。

    假设您缓存了最新的五个评论以显示在应用程序的侧边栏上。您决定数据只需要每分钟刷新一次。但是,您忘记了,此侧边栏显示每秒渲染 50 次!因此,一旦 60 秒左右并且缓存过期,突然 10 多个进程正在运行相同的 SQL 查询以重新填充该缓存。每次缓存过期时,都会导致 SQL 流量突然爆发。

    更糟糕的是,您有多个进程更新相同的数据,而错误的进程最终会与缓存约会。然后你有过时的,过时的数据漂浮。

    应该注意填充或重新填充缓存时可能出现的问题。请记住,检查 memcached、获取 SQL 和存储到 memcached 的过程根本不是原子的!

    关于Memcached、锁定和竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1608902/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com