缓存原理

news/2024/12/25 14:43:09/文章来源:https://www.cnblogs.com/clarino/p/18442777

 

缓存分类

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 单分片请求量过大。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/806546.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)

七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用) @目录七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)1. 乐观锁2. 代码生成器3. 执行SQL分析打印4. 总结:5. 最后: 1. 乐观锁 首先我们需要先了解开发中的…

加解密demo(java、php)

数据格式* @param args* 撞库---入参加密字段signs加密前格式** {* "mobileMask": "134123412**",* "city": "武汉",* "system": "qxh"* }** 撞库---返回加密字段signs加密前格式* {* "md5L…

Newstar Re wk1 wp

Newstar Re wk1 wpNewstar Re wk1 wp练一下markdown语法(有些地方明显是为了使用markdown语法而硬造的)begin 引导新手使用IDA Pro。用IDA Pro打开,根据英语引导可知flag分为三部分,依次寻找: 第一部分:点进&flag_part1,可找到第一部分。使用小端序存储所以要倒着…

《Java 基础篇》一:入门

Java 基础概念、运算符以及程序流程控制语句。Author: ACatSmiling Since: 2024-09-30bit 和 byte 计算机本质是一系列的电路开关。每个开关存在两种状态:开(on)和关(off)。如果电路是开的,它的值是 1,如果电路是关的,它的值是 0。一个 0 或者一个 1 存储为一个比特(b…

《Java 基础篇》二:面向对象

Java 面向对象的三条主线:类及类的成员、关键字和三大特征。Author: ACatSmiling Since: 2024-09-30概述 面向过程(POP)与面向对象(OOP):二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能…

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型数据集,PyOD提供了50多种算法以满足用户的需求。PyOD的特点包括:统一…

Linux 万字入门教程

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。0. 前言文章已经收录到 GitHub 个人博客项目,欢迎 Star: https://github.com/chenyl8848/chenyl8848.github.io或者访问网站,进行在线浏览:…

阿里面试:说说 jvm 锁的膨胀过程?锁内存怎么变化的?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨

闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨上图为执行语义搜索前的聚类演示 ,嵌入技术是自然语言处理的核心组成部分。虽然嵌入技术的应用范围广泛,但在检索应用中的语义搜索仍是其最常见的用途之一。https://avoid.overfit.cn/post/38350e175fa0424b8c988ad9893…

20240903

mount 我们会惊奇的发现,无论网格在哪里,只要有山覆盖了,那么这里的贡献一定是 \(\sqrt{2}\),如下的图可以证明:那么我们就只用开一个线段树,维护的是最小值和最小值的出现次数,如果最小值不为 \(0\),那么这部风就没有贡献,反之贡献就要加上最小值的出现次数 细节 由于我们可以…

南沙C++信奥赛陈老师解一本通题: 1963:【13NOIP普及组】小朋友的数字

​【题目描述】有 nn 个小朋友排成一列。每个小朋友手上都有一个数字,这个数字可正可负。规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值。 作为这些小朋友的老师,你需要给每个小朋友一个分数,分数是这…

Python工程数学2程序开胃菜(上)

2 数学程序开胃菜 在上一章中( https://mp.weixin.qq.com/s/kKenXcEXIeLd_u_2kymF8A ),我们介绍了python的IDE;用numpy实现向量计算;用Matplotlib绘图;用sympy实现微积分和求导;用SciPy实现积分;用VPython实现弹跳球动画。在本章中,您将了解 Python 命令式编程风格的线…