作者回复: 很有创意👍👍
作者回复: 我对mysql比较熟,以下仅限mysql:
1. mysql第一种缓存叫sql语句结果缓存,但条件比较苛刻,程序员不可控,我们的dba线上都关闭这个功能,具体实现可以查一下
2. mysql第二种缓存是innodb buffer pool,缓存的是磁盘上的分页数据,不是sql的查询结果,sql的执行过程省不了。而mc,redis这些实际上都是缓存sql的结果,两种缓存方式,性能差很远。
因此,可控性,性能是数据库缓存和独立缓存的主要区别
作者回复: 现学现用的案例,很赞👍👍
作者回复: 确实,细节不少,可以写本书了😃
作者回复: 很用心,赞👍
作者回复: 你们的缓存设计有点复杂,还不如调整业务,越复杂的方案越容易出错,参考架构设计原则
作者回复: 没法保证,这类数据允许一定的不一致,一定范围内的对用户也没有影响,不要只从技术的角度考虑问题,结合业务考虑技术
作者回复: 1. 限流
2. 容器化+动态化
3. 业务降级,例如限制评论
作者回复: 前后端分离,在node上缓存和渲染试试
作者回复: 通常有几种做法:
1. 同步刷新缓存:当更新了某些信息后,立刻让缓存失效。
这种做法的优点是用户体验好,缺点是修改一个数据可能需要让很多缓存失效
2. 适当容忍不一致:例如某东的商品就是这样,我查询的时候显示有货,下单的时候提示我没货了
3. 关键信息不缓存:库存,价格等不缓存,因为这类信息查询简单,效率高,关系数据库查询性能也很高
作者回复: 1.是的,所以加内存才是根本解决方式
2. 这是分级缓存策略
作者回复: 缓存持久化是一个不错的方法
作者回复: 这种做法会经常出现一些线上小问题
作者回复: 除非特殊场景,一般我还是建议尽量用简单直观甚至粗暴的方案😂
作者回复: 穿透和击穿是一个概念,雪崩不是你理解的那样,雪崩的意思就是开始一个小问题越来越大越来越严重,缓存宕机导致的问题算缓存穿透,就是指缓存没作用了
作者回复: 你的分析很对👍
具体在实现的时候,后台更新线程既不能只有一个,也不能和业务线程一样多,一般8~32个就差不多了,因为缓存更新并不会非常频繁。
假如8个线程后台更新也可能导致缓存雪崩,那就要做更多事情了,例如:后台线程更新前先读取一下缓存,存在就不更新。
作者回复: 不会,索性是对已经存在的值建立索性数据结构,值的连续性和大小对数据结构本身没有影响,值的数量才会影响索性的大小和性能