为什么要使用分布式缓存
高并发环境下,例如典型的淘宝双11秒杀,几分钟内上亿的用户涌入淘宝,这个时候如果访问不加拦截,让大量的读写请求涌向数据库,由于磁盘的处理速度与内存显然不在一个量级,服务器马上就要宕机。
缓存可以将经常读取的数据存储在快速的内存中,从而避免了频繁访问慢速的后端数据库。
这样可以大幅减少数据库的负载,加快数据访问速度,提升应用程序的响应性能和吞吐量。
除了提升性能之外,分布式缓存还可以水平扩展。
即通过添加更多缓存节点,来应对不断增长的数据访问需求。
所以,分布式缓存技术就诞生了。
分布式缓存应用场景
特别是在大规模和高并发的应用程序中,都是典型的分布式缓存应用场景
1.热门数据
比如:网站首页、热门商品、热门文章等,可以将其缓存在分布式缓存中,避免每次请求都要重新生成或访问数据库,从而提高响应速度。
2.分布式session
对于需要维护用户会话状态的应用程序,可以将用户会话数据缓存起来。
3. 分布式锁
分布式缓存可以用来实现分布式锁,Redis就经常涉及。
4.页面缓存
比如HTML、CSS和图片等信息。
分布式缓存比较:Memcache VS Redis
Memcache和Redis都是流行的分布式缓存解决方案,它们都可以用于加速应用程序的数据读取,并降低数据库的负载。
下面是两者的核心区别点:
1.数据结构支持
Memcache:它是一个简单的键值存储系统,支持字符串类型的值。
Redis:它是一个高级的键值存储系统,支持多种数据结构。如:字符串、列表、集合、有序集合、哈希等,这使得Redis在一些场景下更为灵活。
2.持久化
Memcache:不支持数据持久化,一旦重启或崩溃,数据将会丢失。
Redis:支持持久化选项,可以将数据存储在硬盘上,保证数据的持久性。Redis提供了3种持久化方式:RDB快照和AOF日志,以及RDB快照和AOF的混合版。
3.内存管理
Memcache:使用Slab Allocation,预先分配一系列大小固定的组,然后根据数据大小选择最合适的块存储,避免了内存碎片。
Redis:使用更复杂的内存管理机制,可以有效地优化内存使用,并支持更多的数据结构,但在一些情况下可能会消耗更多内存。
4.发布/订阅功能
Memcache:不支持发布/订阅模式。
Redis:支持发布/订阅功能,可以用于实现实时消息传递和事件通知。
5.复制和高可用性
Memcache:不支持数据复制,因此在节点发生故障时可能会导致数据丢失。
Redis:支持主从复制,可以设置多个从节点来复制主节点的数据,提高了高可用性。当主节点故障时,可以自动切换到从节点以保证服务的可用性。
6.集群方案
Redis集群解决方式也优于Memcache,Memcache在客户端一致性hash的集群解决方案,Redis采用无中心的服务器端集群解决方案。
分布式缓存选型总结
由于Redis更好的支持持久化、集群部署,以及支持更加丰富的数据结构,综上所述选择Redis会更优。
分布式缓存的常见问题和挑战
1.缓存雪崩
缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
2.缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。
3.缓存预热
缓存预热这个应该是一个比较常见的概念,相信很多小伙伴都应该可以很容易的理解,缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
4.缓存更新
除了缓存服务器自带的缓存失效策略之外,我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种:
(1)定时去清理过期的缓存;
(2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。
两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。
5.缓存降级
当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。
降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。
在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级;比如可以参考日志级别设置预案:
(1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;
(2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
(3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;
(4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。
----------------------------------
NoSql与Sql的区别:
NOSQL数据库适合于高并发、大规模、多数据类型的环境,而传统SQL数据库适合于数据结构固定、对数据安全性、一致性要求较高的场景
NoSQL数据库在各个领域都有广泛的应用,尤其在处理大规模、高吞吐量和非结构化数据方面表现出色。下面是 NoSQL数据库的一些常见运用领域以及使用方法的详解:
大数据存储和分析: NoSQL数据库特别适合存储和处理大规模的数据集。在大数据领域,NoSQL数据库如HBase、Cassandra和MongoDB等被广泛用于海量数据的存储和分析任务。
实时数据处理:对于需要实时处理数据的应用场景,NoSQL数据库提供了高性能和低延迟的特性。例如,Redis是一个流行的内存数据库,广泛用于缓存、会话管理和实时计算。
内容管理和社交媒体: NoSQL数据库可以有效地存储和管理非结构化数据,如文档、图片和视频。这使得它们在内容管理系统和社交媒体平台上非常受欢迎。MongoDB是一个常见的用于内容管理和社交媒体的NoSQL数据库。
物联网(IoT):物联网应用通常需要处理大量的设备生成的数据。NoSQL数据库提供了横向扩展和高吞吐量的能力,适用于处理物联网设备的数据。
日志和事件存储: NoSQL数据库可以用于存储大量的日志和事件数据。例如,Elasticsearch是一个流行的用于日志和事件存储的NoSQL数据库。
分布式存储: NoSQL数据库的横向扩展特性使得它们在分布式存储方面表现出色。这使得它们成为大规模分布式系统的理想选择。
使用NoSQL数据库的方法如下:
选择合适的NoSQL数据库:根据具体的应用需求,选择适合的NoSQL数据库类型,如文档型、键值对、列式或图数据库等。
设计数据模型:根据应用需求和数据结构,设计合适的数据模型。在NoSQL数据库中,数据模型的设计与传统关系型数据库有很大的不同,需要根据具体场景灵活调整。
编写数据访问代码:使用数据库提供的API或驱动程序,在应用程序中编写数据访问代码。NoSQL数据库的API和查询语言与传统关系型数据库不同,需要学习和适应新的使用方式。
优化性能和扩展:在使用NoSQL数据库时,需要考虑性能优化和横向扩展。通过合理设计数据模型和使用适当的数据库配置,确保应用程序具有良好的性能和可扩展性。
总体来说,NoSQL数据库在处理大规模、非结构化和实时数据方面表现优秀,可以为各种复杂的应用场景提供高性能和灵活性。但是在使用NoSQL数据库时,需要根据具体情况进行合理的选择和设计,以充分发挥其优势。
参考:https://baijiahao.baidu.com/s?id=1724703194388199871&wfr=spider&for=pc
参考:https://blog.csdn.net/qq_44866828/article/details/119919856