什么是分布式缓存
分布式缓存是指将缓存数据,分布在多个节点上的缓存系统,这就是分布式缓存。
分布式缓存特点
相对于本地应用缓存,分布式缓存具有如下4大特性:
1.高性能
分布式缓存将高速内存作为数据对象的存储介质,分布式缓存通常采用键值对存储,可以快速地读取和写入缓存数据。
2.动态扩展性
分布式缓存可以提高应用程序的性能和可伸缩性,因为缓存数据可以从多个节点中获取,从而减少了单个节点的负载。
3.高可用性
因采用多节点存储,数据可用性较高,确保不会因服务器故障而导致缓存服务中断或数据丢失。
4.易用性
多数缓存系统提供了图形化的管理控制台,便于统一维护。
分布式缓存核心问题
分布式缓存面临比较大的问题,如下:
1.缓存雪崩
数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,严重的时候会导致数据库宕机,无法提供数据服务,最终导致系统崩溃。
如下图所示:
比如一个雪崩的简单过程:
1)缓存失效,但依然大量请求访问缓存服务redis;
2)redis大量失效后,大量请求转向到mysql数据库;
3)mysql的调用量暴增,很快就扛不住了,甚至直接宕机;
由于大量的应用服务依赖mysql和redis的服务,这个时候很快会演变成各服务器集群的雪崩,最后网站彻底崩溃。
2.缓存穿透
查询一个必然不存在的数据,查询一个必然不存在的key,每次都会访问DB,如果有人恶意破坏,那么很可能直接对DB造成影响。
例如:从缓存redis没有命中,需要从mysql数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
为了防止缓存穿透攻击,可以采取以下措施:
- Bloom filter:使用Bloom filter算法来过滤掉不合法的请求。Bloom filter是一种快速、高效的数据结构,可以判断一个元素是否存在于一个集合中。
- 缓存空对象:当缓存中没有查询的key对应的值时,可以将一个空对象放入缓存中,这样下次查询同样的key时就会返回空对象,而不会再次访问数据库。
- 限制请求频率:限制同一IP的请求频率,防止攻击者发送大量的恶意请求。
- 使用云防护服务:使用云防护服务来防止恶意攻击者对系统进行攻击。这些服务通常使用机器学习和人工智能算法来检测和阻止攻击。
3.缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。
这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。
解决思路:
1)直接写个缓存刷新页面,上线时手工操作下。
2)数据量不大,可以在项目启动的时候自动进行加载。
目的就是在系统上线前,将数据加载到缓存中。
4.缓存淘汰策略
在缓存数据过多的时候,需要使用某种淘汰算法来决定淘汰哪些数据,常用的淘汰算法如下:
FIFO(First In First Out):先进先出算法,判断存储时间,离当前时间越久的数据越有限被淘汰。
LRU(Least Recently Used):最近最少使用算法,判断缓存最近被使用的时间,距离当前时间越远的数据优先被淘汰。
LFU(Least Frequently Used):最不经常使用算法,在一段时间内被使用次数最少的数据缓存优先被淘汰。
分布式缓存技术
常用的分布式缓存包括Redis和Memcached。
1.Memcached
Memcached是一个开源的,高性能的内存绶存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思。
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
Memcached通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
2.Redis
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
特点:
Redis支持多种类型的数据结构,最常用的5大数据类型,如下图所示:
Redis的持久化机制有3种:
1.RDB(Redis Data Base) 内存快照
RDB 快照是一次全量备份,RDB快照是内存数据的二进制序列化形式,在存储上非常紧凑。
2.AOF(Append Only File) 增量日志
AOF 则是将每次执行的写命令保存到硬盘,类似于 MySQL 的 Binlog,AOF 持久化的实时性更好,即当进程意外退出时丢失的数据更少。
3.RDB AOF混合持久化
Redis4.0 后大部分的使用场景都不会单独使用 RDB 或者 AOF 来做持久化机制,而是兼顾二者的优势混合使用。
分布式缓存应用
分布式缓存的应用场景如下:
用作缓存,由于内存的操作,可以减少数据库频繁访问读取的压力。
分布式锁,分布式锁的方案很多,基于Redis实现的分布式锁一般用得最多。
用于计数器 ,基于incr原理每次访问不断累加,可以统计网站访问量,阅读量,点击量等。
用于分布式限流 ,基于incr和expire原理 通过累计单位时间请求次数达到限流。
除此之外可以用于排行、购物车等。
以上就是分布式缓存详解,更多分布式系统方案,请查看:史上最强分布式系统详解(非常全面)。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》