【问题标题】:PHP Memcache potential problems?PHP Memcache 潜在问题?
【发布时间】:2011-04-13 23:45:29
【问题描述】:

我很可能会使用 MemCache 来缓存一些数据库结果。 由于我从未编写过缓存并做过缓存,所以我认为问问那些已经做过缓存的人是个好主意。我正在编写的系统可能在某个时间点具有并发运行脚本。这就是我打算做的事情:

  1. 我正在编写一个横幅交换系统。
  2. 有关横幅的信息存储在数据库中。
  3. 有不同的站点,具有不同的流量,加载一个 php 脚本,为这些横幅生成代码。 (以便横幅显示在客户的网站上)
  4. 第一次显示横幅时 - 它会使用 memcache 进行缓存。
  5. 横幅的缓存寿命为 1 小时。
  6. 缓存每小时更新一次。

我在此任务中看到的潜在问题出现在第 4 步和第 6 步。 例如,如果我们有 100 个流量很大的站点,则脚本可能会同时运行多个实例。怎么保证缓存过期后会重新生成一次,数据完好无损?

【问题讨论】:

    标签: php postgresql memcached simultaneous


    【解决方案1】:

    如何保证缓存过期后重新生成一次,数据完好无损?

    由于没有更好的词,我采用的缓存方法是“惰性”实现。也就是说,在检索一次之前,您不会缓存某些内容,希望有人会再次需要它。这是该算法的伪代码:

    // returns false if there is no value or the value is expired
    result = cache_check(key)
    
    if (!result)
    {
        result = fetch_from_db()
    
        // set it for next time, until it expires anyway
        cache_set(key, result, expiry)
    }
    

    只要您明智地使用缓存并了解并非所有信息都相同,这对于我们想要使用它的用途非常有效。例如,在假设的用户评论系统中,您不需要 过期时间,因为您可以在新用户对文章发表评论时简单地使缓存无效,以便下次加载 cmets ,它们被重新缓存。但是,由于您不依赖用户输入来更新数据,因此某些信息(想到天气数据)应该手动设置过期时间。

    不管它的价值如何,memcache 在集群环境中运行良好,您应该会发现设置类似的东西并不难,因此它应该很容易扩展到您需要的任何东西。

    【讨论】:

    • 在我的情况下,虽然缓存必须有过期时间,因为用户没有任何操作可以做,而不是假设读取“读取 cmets”。感谢您的信息! :)
    • 同意,您的情况更像是我使用的天气数据隐喻。但是我阐述的算法应该仍然适用于您的情况,并且它比按时间顺序填充该缓存更安全(尽管除此之外添加按时间顺序的人口可能会有所帮助)。
    • 再问一个问题 - 使用上面的代码执行此操作会遇到同时运行脚本的问题吗?例如,如果同时运行 2 个脚本,它们将如何设法同意谁将首先设置缓存以及谁应该读取它?他们俩都会看到缓存的结果不存在,并会尝试设置它。这会导致错误或问题吗?
    • 根本不应该是一个问题 - 正如你所说,它们都会从数据源中读取,并且一个会覆盖另一个。只要您不执行相关操作(例如递增缓存值等),这不是问题。只要您只是抓取数据并对其进行缓存,那么这些数据在短时间内应该是相同的。如果不是,请限制数据的边界,使其成为您缓存的可预测间隔(因此,如果您在上午 12 点运行脚本,请仅考虑在晚上 11:59:59 之前创建的数据)。跨度>
    • 再次感谢吉米的帮助!一切似乎都很合乎逻辑:)
    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多