首页 > 其他分享 >缓存原理

缓存原理

时间:2024-10-01 11:33:23浏览次数:8  
标签:存储 缓存 数据库 访问 key 原理 数据

 

缓存分类

1、内存缓存:内存缓存是一种基于内存的缓存机制,它将经常访问的数据存储在计算机的内存中,以便更快地获取和操作数据。内存缓存通常具有高速读写性能,但容量有限,适用于存储经常访问的关键数据。

2、磁盘缓存:磁盘缓存是一种基于磁盘的缓存机制,它将经常访问的数据存储在磁盘上,以便在后续访问时能够更快地获取和操作数据。与内存缓存相比,磁盘缓存具有更大的容量和更低的成本,但读写速度较慢。

3、网络缓存:网络缓存是一种基于网络通信的缓存机制,它将经常访问的数据存储在网络中的多个节点上,以便在后续访问时能够更快地获取和操作数据。网络缓存可以减轻服务器的负载,提高数据传输速度和可靠性。

4、数据库缓存:数据库缓存是一种基于数据库系统的缓存机制,它将经常访问的数据存储在数据库系统中,以便更快地获取和操作数据。数据库缓存可以提高数据库查询速度和响应速度,同时也可以减少对数据库服务器的负载。MySQL 的数据存储到磁盘上,MySQL 为了提升读写性能,会利用 bufferpool 缓存数据页。MySQL 读取时会按照页的粒度将数据页读取到 bufferpool 中,bufferpool 中的数据页使用 LRU 算法淘汰长期没有用到的页面,缓存最近访问的数据页。

5、CDN缓存:CDN(Content Delivery Network)缓存是一种基于分布式网络的缓存机制,它将经常访问的数据存储在分布式网络中的多个节点上,以便更快地向用户提供数据。CDN缓存可以减轻服务器负载,提高数据传输速度和可靠性,同时也可以提供更好的用户体验。

6、反向代理缓存:反向代理缓存是一种基于代理服务器的缓存机制,它将经常访问的数据存储在代理服务器上,以便更快地向用户提供数据。反向代理缓存可以减轻对原始服务器的负载,提高数据传输速度和可靠性,同时也可以提供更好的网络安全保护。

7、浏览器缓存:浏览器缓存是一种基于浏览器的缓存机制,它将经常访问的网页内容存储在用户的计算机上,以便在下次访问时能够更快地加载和显示网页内容。浏览器缓存可以提高网页加载速度和响应速度,同时也可以减轻对服务器的负载。

 

缓存淘汰策略

缓存的大小是有限的,因为需要对缓存中数据进行淘汰,通常可以采用随机、LRU 或者 LFU 算法等淘汰数据。

LRU 是一种最常用的置换算法,淘汰最近最久未使用的数据,底层可以利用 map+双端队列的数据结构实现。

 最原生的 LRU 算法是存在一些问题的。首先需要注意的是在数据结构中有互斥锁,因为 golang 对于 map 的读写会产生 panic,导致服务异常。使用互斥锁之后会导致整个缓存性能变差,可以采用分片的思想,将整个 LRUCache 分为多个,每次读取时读取其中一个 cache 片,降低锁的粒度来提升性能,常见的本地缓存包通常就利用这种方式实现的。peodMySQL 也会利用 LRU 算法对 buffer pool 中的数据页进行淘汰。由于 MySQL 存在预读,在读取磁盘时并不是按需读取,而是按照整个数据页的粒度进行读取,一个数据页会存储多条数据,除了读取当前数据页,可能也会将接下来可能用到的相邻数据页提前缓存到 bufferpool 中,如果下次读取的数据在缓存中,直接读取内存即可,不需要读取磁盘,但是如果预读的数据页一直没有被访问,那就会存在预读失效的情况,淘汰原来使用到的数据页。MySQL 将 buffer pool 中的链表分为两部分,一段是新生代,一段是老生代,新老生代的默认比是7:3,数据页被预读的时候会先加到老生代中,当数据页被访问时才会加载到新生代中,这样就可以防止预读的数据页没有被使用反而淘汰热点数据页。此外 MySQL 通常会存在扫描表的请求,会顺序请求大量的数据加载到缓存中,然后将原本缓存中所有热点数据页淘汰,这个问题通常被称为缓冲池污染,MySQL 中的数据页需要在老生代停留时间超过配置时间才会老生代移动到新生代时来解决缓存池污染。

 Redis 中也会利用 LRU 进行淘汰过期的数据,如果 Redis 将缓存数据都通过一个大的链表进行管理,在每次读写时将最新访问的数据移动到链表队头,那样会严重影响 Redis 的读写性能,此外会增加额外的存储空间,降低整体存储数量。Redis 是对缓存中的对象增加一个最后访问时间的字段,在对对象进行淘汰的时候,会采用随机采样的方案,随机取5个值,淘汰最近访问时间最久的一个,这样就可以避免每次都移动节点。

