我正在使用下面的代码将数据缓存到我的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缓存为空,并被发送到数据库,这导致了大量数据库调用&阻塞了整个网络,导致了大量Gateway超时错误。
发布于 2022-01-18 00:19:30
您可以尝试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。这样最热的钥匙就不会过期。
https://stackoverflow.com/questions/70743154
复制相似问题