我正在使用下面的代码将数据缓存到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。这样最热门的密钥就永远不会过期。