但是 LRU 也会存在缓存污染的情况,一次读取大量数据会淘汰热点数据,因此 Redis 可以选择利用 LFU 进行淘汰数据,是将原来的访问时间字段变更为最近访问时间+访问次数的一个字段,这里需要注意的是访问次数并不是单纯的次数累加,而是根据最近访问时间跟当前时间的差值进行时间衰减的,简单说也就是访问越久以及访问次数越少计算得到的值也越小,越容易被淘汰。

缓存生产问题

缓存穿透等问题

  1. 缓存雪崩:缓存雪崩是指缓存中的某个热点数据在缓存中被删除或者过期,导致大量的热点请求同时请求数据库。解决方案可以对于热点数据设置较长的过期时间或者利用分布式锁避免多个相同请求同时访问下游服务。在新闻业务中,对于热点新闻经常会出现这种情况,事件服务利用 golang 的 singlefilght 保证同一篇文章请求在同一时刻只有一个会请求到下游,防止缓存击穿。
  2. 热点 key:热点 key 是指缓存中被频繁访问的 key,导致缓存该 key 的分片或者 Redis 访问量过高。可以将可热点 key 分散存储到多个 key 上,例如将热点 key+序列号的方式存储,不同 key 存储的值都是相同的,在访问时随机访问一个 key,分散原来单 key 分片的压力;此外还可以将 key 缓存到机器内存,避免 Redis 单节点压力过大,在新闻业务中,对于热点文章就是采用这种方式,将热点文章存储到机器内存中,避免存储热点文章 Redis 单分片请求量过大。

 

缓存数据一致性

https://mp.weixin.qq.com/s/hcmRh493yWJUJTJl0tlZWw

 

当数据库中的数据变更时,如何保证缓存跟数据库中的数据一致,通常有以下几种方案:

  • 更新缓存再更新 DB,
  • 更新 DB 再更新缓存,
  • 先更新 DB 再删除缓存,
  • 删除缓存再更新 DB。

这几种方案都有可能会出现缓存跟数据库中的数据不一致的情况,最常用的还是更新 DB 再删除缓存,因为这种方案导致数据不一致的概率最小,但是也依然会存在数据不一致的问题。例如在 T1 时缓存中无数据,数据库中数据为100,线程B 查询缓存没有查询到数据,读取到数据库的数据100然后去更新缓存,但是此时线程A 将数据库中的数据更新为99,然后在 T4 时刻删除缓存中的数据,但是此时缓存中还没有数据,在 T5 的时候线程B 才更新缓存数据为100,这时候就会导致缓存跟数据库中的数据不一致。

 

为保证缓存与数据库数据的一致性。常用的解决方案有两种,

  • 一种是延时双删,先删除缓存,后续更新数据库,休眠一会再删除缓存。文章池服务中就是利用这种方案保证数据一致性,如何实现延迟删除,是通过 go 语言中 channel 实现简单延时队列,没有引入第三方的消息队列,主要为了防止服务的复杂化;
  • 另外一种可以订阅 DB 的变更 binlog,数据更新时只更新 DB,通过消费 DB 的 binlog 日志,解析变更操作进行缓存变更,更新失败时不进行消息的提交,通过消息队列的重试机制实现最终一致性。

