缓存策略

Posted 酒醉三分醒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存策略相关的知识,希望对你有一定的参考价值。

比较简单的缓存策略:

1.失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。

2.命中:应用程序从cache中取数据,取到后返回。

3. 更新:先把数据存到数据库中,成功后,再让缓存失效。

4. 数据库不存在:缓存中存放null值,避免继续请求数据库,设置较短的过期时间

5. 过期时间:每次缓存设置过期时间,避免意外的脏数据

说明:

1. 为什么不先删除缓存数据,后更新? 

    答:避免出现脏数据(主要原因);也避免后续数据库更新失败,则不需要更新缓存(次要原因)

2. 为什么更新完数据库后,设置缓存失效,而不更新缓存数据?

   答:避免两个并发写操作,导致脏数据

3. 为什么设置过期时间?

    答:避免意外操作,导致的脏数据

4. 数据库不存在记录,为什么要缓存中存放null值?为什么要设置较短的过期时间?

    答:缓存null值,是为了避免数据库穿透。

           设置较短的过期时间,是为了避免新插入该记录,导致的脏数据。

 

其他策略:

1. DB中间件监听DB变化,更新缓存:

    现在有种新的办法就是利用DB中间件监听DB变化(比如阿里的Canal中间件,点评的Puma),从而对缓存进行更新。

    这种办法的一个好处就是:把缓存的更新逻辑,和业务逻辑解藕。业务只更新DB,缓存的更新被放在另外一个专门的系统里面。

 

缓存穿透:

所谓“缓存穿透“,就是指某个key,先查cache没查到,再查db也没有查到。

这种key的存在,会导致cache一直没办法命中,压力一直打在db上面。如果访问很高频,可能会压垮DB。

解决办法其实也很简单:当查询DB没查到时,往缓存中写入一个空值(缺省值),这样第2次再查,就不会打到DB上了。

 

缓存雪崩:

所谓“缓存雪崩“,是指缓存的机器挂了,或者数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。

这种问题的解决策略,一般有以下2个方面: 

1).提高缓存的HA。比如缓存的主从复制。 

2).对DB的访问实行限流、降级。

 

 

参见:https://coolshell.cn/articles/17416.html

         http://blog.csdn.net/chunlongyu/article/details/53384933

         http://api.crap.cn/index.do#/web/article/detail/web/ARTICLE/7754a002-6400-442d-8dc8-e76e72d948ac

 

以上是关于缓存策略的主要内容,如果未能解决你的问题,请参考以下文章

iOS web缓存策略以及手动清除缓存

高并发系统:缓存使用-读写策略

联合阅读浏览器缓存策略

缓存策略

三大框架 之 Hibernate生成策略与缓存策略(主键生成策略持久化持久化类划分一级缓存事物管理)

安卓中的缓存策略系列安卓缓存策略之综合应用ImageLoader实现照片墙的效果