引言
在负载均衡算法与应用详解中有提到,负载均衡有利于提升集群服务器的吞吐量、数据并行处理能力、减少用户响应时间,提升业务可靠性等。但是分布式缓存集群的伸缩性不能使用简单的负载均衡手段来实现。
缓存服务器集群和应用服务器集群负载均衡的不同点在于:
- 集群中所有应用服务器部署的应用都是相同的;
- 集群中不同缓存服务器中的缓存数据各不相同;
本文目录
- 缓存的定义;
- 缓存的算法;
- LRU算法(最近最久未使用算法 + LinkdList双向链表);
- 余数Hash路由算法( key的hashCode % 集群服务器数量);
- 一致性Hash算法(一致性Hash环 + 虚拟节点机制);
- 缓存的相关问题;
- 二八定律(热点数据分布规律)
- 缓存雪崩(缓存服务器宕机,导致数据库压力骤增);
- 缓存预热(新启动的缓存系统,缓存命中率低);
- 缓存穿透(高并发访问不存在的缓存数据,导致数据库压力骤增);
- 缓存的应用案例;
- Redis内存淘汰机制;
- Redis持久化机制;
缓存的定义
缓存是指将数据存储在相对较高访问速度的存储介质中,一方面缓存访问速度快,可以减少数据访问的时间,另一方面如果缓存的数据是经过计算处理得到的,那么被缓存的数据无需重复计算即可直接使用,因此缓存还起到减少计算时间的作用。
缓存的本质是一个内存Hash表;
网站数据访问通常遵循二八定律,即80%的访问落在20%的数据上,因此利用Hash表和内存的高速访问特性,将这20%的数据缓存起来,可很好的改善系统性能,提升数据读取速度,降低存储访问压力。
缓存算法
LRU算法
LRU全称是Least Recently Used,即最近最久未使用的意思;
LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。
用LinkedList双向链表实现LRU,算法思路:
1. 初始化一个存放缓存数据的双向链表;
2. 判断请求是否直接击中缓存链表的表头,如果是则直接返回,一次请求完毕;如果不是,则执行后续操作;
3. 判断链表中是否已存在当前请求,如果存在,则移除对应的结点,如果不存在,则判定空间是否够用,以决定是否需要移除为尾结点;
4. 将当前请求添加至链表表头;
5. 下一次请求重复 2 - 4 步骤;