【Redis 神秘大陆】001 背景基础理论

一、背景&基础理论

1.1 什么是缓存

缓存:存储在计算机上的一个原始数据复制集,以便于访问——维基百科

1.2 为什么用缓存

  • 提升用户体验: 【即效率、效益和基本主观满意度】CAST

  • 使用者的状态、系统性能及环境,不同的人对于同样的软件可能有不同的主观感受,而且不同的人对于软件性能关心的视角也不同。

  • 提升系统的性能: 缓存离用户最近,利用缓存可以最小化系统的工作量,能够降低系统的链路

  • 响应时间: 指系统对用户请求做出响应的时间,与人对软件性能的主观感受是非常一致的,它完整地记录了整个系统处理请求的时间,

  • 响应时间= 呈现时间(取决于页面)+系统响应时间【网络传输+应用延迟时间】

  • 延迟时间: 网络传输+应用延迟

  • 吞吐量: 系统在单位时间内处理请求的数量

  • 无并发的系统,吞吐量与响应时间成反比

  • 并发用户数: 并发用户数能够笼统的概括系统性能指标

  • 资源利用率: 资源利用率能够反馈资源的占用情况

1.3 缓存的分类

软件位置划分

客户端缓存
  • 页面缓存: 页面自身元素缓存【之前渲染的页面保存为文件 localStorage 存储】+服务端对静态页面进行缓存 【CDN】

  • 浏览器缓存:

  • 通过请求头: e-tag标记文件 id ,if-modified-sincence 标识更新时间, http 协议,通过发送下载时间给服务端,服务端如果发现没有变更则返回 304-not modified ,客户端收到后可以直接使用缓存文件

  • Cache-control 和 Expires 一致,Cache-Control 选择更多。 cache-control

  • Cache-control|Expires > last-modified/etag

  • APP 缓存: 内存缓存、数据库缓存,文件缓存,用于 均衡网速、流量

服务端缓存
  • 数据库缓存:

  • MySQL 的查询缓存,通过下面命令进行判断是否合理,核心考察缓存命中率

SHOW VARIABLES LIKE '%query_cache%';

have_query_cache	YES
query_cache_limit	1048576
query_cache_min_res_unit	1024
query_cache_size	3145728
query_cache_type	OFF
query_cache_wlock_invalidate	OFF
  • Innodb 的缓存性能: innodb_buffer_pool_size,可以通过
SHOW VARIABLES LIKE 'innodb_buffer_pool_size%';
innodb_buffer_pool_size	51539607552  48G
  • (Innodb_buffer_pool_read_requestsInnodb_buffer_pool_reads)/Innodb_buffer_pool_read_requests*1 00%计算缓存命中率,并根据命中率来调整innodb_buffer_pool_size 参数大小进行优化。

  • 平台缓存: Ehcache、GuaCache [JVM]

  • 应用缓存: Redis 【新浪微博】、memCache 等

img

网络中的缓存
  • 代理缓存: 较流行的是Squid,它支持建立复杂的缓存层级 结构,拥有详细的日志、高性能缓存以及用户认证支持
  • 边缘缓存: 例如 Nginx、CDN

正向代理主要处理客户端请求,反向代理主要处理服务器端响应

  • 正向代理:指客户端通过代理服务器请求目标服务器的行为,即代理服务器代表客户端去请求目标服务器。客户端和代理服务器之间通过协议进行通讯。
  • 反向代理:指目标服务器通过代理服务器来响应客户端请求的行为。客户端直接请求代理服务器,然后由代理服务器去选择目标服务器来进行响应。代理服务器和目标服务器之间采用内部协议通讯。

宿主层次划分

