热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分布式系统缓存系列一认识缓存

C1、缓存的意义说到分布式系统基本上就离不开缓存,在高并发,大流量的场景下缓存更是扮演着重要的角色。所以作为一个分布式系统的开发人员是必须熟练掌握缓存的使用与设计。下面是一张简单的

  C1、缓存的意义

  说到分布式系统基本上就离不开缓存,在高并发,大流量的场景下缓存更是扮演着重要的角色。所以作为一个分布式系统的开发人员是必须熟练掌握缓存的使用与设计。下面是一张简单的系统架构图

  

分布式系统缓存系列一 认识缓存

 

  从图中我们知道了缓存在系统层面的所处位置,可以在应用系统的内部也可以在外部。那缓存的意义又是什么呢?

  1、缩短系统的响应时间,提升用户体验。如果在系统的内部就已经缓存有了用户请求所需要的结果,那么就不在需要执行其后面操作如外部RPC,DB查询,直接返回结果,给用户流畅般的系统体验。

  2、扛住更大的流量,保护关键系统组件。举个例子在高并发,大流量的场景下如果没有缓存的保护,所有的请求的都直接穿透到我们底层的DB。DB基本上都是扛不住的,DB一旦宕机基本上整个系统就over了,但很多缓存中间件比如redis,memcache却可以扛得住。

  3、提升系统稳定性,提高整体吞吐量。第三点其实由前面两点总结出来的。

  2、缓存的分类

  根据缓存的存储情况可以分为:集中式缓存,本地缓存,分布式缓存。

  集中式缓存:所有的缓存都统一在一个地方管理。

  优点:数据集中容易管理,一致性好,实时性好,只要修改一处地方可以立即看到效果。

  缺点:集中式缓存通常都存放在系统的外部,高并发请求下带宽很容易成为瓶颈。

  优化:减少不必要的数据,只存储真正需要的数据。对放进缓存的数据进行压缩,取出来之后再进行解压。目的都是为了减少数据传输对带完的占用。

  本地缓存:又叫localCache,每个应用的本地都留着一份完整的缓存副本。

  优点:性能好,相对于集中式缓存不需要访问外部并且没有带宽的压力。

  缺点:数据分散,不容易管理。数据一致性差,多个副本之间数据同步有延时。

  优化:必须给本地缓存加上一个过期失效时间,并且建立一套相对实时数据更新机制,保证副本的数据能够有效及时更新。

  分布式缓存:以集群的方式搭建缓存,比如redis集群。

  优点:高性能,支持动态扩展,支持高可用

  分布式缓存集群都是以分片的形式数据分散到多台机器上面去存储,分片的形式有客户端分片(memcahed),服务端分片(redis),分片用的hash算法通常采用一致性hash。这一块涉及的内容比较多,有时间的话后面打算专门独立讨论。

  3、缓存的特征

  缓存也是一个数据模型对象,那么必然有它的一些特征:

  命中率

  命中率=返回正确结果数/请求缓存次数,命中率问题是缓存中的一个非常重要的问题,它是衡量缓存有效性的重要指标。命中率越高,表明缓存的使用率越高。

  最大元素(或最大空间)

  缓存中可以存放的最大元素的数量,一旦缓存中元素数量超过这个值(或者缓存数据所占空间超过其最大支持空间),那么将会触发缓存启动清空策略根据不同的场景合理的设置最大元素值往往可以一定程度上提高缓存的命中率,从而更有效的时候缓存。

  4、缓存的清空策略

  如上描述,缓存的存储空间有限制,当缓存空间被用满时,如何保证在稳定服务的同时有效提升命中率?这就由缓存清空策略来处理,设计适合自身数据特征的清空策略能有效提升命中率。常见的一般策略有:

  FIFO(first in first out)

  先进先出策略,最先进入缓存的数据在缓存空间不够的情况下(超出最大元素限制)会被优先被清除掉,以腾出新的空间接受新的数据。策略算法主要比较缓存元素的创建时间。在数据实效性要求场景下可选择该类策略,优先保障最新数据可用。

  LFU(less frequently used)

  最少使用策略,无论是否过期,根据元素的被使用次数判断,清除使用次数较少的元素释放空间。策略算法主要比较元素的hitCount(命中次数)。在保证高频数据有效性场景下,可选择这类策略。

  LRU(least recently used)

  最近最少使用策略,无论是否过期,根据元素最后一次被使用的时间戳,清除最远使用时间戳的元素释放空间。策略算法主要比较元素最近一次被get使用时间。在热点数据场景下较适用,优先保证热点数据的有效性。除此之外,还有一些简单策略比如:

  根据过期时间判断,清理过期时间最长的元素;

  根据过期时间判断,清理最近要过期的元素;

  随机清理;

  根据关键字(或元素内容)长短清理等。


推荐阅读
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 菜鸟物流用户增长部现正大规模招聘P6及以上级别的JAVA工程师,提供年后入职选项。 ... [详细]
  • 深入理解云计算与大数据技术
    本文详细探讨了云计算与大数据技术的关键知识点,包括大数据处理平台、社会网络大数据、城市大数据、工业大数据、教育大数据、数据开放与共享的应用,以及搜索引擎与Web挖掘、推荐技术的研究及应用。文章还涵盖了云计算的基础概念、特点和服务类型分类。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • TCP协议中的可靠传输机制分析
    本文深入探讨了TCP协议如何通过滑动窗口和超时重传来确保数据传输的可靠性,同时介绍了流量控制和拥塞控制的基本原理及其在实际网络通信中的应用。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 高效的JavaScript异步资源加载解决方案
    本文探讨了如何通过异步加载技术处理网页中大型第三方插件的加载问题,避免将大文件打包进主JS文件中导致的加载时间过长,介绍了实现异步加载的具体方法及其优化。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 深入解析JVM内存模型与分配机制
    本文详细探讨了JVM内存结构的主要组成部分,包括Java虚拟机栈、Java堆、方法区等,并深入分析了HotSpot虚拟机的分代收集策略及其对不同内存区域的管理方式。 ... [详细]
author-avatar
cfpage
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有