总结Redis的原理

news2024/10/25 8:27:21

一、为什么要使用Redis

  • 缓解数据库访问压力
  • mysql读请求进行磁盘I/O速度慢,给数据库加Redis缓存(参考CPU缓存),将数据缓存在内存中,省略了I/O操作

二、Redis数据管理

2.1 redis数据的删除

定时删除+惰性删除+内存淘汰
问题1:内存也是有空间限制的
方案1:加超时时间
问题2:超时数据量大,无法一次性删除
方案2:随机算法删除(惰性删除)
问题3:有些超时数据运气好,一直没有被随机匹配到
方案3:在查询时判断是否过期,确认为过期的数据被动式触发删除
问题4:没有被随机删除也没有被查询的数据越来越多
方案4:内存淘汰策略
在这里插入图片描述

2.2 特殊缓存处理

缓存穿透:查询不存在的数据

方案:缓存空结果null+过期时间

缓存雪崩:大量缓存同时失效(大量不同的请求打到数据库)

方案:原有失效时间上增加随机值,即过期时间均匀分布+热点数据永不过期

缓存击穿:超高并发访问一个正好失效的Key(大量相同的请求打到数据库)

方案:加锁(用户出现大并发访问的时候,在查询缓存的时候和查询数据库的过程加锁,只能第一个进来的请求进行执行,当第一个请求把该数据放进缓存中,接下来的访问就会直接集中缓存)
热点数据永不过期,不设置热点key的失效时间

2.3 热点key

热key:在极短的时间内访问频次非常高的key

2.3.1 如何定位热点key?

提前预测

  • 凭业务经验

实时收集

  • 独立的热key检测系统:将该SDK引入到应用系统
  • 客户端收集:Redis服务器有专门的客户端工具SDK(Redisson),可以对其进行改写封装(理解:二次开发,缺点:代码有入侵性,维护成本高,存在语言异构和版本升级问题),在发送请求前进行收集采集,并上报到统一的服务进行聚合计算。
  • 代理层收集:如果Redis的请求都经过代理的话,考虑改写proxy代码收集
  • Redis定时扫描:使用Redis的自带命令-Hotkeys参数
  • Redis节点抓包:通过tcpdump抓取一段时间内的流量并上报,然后由一个外部的程序去解析并计算(缺点:流量高时抓包数据量过大,负担大)

2.3.2 解决方案

  • 本地缓存(guava cache或caffeine)
    发现热点key后将其加载到JVM中,不用到DB或Redis中查询
    在这里插入图片描述
    理解
    1 请求访问热点key,先经过负载均衡器,到达Nginx集群,
    2 再由Nginx通过负载均衡到达应用网关
    3 网关转发到后端微服务
    4 准备热key检测系统

    • 1 管理后台dashboard:管理热key的规则,如userId,活动id,以及可视化。
    • 2 注册中心:管理分布式服务集群。
    • 3 实时计算程序:根据前端传来的key。
    • 4 SDK:用于接入外部系统。
    • 由注册中心将这4块进行连接互通

    5 计算得到的热key通过SDK传入系统并写入本地缓存
    6 请求访问本地缓存,如果存在热点key,则读取Redis并写入本地缓存,
    7 此时,前端再次访问时就可以直接从本地缓存拿到数据

  • 冗余存储备份key
    设计思想:将热key分成不同的小key(比如key拼接节点ID),存储在不同的Redis节点上,降低数据的倾斜,通过小key分流,分散请求到Redis节点,
    将热点key拼接节点ID,去当前访问的Redis判断是否有值,如果没有则读取数据库,存入Redis并返回数据

  • 限流熔断(兜底方案)
    限流(Nginx-集成lua脚本插件、网关、微服务-hystrix或sentinel对服务接口限流)

三、Redis为什么这么快

  • Redis基于内存,内存的访问速度是磁盘的上千倍
  • Redis内置了多种优化后的数据结构实现,性能高
  • Redis基于reactor模式开发了一套高效的事件处理模型(单线程事件循环,IO多路复用,类似netty网络通信)

四、Redis的备份机制

Redis数据持久化

  • RDB:在指定的时间间隔内生成数据集的时间点快照(理解:数据备份,不同时间段的数据都放在一个RDB文件中)
    问题:数据丢失。如果 Redis 宕机,那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。
  • AOF:(append-only file,追加操作的文件)记录服务器执行的所有写操作命令(理解:参考了MySQL的Binlog日志),命令会暂存在Redis的aof_buf中,从缓存中写入AOF。
    在服务器启动时,通过重新执行这些命令来还原数据集
    问题1:命令多
    方案1:指令合并
    问题2:耗时间
    方案2:fork出子进程进行处理指令合并
    问题3:子进程在重写期间,如果进行了数据修改,就会出现数据不一致
    方案4aof_rewrite_buf,从fork子进程起后面写入的命令也copy到重写缓存区,等子线程重写结束,将重写缓存区的命令写入AOF