类型描述
本地缓存/进程内缓存[L1 L2 L3] JVM jVM存储在应用服务器本地的缓存模式,通常位于同一个JVM内。 本地缓存也称为进程内缓存,直接访问进程所属内存,无需进程间通信,速度最快。 可分为堆内缓存和堆外缓存。堆内缓存会对垃圾回收产生影响,而堆外缓存则会增加序列化和反序列化的开销。
进程间缓存当进程内缓存较大时,重启后需要重新加载缓存,导致系统启动缓慢。可通过在本机单独启动一个进程来专门存放缓存,并通过Domain Socket进行通信。
远程缓存需要跨服务器访问的缓存,数据存放于单独的缓存服务器上。 典型的远程缓存包括Memcached和Redis等。
二级缓存是本地缓存和远程缓存的结合,用于互联网系统。对于易变的数据,散列到分布式部署的远程缓存,减少数据库层访问以提升性能。对于不易改变但访问量大的数据,则进一步放置到本地缓存中,以获得更高的访问性能。

img

  • 大型网站的架构示意图

1.4 基础理论

CAP 理论

  • C:一致性被称为原子对象,任何的读写都应该看起来是“原子”的, 或串行的。写后面的读一定能读到前面写的内容。所有的读写请求都好像被 全局排序。

  • A:对任何非失败节点都应该在有限时间内给出请求的回应。(请求的 可终止性)

  • P:允许节点之间丢失任意多的消息,当网络分区发生时,节点之间的 消息可能会完全丢失。

  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否有同样的值。(等同于所有节点访问同一份最新的数据副本)

  • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客 户端的读写请求。(对数据更新具备高可用性)

  • 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。 系统如果不能在一定时限内达成数据一致性,就意味着发生了分区的情况, 必须就当前操作在C和A之间做出选择。

  • 当网络发生分区时,由于通信路线中断,不可能同时满足一致性和可用性。

  • 一致性需要每个请求返迴之前保证所有分布式节点都达成一致,这与分区情况下不同节点暂时失联是矛盾的。

  • 但是由于网络是不可靠的,分区故障是无法避免的。那么在分区期间,系统要么选择延迟请求得到一致应答(C优先),要么返回可用但可能不一致的快速应答(A优先)。

  • 所以在分布式系统,我们只能做到优先满足CAP中的任何两项,而第三项必须作出让步。

todo : 待确认

模型一致性(Consistency)可用性(Availability)分区容忍性(Partition Tolerance)不能满足的原因
RedisRedis集群在节点选举期间可能出现部分不可用,牺牲了可用性。
ZooKeeperZooKeeper集群在Leader选举期间可能出现部分不可用,牺牲了可用性。

BASE 理论

  • BASE 分别是基本可用性(Basically Available)、柔性事务(Soft State)和最终一致性(Eventually Consistent)的缩写

例如 RocketMQ 的事物消息

JSR 规范

📎JSR107FinalSpecification.pdf

Map<String,<Map<String,Object>>> = Cache 用户信息缓存

<Map<String,Object> = > Entry

Spring-Data-Cache

  1. 基础概念:介绍了核心接口,包括CachingProvider、CacheManager、Cache、Entry和ExpiryPolicy,以及它们的职责和关系。

  2. CacheProvider 创建 CacheManager

  3. CacheManager 管理 Cache

  4. Cache 类似 Map 的数据结构并且存储 Key 为索引的值

  5. Entry: 是存储在 Cache 中的 Key-Value

  6. ExpiryPolicy : 缓存过期策略

  7. 一致性模型:讨论了缓存操作的一致性行为,包括默认一致性模型和可能的其他一致性模型。

  8. 缓存拓扑:描述了缓存条目可能存储的位置,包括本地和分布式环境。

  9. 执行上下文:解释了EntryProcessors、CacheEntryListeners、CacheLoaders、CacheWriters和ExpiryPolicys在缓存操作中的执行环境。

  10. 再入性:讨论了在这些接口的实现中可能限制的再入性。

  11. 简单示例:提供了一个创建和使用缓存的基本示例。

  12. CacheManagers:详细介绍了CacheManager的职责,包括如何获取、配置、创建、关闭和销毁缓存。

  13. 缓存:描述了Cache接口及其方法,以及如何使用它来执行缓存操作。

  14. 缓存注释介绍了一组用于简化缓存交互的注释,如**@CacheDefaults****、@CacheResult@CachePut@CacheRemove和****@CacheRemoveAll****。**

  15. 管理:讨论了如何启用和禁用缓存的管理功能和统计信息。

  16. 可移植性建议:提供了一系列建议,以确保应用程序在使用Java Caching API的不同实现之间具有良好的可移植性。

