当前位置: 首页 > news >正文

缓存相关知识总结

一、缓存的作用和分类

        缓存可以减少数据库的访问压力提升整个网站的数据访问速度改善数据库的写入性能。缓存可以分为两种:

        缓存在应用服务器上的本地缓存:访问速度快,但受应用服务器内存限制

        缓存在专门的分布式缓存服务器上的远程缓存:访问速度慢,但内存不受限制

二、常见的缓存技术

        MemCache:是一个高性能的分布式内存对象缓存系统,用于动态网络应用以减轻数据库负载。Memcache在内存内维护一个统一的巨大的hash表,数据存在hash表中。

        Redis:是一个开源的使用ANSI C语言编写、支持网络、可给予内存亦可持久化的日志型、Key-Value数据库,支持多种数据类型(key-value,list,set,string,对象等),并提供多种语言的API。

        Squid:Squid是一个高性能的代理缓存服务器,支持FTP,gopher,HTTPS和HTTP协议

        Redis和Memcache对比:

MemcacheRedis
数据类型简单的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学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…...

【大模型完全入门手册】——引言

博主作为一名大模型开发算法工程师,很希望能够将所学到的以及实践中感悟到的内容梳理成为书籍。作为先导,以专栏的形式先整理内容,后续进行不断更新完善。希望能够构建起从理论到实践的全流程体系。 助力更多的人了解大模型,接触大模型,一起感受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 概念 定义&#xff1a;定义一个算法族&#xff0c;并分别封装起来。策略让算法的变化独立于它的客户&#xff08;这样就可在不修改上下文代码或其他策略的情况下…...

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 的设备上&#xff0c;iOS 12 及以上版本系统中的 Safari浏览器支持 AR Quick Look&#xff0c; 因此可以通过浏览器直接使用3D/AR 的方式展示 Web 页面中的模型文件&#xff0c;目前 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学习中&#xff0c;了解到字段名称是不能修改的&#xff0c;只能用新建一个字段赋值过去再删除原字段这种方法实现&#xff0c;字段顺序的调整如果通过拖拽也是不能持久的&#xff0c;需要用导出一个新数据这种方法进行保存&#xff0c;可参考以下链接&#xff1…...

Study Pyhton

PyCharm PyCharm是一个写python代码的软件&#xff0c;用PyCharm写代码比较方便。 PyCharm快捷键ctrl alt s打开软件设置ctrl d复制当前行代码 shift alt 上\下将当前行代码上移或下移crtl shift f10运行当前代码文件shiftf6重命名文件 ctrl a全选ctrl c\v\x复制、粘贴、…...

【MySQL】:深入解析多表查询(下)

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 自连接1.1 自连接查询1.2 联合查询 二. 子查询2.1 概述2.2 分类2.3 标量子查…...

图像入门处理4(How to get the scaling ratio between different kinds of images)

just prepare for images fusion and registration ! attachments for some people who need link1 图像处理入门 3...

【项目精讲】Swagger接口文档以及使用方式

Swagger 介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/) 前后端分离开发&#xff0c;有利于团队合作接口的文档在线自动生成&#xff0c;降低后端开发人员编写接口文档的负担功能测试 如何使…...

ThingsBoard通过服务端获取客户端属性或者共享属性

MQTT基础 客户端 MQTT连接 通过服务端获取属性值 案例 1、首先需要创建整个设备的信息&#xff0c;并复制访问令牌 ​2、通过工具MQTTX连接上对应的Topic 3、测试链接是否成功 4、通过服务端获取属性值 5、在客户端查看对应的客户端属性或者共享属性的key 6、查看整个…...

(78)删除有序数组中的重复项(79)排序矩阵查找

文章目录 1. 每日一言2. 题目(78)删除有序数组中的重复项2.1 解题思路2.2 代码 3. 题目(79)排序矩阵查找3.1 解题思路3.1.1 暴力查找暴力查找代码 3.1.2 二分查找二分查找代码 3.1.3 贪心贪心代码 4. 结语 1. 每日一言 水晶帘动微风起&#xff0c;满架蔷薇一院香。 —高骈- 2.…...

elasticSearch从零整合springboot项目实操

