当Redis缓存被清除时,如何处理高流量



我正在使用下面的代码将数据缓存到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缓存为空,并被发送到数据库,这导致了大量的数据库调用&阻塞整个网络,导致大量网关超时错误。

您可以尝试XFetch算法:最优概率缓存戳预防,它可以进行概率早期过期。

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。这样最热门的密钥就永远不会过期。

最新更新