缓存相关知识总结
一、缓存的作用和分类
缓存可以减少数据库的访问压力,提升整个网站的数据访问速度,改善数据库的写入性能。缓存可以分为两种:
缓存在应用服务器上的本地缓存:访问速度快,但受应用服务器内存限制
缓存在专门的分布式缓存服务器上的远程缓存:访问速度慢,但内存不受限制
二、常见的缓存技术
MemCache:是一个高性能的分布式内存对象缓存系统,用于动态网络应用以减轻数据库负载。Memcache在内存内维护一个统一的巨大的hash表,数据存在hash表中。
Redis:是一个开源的使用ANSI C语言编写、支持网络、可给予内存亦可持久化的日志型、Key-Value数据库,支持多种数据类型(key-value,list,set,string,对象等),并提供多种语言的API。
Squid:Squid是一个高性能的代理缓存服务器,支持FTP,gopher,HTTPS和HTTP协议
Redis和Memcache对比:
| Memcache | Redis | |
| 数据类型 | 简单的key/value结构 | 丰富的数据结构 |
| 持久性 | 不支持 | 支持 |
| 分布式存储 | 客户端哈希分片/一致性哈希 | 主从、哨兵、集群 |
| 多线程 | 支持 | 5.0以后的版本支持 |
| 内存管理 | 似有内存池/内存池 | 无 |
| 事务支持 | 不支持 | 有限支持 |
| 数据容灾 | 不支持,掉电消失 | 支持 |
三、缓存与数据库一致性方案
数据的读取:

1. 根据key从缓存中读取数据;
2. 若缓存中存在,则返回数据;
3. 若缓存中不存在,则从数据库中读取,并将数据写入缓存
数据的插入/更新/删除:

1. 先操作数据库中的数据内容
2. 根据操作更新相应缓存中的内容
四、缓存常见问题
一、缓存雪崩:
原因:大部分缓存同时失效,导致大量数据请求访问数据库,造成数据库崩溃
解决方案:1. 使用队列或锁,保证不会有大量线程对数据库进行高并发的读写
2. 为缓存设置不同的过期时间,固定数值+随即数值
3. 多级缓存,设置失效事件不同的缓存
二、缓存穿刺:
原因:查询数据库与缓存中都不存在的数据,造成性能浪费
解决方案:1. 当数据库中的结果为空时,在缓存中加入默认值。
2. 设置布隆过滤器:将所有可能存在的值放入一个bitmap中。
布隆过滤器介绍:
布隆过滤器用于快速识别一个元元素是否在集合中,通过一个长二进制向量和一系
列随机映射函数记录和识别某个数据是否在一个集合中。

| 优点 | 缺点 |
| 1. 占用内存小 2. 查询效率高 3. 不存储数据本身,数据安全性好 | 1. 有一定的误判性 2. 一般情况下不能从中删除元素 3. 不能直接获取需要的数据 |
三、缓存预热:
系统启动后,将相关的缓存数据世界加载到缓存系统中。
实现方案:
1. 编写相关的接口或页面
2. 数据量不大时,在项目启动后加载数据
3. 定时任务刷新缓存
四、缓存更新:
1. 定时清理过期缓存
2. 根据用户操作,将过期的请求更新到缓存中
五、缓存降级:
降级的目的是保证核心服务的可用,通过记日志等方式,将优先级不高的操作记录
五、Redis的相关介绍
1. Redis支持的数据类型
String,Hash(字典),List,Set, Sorted Set(有序集合)
2. Redis数据的淘汰策略
| 类型 | 策略 | 实现方式 |
| 不淘汰 | noeviction | 数据不过期,当内存不足时,写入操作报错 |
| 设置了过期时间的键空间 | volatile-random | 随即删除某个key |
| volatile-lru | 优先移除最近没使用过的key | |
| volatile-ttl | 优先移除剩余生命周期最短的key | |
| 全键空间 | allkeys-random | 随即删除某个key |
| volatile-lru | 优先移除最近没使用过的key |
3. Redis持久化实现方式
RDB方式:传统数据库中快照的思想,指定时间间隔将数据进行全量备份
AOF方式:传统数据库中日志的思想,把每条改变数据集的指令追加到AOF文件中
| 纬度 | RDB持久化方案 | AOF持久化方案 |
| 备份量 | 重量级的全量备份,整个数据库数据 | 轻量级的增量备份,一次只保存一个操作指令 |
| 间隔时间 | 较长 | 较短,默认1秒 |
| 还原速度 | 快 | 慢 |
| 备份事阻塞情况 | save会阻塞,bgsave不会 | 不会 |
| 备份文件大小 | 小,只有备份时刻的数据 | 大,包括每次操作的指令 |
| 安全性 | 低,备份间隔长,容易丢失数据 | 高,备份间隔短,数据精确 |
4. Redis分布式存储方式
主从模式:一主多从,主节点写数据,从节点度数据,主节点故障时手动切换