img

客户端层:使用者直接通过该层与数据进行交互。

缓存提供层:主要对缓存管理层的生命周期进行维护,负责缓存管理 层的创建、保存、获取以及销毁。

缓存管理层:主要对缓存客户端的生命周期进行维护,负责缓存客户 端的创建、保存、获取以及销毁。

缓存存储层:负责数据以什么样的形式进行存储。

基本存储层:是以普通的ConcurrentHashMap为存储核心,数据不淘 汰。

LRU存储层:是以最近最少用为原则进行的数据存储和缓存淘汰机制。

Weak存储层:是以弱引用为原则的数据存储和缓存淘汰机制。

1.5 通用逻辑

imgimg

如果觉得内容对你有帮助的话,还请点个免费的 Star,这是对我最大的鼓励,感谢各位一起同行,共勉!传送门:GitHub | Gitee

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二维码生成器怎么做网址活码?链接制作二维码的方法

如何使用网址二维码生成器的功能来制作二维码呢&#xff1f;现在很多人会将网址生成二维码之后&#xff0c;分享给其他人通过手机扫码来打开网页获取内容&#xff0c;这种方式有利于网页的快速传播与分享&#xff0c;而且可以让更多的人同时访问对应的网页。那么网址转二维码的…

《二》Qt Creator工具介绍与使用

一、关于界面 点击文件--->新建文件或项目会出现如下图&#xff1a; 我们选择第一个 点击下一步下一步&#xff1a; 继续下一步直到结束&#xff1a; 二&#xff0c;具体文件介绍 我们点击pro查看以下 QT core gui第1行 表示使用qt的core和gui库&#xff0c;如果以后…

【C++程序员的自我修炼】日期类Date的实现

山河日月镌刻璀璨初心 八载春秋写就举世华章 目录 日期类Date的实现 构造函数 拷贝构造函数 获取月份天数的函数 日期类的检查 日期类的打印 运算符重载日期类的比较 运算符重载> 运算符重载 运算符的复用 日期加天数 日期减天数 ​编辑 运算符重载 运算符重载- 日期类的前…

11.盛最多水的容器(Java,双指针)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同…

PHP01——php快速入门 之 在Mac上使用phpstudy快速搭建PHP环境

PHP01——php快速入门 之 在Mac上使用phpstudy快速搭建PHP环境 0. 前言1. 下载小皮面板1.1 下载phpstudy&#xff08;小皮面板&#xff09;1.2 启动、简单访问1.2.1 启动Apache1.2.2 访问1.2.3 访问自定义文件或页面 2. 创建网站2.1 创建网站2.2 可能遇到的问题2.2.1 hosts权限…

企业指标开发流程新主张

作为数据开发人员&#xff0c;你是否在指标开发过程中有过如下苦恼&#xff1a; Q1、 &#xff08;甲方&#xff09;业务人员&#xff1a;你这个指标计算逻辑不对&#xff0c;我们前期不是这么对的。 &#xff08;乙方&#xff09;卑微的你&#xff1a;Fu*k……我有录音。 …

创建和使用pipenv

创建pipenv 1.环境区别2.安装pipenv3.使用1.创建项目名称2.创建pipenv环境3.安装包1.安装包卡顿或卡住 4.查看包之间联系5.进入虚拟环境6.只安装dev环境的包7.常见的pipenv指令 1.环境区别 真实环境 真实环境可能被系统的其他软件依赖&#xff0c;下载包可能导致其他软件环境变…