标签:存储,缓存,数据库,访问,key,原理,数据
From: https://www.cnblogs.com/clarino/p/18442777

相关文章

  • 浏览器下载东西时,下载路径设置D盘,但是会暂时缓存到C盘,导致C盘爆红,下载完C盘才会恢
    下载时C盘情况:   下载后C盘情况:        以下内容来源CSDN的C知道:        当你在浏览器下载文件时,通常不会直接将文件存储在设置的下载路径(如D盘)。浏览器为了提高效率和用户体验,会选择在系统临时目录,比如C盘的某个位置(通常是%temp%或者特定的Downloa......
  • 【有啥问啥】二分图(Bipartite Graph)算法原理详解
    二分图(BipartiteGraph)算法原理详解引言二分图(BipartiteGraph),又称二部图,是图论中的一个重要概念。在实际应用中,二分图模型经常用于解决如匹配问题、覆盖问题和独立集问题等。本文将详细解析二分图的基本概念、性质、判定方法,以及求解最大匹配问题的匈牙利算法,并探讨其在......
  • redis的数据结构,内存处理,缓存问题
    redisObjectredis任意数据的key和value都会被封装为一个RedisObject,也叫redis对象:这就redis的头信息,占有16个字节redis中有两个热门数据结构1.SkipList,跳表,首先是链表,和普通链表有以下差异:元素按照升序排列存储节点可能包含多个指针,指针跨度不同那么跳表的特点有以下:......
  • olt的原理
    OLT的原理主要涉及其作为光线路终端设备在光纤通信系统中的角色和功能。以下是OLT原理的简要说明:光信号接收:OLT通过光纤接收来自用户端的光信号。光电转换:将接收到的光信号转换为电信号,以便进一步处理和传输。这是OLT的核心功能之一,它使得光信号能在电域中进行处理。信号处......
  • 流水线并行(Pipeline Parallelism)原理详解
    文章目录0.概览1.简单流水并行2.GPipe算法3.GPipe空间复杂度4.PipeDream算法5.总结参考0.概览数据并行(DataParallelism):在不同的GPU上运行同一批数据的不同子集;流水并行(PipelineParallelism):在不同的GPU上运行模型的不同层;模型并行(ModelParallelism):将......
  • 缓存雪崩/穿透/击穿/失效原理图/14种缓存数据特征+10种数据一致性方案(专家篇)
    在当今数据驱动的互联网时代,缓存成为了提升应用性能的关键技术。面对海量用户请求,如何通过缓存策略有效减轻数据库压力、降低响应延迟?本文深入探讨了缓存雪崩、缓存穿透、缓存击穿等常见问题,并提供了全面的解决方案。通过实际案例分析,揭示了缓存设计的最佳实践,确保数据一致......
  • 嘉立创电热膜/发热片/发热膜布线原理与设计指导(一)
    设计发热片需要选择合适的发热材料,布线要均匀,不仅满足我们的使用需求,还有一定的观赏性.工程如何画好一个电热膜?常规的怎么画?异形的怎么画?对于初学者可以先从规则图形画起,先掌握画图的计算原理和画图技巧。下面介绍下外形是方形的画法: 外形是四方的比较好画一点,画的时候......
  • 对面试官说精通elastic search之底层原理解读(面试可用)
    一串文本,先经过分词分成词项被称为term。我们要搜索一个词项的时候,如果挨个遍历时间复杂度是0n为了解决查询速度,可以将词项按从小到大排序,排序过后通过二分查找的方法,将时间复杂度优化为ologn,这就组成了一个termdictionary,词项对应的docid就叫postinglist,这两个共同组......
  • Spring Boot-Spring MVC自动装配原理
    说明在非SpringBoot项目中我们要使用SpringMVC要做很多繁琐的配置,配置DispatcherServlet、配置RequestMapping配置RequestMappingAdapter当我们使用SpringBoot项目只需要引入以下依赖就完成了整个自动SpringMVC的装配实现开箱即用<dependency><groupId>org......
  • 大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(已更完)Kudu(已更完)Druid(正在更新…)章节内容上节我们完成了如......