五、Redis主从同步

  • 主节点负责写,从节点负责读
  • 当从节点宕机时,主节点发送RDB文件给从节点进行数据同步
  • 为了进行快速同步,主节点中设置缓存区,并设置复制偏移量(目的:确认缺失的信息范围)

六、Redis哨兵机制

在这里插入图片描述

解决主节点宕机问题,实现高可用

  • sentinel哨兵负责统筹协调,监控主节点(定时去确认其响应能力)
  • 哨兵集群(规定数量认定主节点客观下线)
  • 故障转移:选择新的主节点(规则:复制偏移量最大的节点),主节点进行数据同步,将原主节点改为从节点

七、Redis集群

在这里插入图片描述

加入集群:需要和其中一个Redis(IP+端口)建立联系(类似TCP三次握手),Redis原集群内部进行同步确认
数据存储任务分配:槽位slot(类似哈希表),内存空间大的占更多的槽位。

在这里插入图片描述
信息同步:redis节点之间要同步自己所负责的槽位信息
问题1:数据量大,
方案1:每个槽位用1bit表示,自己负责的为1,不负责的为0
在这里插入图片描述
问题2:定位节点麻烦
方案2:用一个超大的数组存储每个槽位,空间换时间

struct clusterNode *slots[16384/8];

集群工作确认请求的位置是不是自己负责,如果不是则返回一个moved错误给请求端,同时发出对应的负责节点的IP和端口

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多层菜单的实现方案(含HierarchicalDataTemplate使用)