Spark Standalone模式部署

准备至少2台虚拟机&#xff0c;装好linux系统&#xff0c;我装的是Ubuntu20.04。 1.修改主机名&#xff08;每台&#xff09; 1&#xff09;修改/etc/hostsname内容&#xff0c;主节点改为master&#xff0c;子节点改为slaver1 sudo vim /etc/hostname 2&#xff09;在/etc/…

【面试经典 150 | 数学】阶乘后的零

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;数学优化计算 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结…

防御性编程失败,我开始优化我写的多重 if-else 代码

最近防御性编程比较火&#xff0c;码农出身&#xff08;前后端内推&#xff09;的我不得试试 不出意外我被逮捕了&#xff0c;组内另外一位同事对我的代码进行了 CodeReview&#xff0c;我的防御性编程编程没有幸运逃脱&#xff0c;被标记上了“多重 if-else ”需要进行优化。 …

数据结构速成--链表

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…

中仕公考:2024山东高校毕业生“三支一扶”开始报名

2024年度山东省高校毕业生‘三支一扶’计划开始报名&#xff0c;此次全省共计招募1350名。 招募范围&#xff1a; 30周岁及其以下的山东省内普通高校全日制毕业生(1993年4月以后出生) 报名时间&#xff1a;2024年4月16日9:00—4月20日16:00 查询时间&#xff1a;2024年4月1…

在Docker里面修改mysql的密码(8.0以上版本)

介绍 我们在阿里或者华为的服务器上安装了mysql而且还公开了端口3306恰好你创建的容器的端口也是3306;那么我建议你修改mysql的密码,而且越复杂越好,因为我就被黑客给攻击过 修改密码 首先我们要启动好mysql容器 进入容器内部 **docker exec -it mysql bash ** 登入初始…

Qt for Android 开发环境

在搭建环境时开始感觉还挺顺利的&#xff0c;从 Qt 配置的环境里面看并没有什么问题&#xff0c;可真正编译程序的时候发现全是错误。 最开始的时候安装了 JDK21 最新版本&#xff0c;然后根据 JDK21 安装 ndk, build-tools, Platform-Tools 和 Gradle&#xff0c;但是不管这么…

基于SpringBoot+Vue的城镇住房管理系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了城镇保障性住房管理系统的开发全过程。通过分析城镇保障性住房管理系统管理的不足&#xff0c;创建了一个计算机管理城镇保障性住房管理系统的方案。文章…

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)

【k8s】&#xff1a;深入理解 Kubernetes 中的污点&#xff08;Taints&#xff09;与容忍度&#xff08;Tolerations&#xff09; 1、污点&#xff08;Taints&#xff09;2、容忍度&#xff08;Tolerations&#xff09;3、示例演示-测试污点的具体应用场景3.1 给节点打污点&…

ThinkPHP V5.1框架源码

源码下载地址&#xff1a;ThinkPHP V5.1.zip www WEB部署目录&#xff08;或者子目录&#xff09; ├─application 应用目录 │ ├─common 公共模块目录&#xff08;可以更改&#xff09; │ ├─module_name 模块目录 │ │ ├─common.php 模块函数文件 │ │ ├─controll…

Springboot+Vue项目-基于Java+MySQL的免税商品优选购物商城系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

DBA面试总结(Mysql篇)

一、delete与trancate的区别 相同点 1.两者都是删除表中的数据&#xff0c;不删除表结构 不同点 1.delete支持按条件删除&#xff0c;TRUNCATE不支持。 2.delete 删除后自增列不会重置&#xff0c;而TRUNCATE会被重置。 3.delete是逐条删除&#xff08;速度较慢&#xff09…

LeetCode 面试经典150题 219.存在重复元素II

题目&#xff1a;给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 思路&#xff1a; 代码…