캐시 스탬피드(Cache Stampede) 현상
Last updated
Last updated
redisTemplate.opsForValue().set(key, value, randomTTL(), TimeUnit.SECONDS);@Scheduled(fixedRate = 60000)
public void refreshCache() {
List<String> keys = getFrequentKeys();
keys.forEach(key -> {
Object data = database.fetchDataForKey(key);
redisTemplate.opsForValue().set(key, data);
});
}String lockKey = "lock:" + key;
if (redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 5, TimeUnit.SECONDS)) {
try {
// DB에서 데이터 조회 후 캐싱
String value = database.findDataByKey(key);
redisTemplate.opsForValue().set(key, value, 1, TimeUnit.HOURS);
} finally {
// 잠금 해제
redisTemplate.delete(lockKey);
}
}
String value = redisTemplate.opsForValue().get(key);
if (value == null) {
// DB에서 조회 후 갱신
value = database.findDataByKey(key);
redisTemplate.opsForValue().set(key, value, 1, TimeUnit.HOURS);
}