其他
当周杰伦把QQ音乐干翻的时候,作为程序猿我看到了什么?
点击蓝字关注我吧
1
别人都会唱了,而我还没付钱!
1
知识结构的差别
导致我们看的角度不同
主角迈克进入监狱救他哥哥,他走进了监狱,看到了那所监狱。
那一瞬间,我才发现迈克是个建筑学家。
他看到的监狱和我看到的监狱根本不是同一个监狱,。
我看到的是囚牢、操场、移动的犯人和狱卒。
而迈克一走进去,他看到的是通风管道、下水管道、紧急通道,他看到了墙后面所有的东西。
我这时意识到了一点,建筑学家跟我们因为知识背景和知识框架的不同,我们看到的是两个不一样的世界。
这是知识结构的差别带来的我们眼睛看到的世界的截然不同。
中间的架构图是我随便找的,和QQ音乐无关
1
正文开始
1
缓存击穿
缓存击穿的概念
缓存击穿
缓存击穿的解决方案
String get(String jay) {
String music = redis.get(jay);
if (music == null) {
//nx的方式设置一个key=jay_lock,
//value=aiwobieku_lock的数据,60秒后过期
if (redis.set("jay_lock", "aiwobieku_lock","nx",60)) {
//从数据库里获取数据
music = db.query(jay);
//构建数据,24*60*60s后过期
redis.set(jay, music,24*60*60);
//构建成功,可以删除互斥锁
redis.delete("jay_lock");
} else {
//其他线程休息100ms后重试
Thread.sleep(100);
//再次获取数据,如果前面在100ms内设置成功,则有数据
music = redis.get(jay);
}
}
}
后台续命的另一种展示
永不过期
周董发新歌,鹿晗爱晓彤,唱跳rap和篮球的流量。
这个需求特别急,最好明天就上线。上线流量马上来,你的系统要抗住。
熬夜加班通宵干,终于爆肝弄上线。
结果上线没动静,他说商户不接了。
1
缓存穿透
缓存穿透
比如明明是周杰伦的演唱会,你冲过保安大哥,上台对周董说:"给我来个林俊杰的签名"。
最可恶的是你也知道,周杰伦那里没有林俊杰的签名。
恶意请求,占用资源。当有成千上万这样的恶意请求的时候,你不做处理,就会给周杰伦,哦不,数据库带来压力。
缓存穿透的解决方案
缓存空对象
第一个问题:如果在某个时间,缓存为空的记录,在数据库里面有值了,你怎么办?
解决方法一:设置缓存的时候,同时设置一个过期时间,这样过期之后,就会重新去数据库查询最新的数据并缓存起来。
解决方法二:如果对实时性要求非常高的话,那就写数据库的时候,同时写缓存。这样可以保障实时性。
解决方法三:如果对实时性要求不是那么高,那就写数据库的时候给消息队列发一条数据,让消息队列再通知处理缓存的逻辑去数据库取出最新的数据。
第二个问题:对于恶意攻击,请求的时候key往往各不相同,且只请求一次,那你要把这些key都缓存起来的话,因为每个key都只请求一次,那还是每次都会请求数据库,没有保护到数据库呀?
本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。
看到了吗,redis不仅仅是拿来做缓存的。这就是一个知识点呀。
1
缓存雪崩
缓存雪崩的解决方案
redis.set(key,value,10*60+RandomUtils.nextInt(0, 60),TimeUnit.SECONDS)
鲁棒性(robustness)就是系统的健壮性。它是指一个程序中对可能导致程序崩溃的各种情况都充分考虑到,并且作相应的处理,在程序遇到异常情况时还能正常工作,而不至于死机。
1
缓存之外
2000000/30/60=1111
1
总结
知识结构的差别,带来的我们眼睛看到的世界的截然不同。
1
表白这个男人
往期精彩回顾
走心---普通二本,毕业三年,北漂之后,我是怎么成为程序猿的。
图:why技术
文:why技术
排版:why技术
扫码查看更多内容