哨兵模式:有哨兵的一主多从,哨兵对节点进行健康监控,主节点故障时自动通过选举
的方式选择新的主节点

集群模式:分节点对等集群,分slots,不同slots的信息存储到不同的节点

5. Redis数据切片方案
| 分片方案 | 分片方式 | 举例 |
| 范围分片 | 按数据分为进行分配,如key值的范围 | 如0-999一组,1000-1999一组 |
| 哈希分片 | 通过对值进行hash运算后分片 | hash后的结果对节点数量取余,对取余结果进行分组 |
| 一致性哈希 | 哈希分片的升级 | 有利于节点扩展和删除,解决数据在节点上分布不均与 |
一致性哈希的实现方式:
1. 将存储节点抽象成一个环形,每个节点都有对应的值
2. 对数据进行哈希运算,按顺时针方向将其映射到离其最近的节点上去
3. 当有节点出现故障离线时,按照算法的映射方法,受影响的仅仅为环上故障节点开始
逆时针方向至下一个节点之间区间的数据对象
4. 当有节点插入式,按照算法的映射方法,受影响的仅仅为环上新节点开始逆时针方向
至下一个节点之间区间的数据对象
相关文章:
缓存相关知识总结
一、缓存的作用和分类 缓存可以减少数据库的访问压力,提升整个网站的数据访问速度,改善数据库的写入性能。缓存可以分为两种: 缓存在应用服务器上的本地缓存:访问速度快,但受应用服务器内存限制 缓存在专门的分布式缓存…...
Mapmost Alpha:开启三维城市场景创作新纪元
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
【大模型完全入门手册】——引言
博主作为一名大模型开发算法工程师,很希望能够将所学到的以及实践中感悟到的内容梳理成为书籍。作为先导,以专栏的形式先整理内容,后续进行不断更新完善。希望能够构建起从理论到实践的全流程体系。 助力更多的人了解大模型,接触大模型,一起感受AI的魅力! 在当今人工智能…...
在 Vue 3 中使用 Axios 发送 POST 请求
在 Vue 3 中使用 Axios 发送 POST 请求需要首先安装 Axios,然后在 Vue 组件或 Vuex 中使用它。以下是一个简单的安装和使用案例: 安装 Axios 你可以使用 npm 或 yarn 来安装 Axios: npm install axios # 或者 yarn add axios 使用 Axios…...
【LeetCode刷题记录】189. 轮转数组
189 轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: …...
1.open3d处理点云数据的常见方法
1. 点云的读取、可视化、保存 在这里是读取的点云的pcd文件,代码如下: import open3d as o3dif __name__ __main__:#1.点云读取point o3d.io.read_point_cloud("E:\daima\huawei\img\change2.pcd")print(">",point)#2.点云可视…...
https和http有什么区别,为什么要用https
HTTPS(Hypertext Transfer Protocol Secure)和HTTP(Hypertext Transfer Protocol)之间的主要区别在于安全性。 安全性: HTTP是一种明文传输协议,数据在客户端和服务器之间以明文形式传输,容易…...
微前端框架主流方案剖析
微前端架构是为了在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用(Frontend Monolith)后,随之而来的应用不可维护的问题。这类问题在企业级 Web 应用中尤其常见。 微前端框架内的各个应用都支持独立开发部署、不…...
安卓逆向之-Xposed RPC
引言: 逆向为最终的协议,或者爬虫的作用。 有几种方式,比如直接能力强,搞成协议。 现在好多加密解密都写入到so ,所以可以使用unidbg 一个可以模拟器so 执行的环境的开源项目。RPC 调用,又分为Frida, 还有今天讲的Xposed RPC。 原理: Xposed 可以hook ,然后可以直接…...
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
算法可以发掘本质,如: 一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏…...
预览pdf文件和Excel文件
开发的时候要一个可上传下载预览的静态页面以下是数据html <el-table v-loading"loading" :data"fileList" selection-change"handleSelectionChange"><el-table-column type"selection" width"55" align"ce…...
RT-thread线程间同步:事件集/消息队列/邮箱功能
一,事件集 1,事件集作用 事件集主要用于线程间的同步,与信号量不同,它的特点是可以实现一对多,多对多的同步。即一个线程与多个事件的关系可设置为:其中任意一个事件唤醒线程,或几个事件都到达后才唤醒线程进行后续的处理;同样事件也可以是多个线程同步多个事件。 2,…...
【机器学习】一文掌握机器学习十大分类算法(上)。
十大分类算法 1、引言2、分类算法总结2.1 逻辑回归2.1.1 核心原理2.1.2 算法公式2.1.3 代码实例 2.2 决策树2.2.1 核心原理2.2. 代码实例 2.3 随机森林2.3.1 核心原理2.3.2 代码实例 2.4 支持向量机2.4.1 核心原理2.4.2 算法公式2.4.3 代码实例 2.5 朴素贝叶斯2.5.1 核心原理2.…...
策略模式(知识点)——设计模式学习笔记
文章目录 0 概念1 使用场景2 优缺点2.1 优点2.2 缺点 3 实现方式4 和其他模式的区别5 具体例子实现5.1 实现代码 0 概念 定义:定义一个算法族,并分别封装起来。策略让算法的变化独立于它的客户(这样就可在不修改上下文代码或其他策略的情况下…...
Python学习从0开始——专栏汇总
Python学习从0开始——000参考 一、推荐二、基础三、项目一 一、推荐 Hello World in Python - 这个项目列出了用Python实现的各种"Hello World"程序。 Python Tricks - 这个项目包含了Python中的高级技巧和技术。 Think Python - 这是一本教授Python的在线书籍&…...
【iOS ARKit】Web 网页中嵌入 AR Quick Look
在支持 ARKit 的设备上,iOS 12 及以上版本系统中的 Safari浏览器支持 AR Quick Look, 因此可以通过浏览器直接使用3D/AR 的方式展示 Web 页面中的模型文件,目前 Web 版本的AR Quick Look 支持USDZ 格式文件。苹果公司有一个自建的3D模型示例库…...
Java基础-知识点03(面试|学习)
Java基础-知识点03 String类String类的作用及特性String不可以改变的原因及好处String、StringBuilder、StringBuffer的区别String中的replace和replaceAll的区别字符串拼接使用还是使用StringbuilderString中的equal()与Object方法中equals()区别String a new String("a…...
【GIS学习笔记】ArcGIS/QGIS如何修改字段名称、调整字段顺序?
在先前的ArcGIS学习中,了解到字段名称是不能修改的,只能用新建一个字段赋值过去再删除原字段这种方法实现,字段顺序的调整如果通过拖拽也是不能持久的,需要用导出一个新数据这种方法进行保存,可参考以下链接࿱…...
Study Pyhton
PyCharm PyCharm是一个写python代码的软件,用PyCharm写代码比较方便。 PyCharm快捷键ctrl alt s打开软件设置ctrl d复制当前行代码 shift alt 上\下将当前行代码上移或下移crtl shift f10运行当前代码文件shiftf6重命名文件 ctrl a全选ctrl c\v\x复制、粘贴、…...
【MySQL】:深入解析多表查询(下)
🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. 自连接1.1 自连接查询1.2 联合查询 二. 子查询2.1 概述2.2 分类2.3 标量子查…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
