1、是不是热点数据?
所谓热点,一般是遵循二八定律,即百分之八十的访问集中在百分之二十的数据上。
2、是不是读比写多?
这个比例一般为2:1。
4.2 什么时候不应该使用缓存?
反过来就是了。
1、没有热点数据不要使用缓存,也没什么意义。
因为内存资源是比较宝贵的。
2、频繁修改的数据不要使用缓存。
因为可能写入后还来不及读取就已失效或被淘汰,并且容易产生脏读。
4.3 合理使用缓存
最后,最重要的是确认是否需要使用缓存?
确定了后,再选择合适的缓存工具及使用缓存的方式。
5. 缓存时常见的一些问题
使用缓存优点很多,但也存在一些很常见的问题。双刃之剑,就看怎么用了。
列举一些我们工作中常见的一些缓存问题,并给出至少一种解决方案。
5.1 缓存更新带来的数据不一致与脏读
缓存更新的常见策略有:
1、先更新数据库再更新缓存;
2、先更新数据库再删除缓存;
3、先删除缓存再更新数据库;
4、定时清理缓存;
5、有请求访问数据时,判断缓存是否过期,过期从数据库中刷新缓存。
在这几种方案中,如果修改缓存与数据库不在同一个事物中,就带来了数据不一致和脏读的问题。
对应方案1:先删除缓存再更新数据库,并且在同一个事物中。
对应方案2:缓存自动失效后,另外的异步线程进行缓存更新。
对应方案3:缓存更新在并发、分布式要考虑锁,redis天生就是单线程,比较有优势。
5.2 怎么做缓存预热
缓存预热是指在用户可访问服务之前,将热点数据加载到缓存的操作,这样可以有效避免上线后瞬时大流量造成系统不可用。
缓存预热的一般性策略:
1、开发个缓存刷新功能,手工刷新;
2、项目启动的时候自动进行加载(一般为字典表等数据量不大的数据);
3、设置个定时器,自动刷新缓存;
4、提前统计热点数据,事先批量加载到如redis这样缓存工具中。
5.3 缓存重建
缓存失效后,重建热点缓存,如果耗时较长,在重建过程中,性能、负载不好。
对应方案:
1、正常情况下,交错缓存失效时间,减轻缓存压力;
2、崩溃失效的情况下,可以使用带持久化功能的缓存来恢复,比如Redis;
3、如果是MongoDB则不太一样,它是采用mmap来将数据文件映射到内存中,所以当MongoDB重启时,这些映射的内存并不会清掉,不需要进行缓存重建与预热。
5.4 缓存雪崩与可用性