1、递归 下面是Winform的递归添加菜单栏数据,数据设置好父子id方便递归使用 在TreeView的控件窗口加载时,调用递归加载菜单 private void LoadTvMenu(){this.nodeList objService.GetAllMenu(); // 通过Service得到全部数据// 创建一个根节点this.t…

NCDA设计大赛中设定画命题解读

一年一度的未来设计师全国高校数字艺术设计大赛(NCDA)正在如火如荼的进行中,各高校的大学生和指导老师们也都在着手准备中。今天我们就特地来说说它的数字绘画命题之一的设定画选项,为了使大家更好地参加本次比赛,本文…

博客系统测试

文章目录 1.项目背景介绍2.功能介绍3.手动测试3.1编写测试用例3.2项目测试3.2.1登录测试3.2.2查看详情页面3.2.3编辑页面3.2.4删除博客3.2.5注销用户 大家好,我是晓星航。今天为大家带来的是 博客系统测试 相关的讲解!😀 1.项目背景介绍 项…

Vue.js+SpringBoot开发农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理:2.2.2 位置信息管理:2.2.3 配送人员分配:2.2.4 路线规划:2.2.5 个人中心:2.2.6 退换快递处理:…

DxO ViewPoint:摄影师的最 佳拍档,记录世界的每一刻精彩 mac/win版

DxO ViewPoint是一款革命性的摄影软件,它以其独特的功能和卓越的性能,重新定义了摄影体验。这款软件不仅提供了丰富的摄影工具,还通过先进的算法和技术,让摄影师能够轻松捕捉、管理和展示他们的作品。 DxO ViewPoint 软件获取 Dx…

《幸运的基督徒》Python

题目描述 有15个基督徒和15个非基督徒在海上遇险, 为了能让一部分人活下来不得不将其中15个人扔到海里面去, 有个人想了个办法就是大家围成一个圈,由某个人开始从1报数, 报到9的人就扔到海里面,他后面的人接着从1开始报…

unity学习(49)——服务器三次注册限制以及数据库化角色信息4--角色信息数据库化

1.此处下断开始调试,list函数内就有问题: 2. 现在的问题是只读不写!32行就是写入部分的代码: 3. 很奇怪,调试的时候确实是写进来了 程序正常执行后,文件中数据也没有消失 关闭服务器文件内容依旧正常。 players包含所…

px2rem实现vue项目响应式布局

第一步 首先需要在项目中安装px2rem插件 npm install postcss-px2rem px2rem-loader --save 第二步 在项目src目录下新建util文件夹,在util文件夹下新建rem.js文件,内容如下: // rem等比适配配置文件 // 基准大小 const baseSize 14 //…

day14_异常

今日内容 零、 复习昨日 一、日期类 二、异常 零、 复习昨日 1为什么要重写toString Object类toString返回的是对象名字地址,无意义子类重写toString() 返回的对象属性内容 2为什么要重写equals Object类equals判断是对象的地址值是否相等,无意义子类重写equals,为了判断对象的…

电商分享沙龙干货:做印尼电商如何提高顾客购买意愿?

“得印尼者得东南亚” 这是诸多在印尼掘金的电商人的共识。2.7亿人口、GDP年增速稳定在5%、平均年龄在30岁上下、较强的消费能力……这些都使得印尼成为电商人掘金东南亚的首选之地。 图源:freepik 但近几年来,印尼政府不断调整关税,限制电商…

SAP MM学习笔记 - 错误 BMG140 - The material number is longer than the length set

错误 BMG140 - The material number is longer than the length set 品目编号大于长度设置 1,在新规品目的时候,出的错 2,OMSL 品目Code书式变更 IMG path>Logistic general>Material Master>Basic settings>Define output for…

滴滴基于 Clickhouse 构建新一代日志存储系统

ClickHouse 是2016年开源的用于实时数据分析的一款高性能列式分布式数据库,支持向量化计算引擎、多核并行计算、高压缩比等功能,在分析型数据库中单表查询速度是最快的。2020年开始在滴滴内部大规模地推广和应用,服务网约车和日志检索等核心平…

电脑自带dll修复在哪里,dll修复工具一键修复dll丢失问题

xinput1_3.dll文件是一个Windows操作系统中的动态链接库(DLL)文件,它是微软DirectX软件开发包的一部分,主要用于支持游戏控制器和其他输入设备的交互。这个文件是DirectInput API的一个组件,DirectInput是DirectX中处理…

聚焦两会 | 从2024年政府工作报告看网络安全新机

在今年的《政府工作报告》(下面简称“报告”)中,除了对2023年里我国所取得的重大成就作了全面总结外,针对2024年全年经济社会发展作出的部署安排引起全国人民的关注。报告中与网络安全相关的内容也引起网络安全行业相关从事人员的…

wpf prism左侧抽屉式菜单

1.首先引入包MaterialDesignColors和MaterialDesignThemes 2.主页面布局 左侧菜单显示在窗体外&#xff0c;点击左上角菜单图标通过简单的动画呈现出来 3.左侧窗体外菜单 <Grid x:Name"GridMenu" Width"150" HorizontalAlignment"Left" Ma…

TypeScript 中类、接口、枚举、函数、命名空间与模块的理解?应用场景?

文章目录 类、接口、枚举定义使用方式**1. 类**继承修饰符私有修饰符受保护修饰符只读修饰符 静态属性抽象类 接口 interface枚举 enum数字枚举字符串枚举异构枚举本质 函数function可选参数剩余类型函数重载 模块命名空间命名空间与模块区别应用场景有需要的请私信博主&#x…

php安装kafka

我的开发环境是php7.3 ,先来部署两个php扩展&#xff0c;php7.3目录下放librdkafka.dll,ext/php_rdkafka.dll&#xff0c;php.ini增加,[rdkafka] extension php_rdkafka.dll php7.3对应的扩展包链接&#xff1a;PECL :: Package :: rdkafka 看自己php版本对应在这里找PECL :: …

java 获取项目内的资源/配置文件

【getResourceAsStream】是java中用于获取项目内资源的常用方法&#xff0c;能够返回一个数据流&#xff0c;从而允许我们读取指定路径下的资源文件。这个方法可以用来读取各种类型的资源文件&#xff0c;包括但不限于文本文件、图像文件、配置文件等。 要使用getResourceAsStr…

论文阅读_世界模型

1 2 3 4 5 6 7 8英文名称: World Models 中文名称: 世界模型 链接: https://arxiv.org/abs/1803.10122 示例: https://worldmodels.github.io/ 作者: David Ha, Jurgen Schmidhuber 机构: Google Brain, NNAISENSE, Swiss AI Lab, IDSIA (USI & SUPSI) 日期: 27 Mar 2018 引…

基于Llama 2家族的提示词工程:Llama 2 Chat, Code Llama, Llama Guard

Prompt Engineering with Llama 2 本文是学习 https://www.deeplearning.ai/short-courses/prompt-engineering-with-llama-2/ 的学习笔记。 文章目录 Prompt Engineering with Llama 2What you’ll learn in this course [1] Overview of Llama Models[2] Getting Started wi…