当前位置: 首页 > 科技观察

深入理解这篇文章:分布式系统中的缓存架构

时间:2023-03-18 21:32:48 科技观察

本文主要介绍了大规模分布式系统中缓存的相关理论、常用的缓存组件和应用场景。缓存概述缓存分类缓存主要分为四类,如下图所示:缓存分类CDN缓存CDN(ContentDeliveryNetworkcontentdistributionnetwork)的基本原理是广泛使用各种缓存服务器,并将这些缓存服务器分发给用户访问相对集中的区域或网络。当用户访问网站时,利用全局负载技术将用户的访问引导到就近的正常工作的缓存服务器,缓存服务器直接响应用户请求。应用场景:主要缓存静态资源,如图片、视频等。不使用CDN缓存的CDN缓存的应用如下图所示:使用CDN缓存CDN缓存的优点如下:优点反向代理缓存反向代理位于应用服务器机房,处理对web服务器的所有请求.如果用户请求的页面缓存在代理服务器上,代理服务器会直接将缓存的内容发送给用户。如果没有缓冲,首先向web服务器发送请求,检索数据,在本地缓存,然后发送给用户。通过减少对Web服务器的请求数来降低Web服务器的负载。应用场景:一般只缓存css、js、图片等小型静态文件资源。反向代理缓存应用如下图:反向代理缓存的开源实现如下图:开源实现本地应用缓存是指应用中的缓存组件。最大的优点是应用和Cache在同一个进程,请求缓存非常快,没有过多的网络开销等,在单体应用不需要集群支持或者不需要节点的场景下使用本地缓存比较合适不需要在集群中互相通知。同时,它的缺点是缓存与应用耦合。多个应用程序不能直接共享缓存。每个应用程序或集群的每个节点都需要维护自己独立的缓存,这是一种内存浪费。应用场景:缓存字典等常用数据。缓存介质如下图所示:缓存介质编程直接实现如下图:编程直接实现Ehcache基本介绍:Ehcache是一个基于标准的开源缓存,可以提高性能,卸载数据库,简化可扩展性.它是使用最广泛的基于Java的缓存,因为它功能强大、经过验证、功能齐全,并且与其他流行的库和框架集成。Ehcache可以从进程内缓存扩展到具有TB级缓存的混合进程内/进程外部署。Ehcache应用场景如下图:Ehcache应用场景Ehcache架构如下图:Ehcache架构图Ehcache主要特点如下图:Ehcache主要特点Ehcache缓存数据过期策略如下图下图:缓存数据过期策略Ehcache过期数据淘汰机制:惰性淘汰机制,每次有数据放入缓存,都会存储一个时间,读取时要和设置的时间做TTL比较,判断是否它已经过期了。GuavaCache基本介绍:GuavaCache是??Google开源Java复用工具集库Guava中的一个缓存工具。GuavaCache的特点和作用如下图所示:GuavaCache的特点和作用GuavaCache的应用场景如下图所示:GuavaCache应用场景GuavaCache的数据结构如下图所示:GuavaCache数据结构图GuavaCache结构特点GuavaCache的缓存更新策略如下图所示:GuavaCache缓存更新策略GuavaCache的缓存恢复策略如下图:GuavaCache缓存恢复策略分布式缓存是指一种与应用程序分离的缓存组件或服务。它最大的优势在于它本身就是一个独立的应用程序。本地应用隔离,多个应用可以直接共享缓存。分布式缓存的主要应用场景如下:分布式缓存应用场景分布式缓存的主要访问方式如下:分布式缓存访问方式下面介绍分布式缓存的两种常见的开源实现,Memcached和Redis。MemcachedMemcached是一个高性能的分布式内存对象缓存系统。通过在内存中维护一个统一的庞大Hash表,可以用来存储各种格式的数据,包括图片、视频、文件、数据库检索结果等。简单的说就是将数据调用到内存中,然后再从内存中读取,从而大大提高了读取速度。Memcached的特点如下图所示:Memcached的特点Memcached的基本结构如下图所示:Memcached基本结构缓存数据过期策略:LRU(最近最少使用)过期策略,在Memcached中存储数据项时,你可以在缓存中指定其过期时间,默认为***。当Memcached服务器用完分配的内存时,陈旧数据首先被替换,然后是最近未使用的数据。数据淘汰的内部实现:惰性淘汰机制是每次有数据放入缓存,都会保存一个时间,读取的时候需要比较TTL和设定的时间来判断是否过期。分布式集群实现:服务器不具备“分布式”功能。每个服务器都是一个完全独立和隔离的服务。Memcached的分发是由客户端程序实现的。数据读写流程图Redis的Memcached分布式集群实现Redis是一种远程内存数据库(非关系型数据库),具有强大的性能、复制特性,是解决问题的完美数据模型。可以存储键值对和5种不同类型值的映射关系,可以将内存中存储的键值对数据持久化到硬盘,并可以利用复制特性扩展读取性能。Redis还可以使用客户端分片来扩展写入性能,具有内置复制、LUA脚本、LRU逐出、事务和不同级别的磁盘持久性。并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(HighAvailability)。Redis的数据模型如下图:Redis数据模型Redis的数据淘汰策略如下图:Redis数据淘汰策略Redis数据淘汰的内部实现如下图:Redis数据淘汰内部实现Redis持久化方法如下图:Redis持久化方法Redis底层部分实现分析如下图:启动过程图服务端持久化部分操作示意图Showed:RedisCache设计原则Redis与Memcached的对比如下图所示:Redis与Memcached的对比下面主要介绍缓存架构设计中的常见问题及解决方案,以及行业案例。分层缓存架构设计缓存带来的复杂性问题常见的问题主要有以下几点:数据一致性、缓存穿透、缓存雪崩、缓存高可用、缓存热点。下面就这些问题及相应的解决方案一一进行介绍和分析。数据一致性因为缓存是持久化数据的副本,必然会出现数据不一致,导致脏读或者数据不可读。数据不一致一般是由于网络不稳定或节点故障引起的。三种常见问题场景及解决方案:缓存穿透缓存一般以Key-Value方式存在。当某个Key不存在时,会查询数据库。如果Key不存在,会频繁请求数据库,造成数据库访问压力。主要解决方案:缓存结果为空的数据,当Key有数据时清除缓存。对于一定不能存在的key,使用Bloomfilter创建一个大的Bitmap,通过Bitmap过滤查询。CacheAvalancheCacheHighAvailability缓存是否高可用取决于实际场景。并非所有服务都需要缓存的高可用性。方案设计需要结合具体业务和具体情况,比如临界点是否会影响后端数据库等。主要解决方案:分布式:实现数据的海量缓存。Replication:实现缓存数据节点的高可用。缓存热点一些特别热的数据,高并发访问同一个缓存数据,导致缓存服务器压力过大。解决方案:复制多个缓存副本,将请求分发到多个缓存服务器,减轻缓存热点对单个缓存服务器的压力+MySQL方法到Redis/MC+SSD缓存+MySQL方法。采用SSDCache作为二级缓存,彻底解决了MC/Redis成本高、容量小的问题,也解决了穿透DB带来的数据库访问压力。主要在数据架构、性能、存储成本、服务等不同方面进行了优化和增强。参考资料:从0开始学习架构——阿里巴巴李云华核心Java技术36讲——Oracle杨晓峰解析Redis架构设计——神之禁忌Memcached官方文档Redis持久化RDB与AOF的区别——58神剑缓存,你真的是对的吗?——58沉健选择redis还是memcached,源码怎么办?——58神剑缓存那些事——美团技术团队Redis缓存设计原则——薛飞鸿Redis缓存策略与主键失效机制——冰悦微博缓存架构设计实践——陈博大型分布式系统中的缓存最互联网热门应用-侯中擅长缓存,并发更新的大坑?——58神剑分布式缓存设计——crossoverJie