redis的缓存雪崩、缓存穿透、缓存击穿都代表什么。
他们之间又有啥区别呢。
缓存雪崩:是缓存同时过期
缓存穿透:是缓存和数据库都没有
缓存击穿:是大量请求访问某一个点的缓存
要值得注意的是,这里说到的永不过期并不是将热点数据存在时间设置为无限制。而是将过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的重建。
从实战看,这种方法对于性能非常友好,唯一不足的就是重建缓存时候,其余线程(非重建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。
public String get(Sting key){
V v = redis.get(key);
String value = v.getValue();
long timeout = v.getTimeout();
if (v.timeout <= System.currentTimeMillis()){
// 异步更新后台异常执行
threadPool.execute(new Runnable(){
public void run(){
String keyMutex = "mutex:" + key;
if(redis.setnx(keyMutex, "1")){
//3 min timeout to avoid mutex holder crash
redis.expire(keyMutex, 3 * 60);
String dbValue = db.get(key);
redis.set(key, dbValue);
redis.delete(keyMutex);
}
}
});
}
return value;
}