分布式缓存技术选型

前言:

这是我的架构设计学习专栏的第2篇文章,此专栏用于存放我的架构设计学习笔记,内容一部分源于网上免费资料,一部分源于gpt和我自己的理解。专栏目前免费,欢迎订阅此专栏和关注我,随着专栏内容的增多,我可能会收费,所以建议喜欢本专栏的盆友尽早订阅。

这是我的架构设计专栏地址:https://www.nowcoder.com/creation/manager/columnDetail/0ybvLm

我还有另外一个八股专栏,感兴趣的也可以订阅一下:https://www.nowcoder.com/creation/manager/columnDetail/j8ZZk0

分布式缓存技术选型

1.缓存有什么用

缓存主要是用来解决高性能问题,通过减轻数据库的负载和提高系统响应速度来应对大量请求,同时也间接提升系统的可用性。在分布式系统中,缓存作为提高系统性能的关键技术,能够显著降低数据库负载、减少网络延迟、提高数据访问速度。当面对大量并发请求时,如果每次都直接从数据库读取数据,可能会导致数据库压力过大,甚至引发性能瓶颈。此时,引入缓存可以有效地缓解这一问题。因此,合理设计分布式缓存策略对于提升系统整体性能具有重要意义。

在分布式缓存系统的架构设计中,我们需要关注以下几个方面:缓存节点的部署和拓扑结构、缓存数据的分布和同步策略、缓存淘汰算法以及缓存失效机制等。同时,分布式缓存系统也带来了一系列挑战,如数据一致性问题、缓存失效问题等。因此,设计一个合理且高效的分布式缓存策略就显得尤为重要。

2. 缓存技术选型

缓存技术选型包括本地缓存和分布式缓存两大类,常用的本地缓存技术有ConcurrentHashMap、Guava Cache等;分布式缓存技术则以Redis和Memcached为代表。

0.对比本地缓存和分布式缓存

1.本地缓存

本地缓存的概念:

本地缓存是指和应用程序在同一个进程内的内存空间去存储数据,数据的读写都是在同一个进程内完成的。

本地缓存优点:

读取速度快,但是不能进行大数据量存储。

本地缓存不需要远程网络请求去操作内存空间,没有额外的性能消耗,所以读取速度快。但是由于本地缓存占用了应用进程的内存空间,比如java进程的jvm内存空间,故不能进行大数据量存储。

本地缓存缺点:

● 应用程序集群部署时,会存在数据更新问题(数据更新不一致)

本地缓存一般只能被同一个应用进程的程序访问,不能被其他应用程序进程访问。在单体应用集群部署(是一种将同一个单体应用的多个实例部署到不同服务器上,以实现负载均衡和高可用性的方法)时,如果数据库有数据需要更新,就要同步更新不同服务器节点上的本地缓存的数据来保证数据的一致性,但是这种操作的复杂度高,容易出错。可以基于redis的发布/订阅机制来实现各个部署节点的数据同步更新。

● 数据会随着应用程序的重启而丢失

因为本地缓存的数据是存储在应用进程的内存空间的,所以当应用进程重启时,本地缓存的数据会丢失。

使用场景:

1. 单应用系统:对于单个应用系统,可以使用本地缓存来提高性能。

2. 小规模数据:当数据量较小,且不需要跨机器访问时,可以使用本地缓存。

2. 分布式缓存

分布式缓存概念:

分布式缓存是独立部署的服务进程,并且和应用程序没有部署在同一台服务器上。所以是需要通过远程网络请求来完成分布式缓存的读写操作,并且分布式缓存主要应用在应用程序集群部署的环境下。

分布式缓存优点:

● 支持大数据量存储

分布式缓存是独立部署的进程,拥有自身独自的内存空间,不需要占用应用程序进程的内存空间,并且还支持横向扩展的集群方式部署,所以可以进行大数据量存储。

● 数据不会随着应用程序重启而丢失

分布式缓存和本地缓存不同,拥有自身独立的内存空间,不会受到应用程序进程重启的影响,在应用程序重启时,分布式缓存的存储数据仍然存在。

● 数据集中存储,保证数据的一致性

当应用程序采用集群方式部署时,集群的每个部署节点都有一个统一的分布式缓存进行数据的读写操作,所以不会存在像本地缓存中数据更新问题,保证了不同服务器节点的 数据一致性。

● 数据读写分离,高性能,高可用

分布式缓存一般支持数据副本机制,实现读写分离,可以解决高并发场景中的数据读写性能问题。而且在多个缓存节点冗余存储数据,提高了缓存数据的可用性,避免某个缓存节点宕机导致数据不可用问题。

分布式缓存缺点:

● 数据跨网络传输,读写性能不如本地缓存