type会被弃用 &#xff0c;就是说之后的elasticSearch中只会存在 索引&#xff08;indices&#xff09; 和 一行&#xff08;document&#xff09; 和字段&#xff08;fields&#xff09; elasticSearch 和solr的区别最大的就是 es对应的 是 json的格式 。 solr有xml和josn等…...

【Linux实践室】Linux高级用户管理实战指南:用户所属组变更操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux查看用户所属组2.1.1 &#x1f47b;使…...

C语言: 字符串函数(下)

片头 在上一篇中,我们介绍了字符串函数。在这一篇章中&#xff0c;我们将继续学习字符串函数&#xff0c;准备好了吗&#xff1f;开始咯&#xff01; 1.strncpy函数 1.1 strncpy函数的用法 strncpy是C语言中的一个字符串处理函数&#xff0c;它用于将一个字符串的一部分内容…...

WPF 数据绑定类属性 和数据更新

WPF中数据绑定是一个非常强大的功能&#xff0c;不仅可以绑定后台数据&#xff0c;还可以进行实时更新。 数据绑定实例 : 在后台创建模型类&#xff0c;然后在标签页面进行导入并绑定。 第一步: // 在后台创建模型类 public class MyData {public string Name { get; set; }…...

使用云服务器搭建CentOS操作系统

云服务器搭建CentOS操作系统 前言一、购买云服务器腾讯云阿里云华为云 二、使用 XShell 远程登陆到 Linux关于 Linux 桌面下载 XShell安装XShell查看 Linux 主机 ip使用 XShell 登陆主机 三、无法使用密码登陆的解决办法 前言 CentOS是一种基于Red Hat Enterprise Linux&#…...

unity的引用传递和数组的联系

引用传递 //引用传递 static void SetY(out int x,out int y ){x 0;y 0;x 1000;}static void Main(string[] args){int x 0;int y 10;SetY(out x, out y);Console.WriteLine($"x{x},y{y}");} 结果是&#xff1a;x1000&#xff0c;y0 数组的引用传递 数组值…...

解决wordpress图片上传失真/app开发公司推荐

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4553 解题思路&#xff1a; ①题目的意思是询问当前是否能够给出空余的一段连续时间&#xff0c;并且这段时间尽可能靠前。 需要两棵树&#xff0c;一棵屌丝女神&#xff0c;另一棵女神 对于屌丝询问第一棵树…...

用dw怎么做网站/淘宝权重查询入口

背景 在上午探索了Windows下时间任务创建运行的可视化界面和Schtasks命令行工具且默默失败后&#xff0c;下午我决定不依不饶地去看一下Linux系统下是怎么创建时间任务的。其实我Linux接触得不多&#xff0c;而且今天也是新接触的crontab命令&#xff0c;所以不免会踩坑踩雷&am…...

百度快速排名技术培训教程/免费的关键词优化软件

一. JVM内存区域的划分 1.1 java虚拟机运行时数据区 java虚拟机运行时数据区分布图&#xff1a; JVM栈&#xff08;Java Virtual Machine Stacks&#xff09;&#xff1a; Java中一个线程就会相应有一个线程栈与之对应&#xff0c;因为不同的线程执行逻辑有所不同&#xff0…...

注册网站域名用什么好处/手机网站建设价格

如何减少运维团队的日常琐事&#xff1f;如何将服务平台化&#xff0c;赋予用户自我服务的能力&#xff1f;新东方云利用Rancher容器管理平台、Harbor镜像仓库和GitLab构建企业应用商店。赋能运维团队和用户&#xff0c;尝试破解用户自服务的难题。开场先讲个小故事&#xff1a…...

wordpress企业网站模板/北京百度推广公司

杨利民&#xff1a; 点击打开链接王静&#xff1a; 点击打开链接颜洁&#xff1a; 点击打开链接伍道军&#xff1a; 点击打开链接陈俊&#xff1a; 点击打开链接 向慧琳&#xff1a;点击打开链接 张埂铝&#xff1a;点击打开链接 蒋俊&#xff1a;点击打开链接 代思雨&#xff…...

电子商务网站建设影响因素/新品上市的营销方案

apache flinkApache flink是下一代大数据工具&#xff0c;也称为4G大数据。 这是真正的流处理框架&#xff08;不会将流切成小批&#xff09;。 Flink的内核&#xff08;核心&#xff09;是流式运行时&#xff0c;它还提供分布式处理&#xff0c;容错等功能。Flink以一致的高速…...