【问题标题】:How to handle high traffic when Redis cache is cleared?Redis缓存被清除时如何处理高流量?
【发布时间】:2022-01-18 09:05:19
【问题描述】:

我正在使用下面的代码行将数据缓存到我的 NextJS 网站上的 Redis 中。但是,Redis 缓存会在 5 分钟后过期。

const getFromCache = async (key, getter) => {
    const cached = JSON.parse(await redisGetKey(key))
    if (cached) {
        return cached
    } else {
        const data = await getter() // Getter function could be any database call to get data
        redisSetEx(key, 5 * 60, JSON.stringify(data))
        return data
    }
}

Redis缓存不存在,一秒内收到海量请求,如何处理?目前,在这种情况下,所有这些请求都发现 Redis 缓存为空,并被发送到数据库,这会导致大量数据库调用和阻塞整个网络,从而导致大量网关超时错误。

【问题讨论】:

    标签: node.js caching redis next.js


    【解决方案1】:

    您可以尝试使用 XFetch 算法:Optimal Probabilistic Cache Stampede Prevention,它会进行概率性提前到期。

    function XFetch(key, ttl; β = 1)
        value, ∆, expiry ← CacheRead(key)
        if !value or Time() − ∆β log(rand()) ≥ expiry then
            start ← Time()
            value ← RecomputeValue()
            ∆ ← Time() – start CacheWrite(key, (value, ∆), ttl)
        end
        return value
    end
    

    它会在密钥过期之前概率性地重新计算值。详情请查看论文。

    另一种解决方案

    如果您知道哪些键是最热的,您可以有一个额外的线程/进程来执行计算,即redisGetKey,并在键过期之前更新值和 TTL。让最热门的密钥永不过期。

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 2016-09-10
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 2020-08-30
      • 1970-01-01
      相关资源
      最近更新 更多