关于web缓存的思考

公司缓存出了些问题,解决的过程当中总结了一些缓存使用的方式方法。html

公司缓存遇到的问题

1) 缓存无过时时间致使内存占用太高
2) 缓存清除后,失效后仍用到,不可从数据库恢复前端

形成这些问题的缘由是开发人员对缓存的设计和使用原则不清楚,架构上也没有明确的说明和引导。数据库

关于上面的两个问题

1) 缓存添加时必定要有清除策略。程序状态完结时主动删除或者设置合理过时时间,否则就会形成内存泄漏,固然架构层面能够在内存资源紧张时使用必定策略进行回收,可是被强制清除的缓存如何恢复,可否恢复也是一个须要考虑的问题,正确的作法应该是清除策略和资源回收两方面同时进行,清除策略为主,资源回收只能是预防性的工做,资源回收也容易形成问题。另外,正确的监控和统计工做能够发现异常的缓存key,防止程序错误日积月累占用大量资源突发严重问题。
2) 缓存过时或者被错误清除仍用到不可从数据库恢复。缓存清除仍用到是程序设计上的问题形成的,但不可从数据库恢复涉及缓存数据恢复问题。缓存数据应该是数据库数据的某种映射,由于缓存是临时存储,自己就是不可靠的,数据库是持久存储,是可靠的,缓存是为了加速数据访问,下降数据库压力而存在的,因此缓存数据应该很容易从数据库恢复,这里把缓存当作不可恢复的持久存储用是不对的。若是须要高性能的持久存储,好比保存程序中间结果,能够考虑使用Redis等(使用时不须要恢复策略,但也须要清除策略)。简单的说,缓存做为非持久性存储,数据应该是能够很轻易的从持久存储恢复的。缓存

那缓存应该怎样设计和使用呢?

从设计一个网站的缓存角度来考虑能想到的方面,缓存应该分类为数据库缓存 (或者说持久存储,数据都能从DB恢复)、临时数据缓存(只须要存储较短期的中间数据,能由持久存储恢复,但时间较长,好比报表数据)、前端缓存(页面缓存、页面片断缓存、由html加动态数据混合而成,缓存已加快渲染和返回速度),这里咱们只考虑持久存储缓存或者简单的说数据库缓存。性能优化

数据库缓存

定义:数据库缓存是为了加速数据访问,减轻DB压力而存在的一种临时性高速存储。架构

1) 缓存添加
什么样的数据应该放到缓存里?访问频繁的数据应该放到缓存里,仍是说为了提升性能,把大部分数据库数据放到缓存里?
从性能优化的角度来讲,不该该提早优化,应该是遇到性能问题、性能问题初漏端倪、为了预防性能问题而使用缓存(最好基于性能测试和监控),因此最开始应该为预估的热点数据设置缓存,或者遇到性能问题时为相关数据添加缓存(设置缓存应该是开发人员的工做,架构方面应提供缓存服务,也能够经过统一的数据访问层来实现,若是架构方面能根据热点数据自动应用缓存最好,多级缓存技术中,靠近底层的的缓存应该是根据预估或者统计的数据热点手动或自动添加的,更高级的缓存应该是应用程序或者说调用方添加的) 。并发

2) 缓存更新
缓存的更新能够分为过时更新和程序主动更新。先更新缓存仍是先更新数据库?若是先更新缓存后更新数据库,这样客户使用的多是缓存的数据,若是此时出现故障数据库更新失败,那么用户使用的数据跟数据库中数据是不对应的,因此要先更新数据库再更相信缓存,这也印证了数据库是主存储,缓存是DB数据的某种映射,是副存储的设计原则 。要更新数据库,又要更新缓存,这样在实时性要求较高的高并发场景下就确定会遇到数据一致性的问题。 对于读多写少的需求来讲,能够在写数据库后同步更新缓存,这样除了在实时性要求很是高且并发很高的状况下才会出现数据不一致的状况,大多数状况下都能运行良好。对于实时性要求较低需求来讲,只须要设置缓存的过时时间,等待缓存过时后从DB从新加载。对于写很是频繁、容忍必定偏差的需求来说,先写缓存,定时刷回数据库是一种可行的方案。运维

3) 缓存清除
缓存清除策略是必要的,否则就容易发生内存泄漏的状况,及时清除缓存也能够为新的缓存腾出空间,提升缓存性能。清除策略应该是程序主动清除和过时时间相结合的方式,在程序层面要作清除,在架构层面要作监控、统计和在资源不足时根据必定策略清除,两方面都要作。高并发

临时数据缓存

定义:只须要存储较短期的中间数据。性能

临时数据缓存要考虑更新策略和清除策略。更新不是问题,直接更新就行,清除策略能够是主动清除,设置过时时间的话须要明确在过时时间以内不会再次用到该缓存,可是设置过时时间每每不太靠谱,由于临时数据缓存不像数据库缓存那样容易恢复,不设置过时时间因程序bug没有主动清除缓存会累积垃圾数据,不过能够经过定时清理功能来清除,但这须要依赖开发与运维协做,可能效率低下,不过因为程序bug形成累积垃圾数据是不可避免的,按期的开发与运维相配合的架构清理应该也是必要的。

相关文章
相关标签/搜索