分布式缓存是一个独立的服务进程,并且和应用程序进程不在同一台机器上,所以数据的读写要通过远程网络请求,这样相对于本地缓存的数据读写,性能要低一些。

使用场景:

1. 分布式系统:对于分布式系统,可以使用分布式缓存来提高性能和扩展性。

2. 大规模数据:当数据量较大,且需要跨机器访问时,可以使用分布式缓存。

3. 高并发访问:对于高并发访问的场景,分布式缓存可以提供更好的性能。

1. ConcurrentHashMap

概述:ConcurrentHashMap是Java标准库中的线程安全哈希表实现,支持并发访问和修改。

a. 优势:它实现了细粒度的锁,允许高并发访问;简单易用,无需额外依赖;适用于高并发环境,读写性能优越。

b. 劣势:缺少高级功能,如过期策略、最大容量控制、缓存统计等;仅支持单机操作,无法分布式存储和访问;数据仅存在于内存中,无持久化能力。

c. 适用场景:适合简单的缓存需求,例如会话缓存、短期数据缓存,以及高并发环境下的基本缓存使用。

2. Guava Cache

概述:Guava Cache是Google开发的本地缓存框架,提供了丰富的缓存策略。

a. 优势:它支持最大容量限制、基于时间和基于大小的过期策略、自动刷新、缓存监控等功能;通过内存处理减少IO请求,提高读写性能。

b. 劣势:受限于内存容量,仅适合处理少量数据;在分布式部署中可能存在缓存漂移问题;需要引入Guava库。

c. 适用场景:适合读多写少、对数据一致性要求不高的中等规模应用程序,如应用层简单的数据缓存,不需要持久化存储的场景。

3. Memcached

概述:Memcached是一个分布式内存缓存系统,设计简单且支持高并发。

a. 优势:极致的性能表现,适合处理高并发、大数据量的缓存场景;采用多线程非阻塞IO复用模型,支持集群部署。

b. 劣势:功能相对单一,仅支持简单K/V存储,不支持数据持久化;引入了网络开销。

c. 适用场景:适用于高并发、大数据量且对数据持久化无要求的缓存场景,如大型Web应用、API服务和会话存储。

4.Redis

Redis 是一个基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希、列表、集合和有序集合等,并提供了丰富的操作接口。Redis 将所有数据都存储在内存中,因此具有非常高的读写性能。同时,它还支持持久化,可以将内存中的数据保存到磁盘上,以防止数据丢失。

特色

1. 高性能:由于数据存储在内存中,Redis 具有非常高的读写性能,远高于传统的磁盘数据库。

2. 数据结构丰富:Redis 支持多种数据结构,可以满足各种复杂的应用需求。

3. 持久化:Redis 提供了 RDB 和 AOF 两种持久化方式,可以将内存中的数据保存到磁盘上,以防止数据丢失。

4. 复制和集群:Redis 支持主从复制和集群模式,可以实现数据的备份和故障恢复,提高系统的可用性和可扩展性。

5. 事务支持:Redis 支持事务操作,可以保证一系列操作的原子性。

6. 发布/订阅机制:Redis 提供了发布/订阅机制,可以实现消息的实时推送和接收。

不足

1. 数据丢失风险:由于数据存储在内存中,一旦服务器宕机或重启,内存中的数据可能会丢失。为了缓解这个问题,可以使用 Redis 的持久化功能将数据保存到磁盘上。

2. 内存限制:Redis的数据存储在内存中,因此其数据量受限于服务器的物理内存大小。为了缓解这个问题,可以使用 Redis 的集群模式将数据分散到多个节点上。

3. 数据一致性问题:在分布式环境下,由于网络延迟或故障等原因,可能会导致数据不一致的问题。为了缓解这个问题,可以使用 Redis 的事务机制或分布式锁等机制来保证数据的一致性。

适用场景

1. 缓存:将热点数据缓存在 Redis 中,以减轻数据库的负载并提高访问速度。

2. 会话管理:将用户的会话信息存储在 Redis 中,以实现快速登录和会话保持等功能。

3. 排行榜/计数器等:利用 Redis 的有序集合或哈希等数据结构来实现排行榜或计数器等功能。

4. 实时消息推送:利用 Redis 的发布/订阅机制来实现实时消息推送功能。

5. 分布式锁:利用 Redis 的原子操作来实现分布式锁功能,保证分布式系统的数据一致性。

#腾讯##华为##25届暑期实习##架构师#
架构设计学习专栏 文章被收录于专栏

此专栏用于存放我的架构设计学习笔记,内容一部分源于网上资料,一部分源于gpt和我自己的理解。专栏目前免费,欢迎订阅此专栏和关注我,随着专栏内容的增多,我可能会收费,所以建议喜欢本专栏的盆友尽早订阅。

全部评论

相关推荐

3 5 评论
分享
牛客网
牛客企业服务