进程内缓存与分布式缓存

缓存击穿缓存击穿指的是使用不存在的key进行大量的高并发查询,这导致缓存无法命中,每次请求都要击穿到后端数据库系统进行查询,使数据库压力过大,甚至使数据库服务被压死。解决办法我们通常将空值缓存起来,再次接收到同样的查询请求时,若命中缓存并且值为空,就会直接返回,不会透传到数据库,避免缓存击穿。当然,有时恶意袭击者可以猜到我们使用了这种方案,每次都会使用不同的参数来查询,这就需要我们对输入的参数进行过滤,例如,如果我们使用ID进行查询,则可以对ID的格式进行分析,如果不符合产生ID的规则,就直接拒绝,或者在ID上放入时间信息,根据时间信息判断ID是否合法,或者是否是我们曾经生成的ID,这样可以拦截一定的无效请求。

缓存雪崩缓存雪崩指缓存服务器重启或者大量缓存集中在某一个时间段内失效,给后端数据库造成瞬时的负载升高的压力,甚至压垮数据库的情况。通常的解决办法是对不同的数据使用不同的失效时间,甚至对相同的数据、不同的请求使用不同的失效时间,例如,我们要缓存user数据,会对每个用户的数据设置不同的缓存过期时间,可以定义一个基础时间,假设10秒,然后加上一个两秒以内的随机数,过期时间为1012秒,就会避免缓存雪崩。

缓存预热缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!缓存预热解决方案(1)直接写个缓存刷新页面,上线时手工操作下;(2)数据量不大,可以在项目启动的时候自动进行加载;(3)定时刷新缓存;

 

缓存集群扩容局限性

1、进程内缓存:与应用程序在相同地址空间的缓存,例如Guava cache或带锁的Map。

2、分布式缓存:是应用程序的外部扩展,通常部署在多个节点上,共同构建成一个大的逻辑缓存。例如redis和memcache

3、进程内缓存与分布式缓存的区别:                                                                                    1)一致性:进程内缓存存在与不同的应用实例中,每个缓存都有各自的状态,导致不一致性;分布式缓存整个集群是一个特定状态,通过哈希算法,缓存引擎总是可以判断出某个键值对位于哪个特定节点。                                                                                             2)开销:进程内缓存消耗堆内存,影响垃圾回收进而影响系统性能;分布式缓存的消耗主要是网络延迟和对象序列化                                                                                          3)可靠性:进程内缓存使用与一个与程序相同的堆内存,必须非常小心地决定缓存所能使用的内存大小上限;分布式缓存作为多个节点的独立进程运行,单点故障不会导致缓存失效,不会导致系统整体故障。

4、进程内缓存保持一致性:                                                                                                  1)通过单节点通知其他节点,缺点节点间的耦合性增加,节点较多时网状连接关系极其复杂;                                                                                                                            2)可以通过MQ通知其他节点,所有节点订阅MQ消息修改内存数据,优缺点解除了节点间的耦合,但是增加了MQ使系统更加复杂;                                                                3)为了避免耦合降低复杂度,每个节点启动一个定时任务timer,定时从后端拉取最新的数据更新内存缓存

 

你可能感兴趣的:(进程内缓存与分布式缓存)