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

总结Redis的原理

一、为什么要使用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:子进程在重写期间,如果进行了数据修改,就会出现数据不一致
    方案3aof_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和端口

相关文章:

总结Redis的原理

一、为什么要使用Redis 缓解数据库访问压力mysql读请求进行磁盘I/O速度慢,给数据库加Redis缓存(参考CPU缓存),将数据缓存在内存中,省略了I/O操作 二、Redis数据管理 2.1 redis数据的删除 定时删除惰性删除内存淘汰…...

计算机设计大赛 疲劳驾驶检测系统 python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…...

什么是智慧公厕?智慧公厕的应用价值有哪些?

在现代社会,城市的发展与人民生活质量息息相关。作为城市基础设施中的重要一环,公共厕所的建设及管理一直备受关注。智慧公厕作为一种公共厕所使用、运行、管理的综合应用解决方案,正逐渐在智慧城市的建设中崭露头角。那么,智慧公…...

VideoDubber时长可控的视频配音方法

本次分享由中国人民大学、微软亚洲研究院联合投稿于AAAI 2023的一篇专门为视频配音任务定制的机器翻译的工作《VideoDubber: Machine Translation with Speech-Aware Length Control for Video Dubbing》。这个工作将电影或电视节目中的原始语音翻译成目标语言。 论文地址&…...

中科数安|公司办公终端、电脑文件数据 \ 资料防泄密系统

#中科数安# 中科数安是一家专注于信息安全技术与产品研发的高新技术企业,其提供的公司办公终端、电脑文件数据及资料防泄密系统(也称为终端数据防泄漏系统或简称DLP系统)主要服务于企业对内部敏感信息的安全管理需求。 www.weaem.com 该系统…...

PostgreSQL 安装部署

文章目录 一、PostgreSQL部署方式1.Yum方式部署2.RPM方式部署3.源码方式部署4.二进制方式部署5.Docker方式部署 二、PostgreSQL部署1.Yum方式部署1.1.部署数据库1.2.连接数据库 2.RPM方式部署2.1.部署数据库2.2.连接数据库 3.源码方式部署3.1.准备工作3.2.编译安装3.3.配置数据…...

《互联网的世界》第五讲-信任和安全(第一趴:物理世界的非对称加密装置)

信任和安全的话题过于庞大,涉及很多数学知识,直接涉及 “正事” 反而不利于理解问题的本质,因此需要先讲一个前置作为 part 1。 part 1 主要描述物理世界的信任和安全,千万不要觉得数字世界是脱离物理世界的另一天堂,…...

JavaScript使用

文章目录 一、JavaScript简介二、JavaScript引入方式1、内部脚本2、外部脚本 三、JavaScript基础语法1、书写语法&输出语句2、变量&数据类型3、运算符4、流程控制语句&函数 四、JavaScript对象1、Array2、String3、自定义对象 五、BOM1、Window2、History3、Locati…...

区块链和人工智能的关系以及经典案例

目录 1.区块链与人工智能的关系 2.应用案例:基于区块链的医疗数据共享平台 2.1背景 2.2方案 2.3优势 2.4挑战 区块链技术和人工智能(AI)是两种不同的技术,但它们之间存在着互补关系。区块链技术提供了一种安全、透明、去中心…...

【深度学习笔记】优化算法——Adam算法

Adam算法 🏷sec_adam 本章我们已经学习了许多有效优化的技术。 在本节讨论之前,我们先详细回顾一下这些技术: 在 :numref:sec_sgd中,我们学习了:随机梯度下降在解决优化问题时比梯度下降更有效。在 :numref:sec_min…...

sql注入

注入的介绍 将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS 注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。 注入能导致 数据丢失 、 破坏 或 泄露 给无授…...

Leetcode : 1137. 高度检查器

学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。 排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。 给你一个整数…...

Mybatis从入门到CRUD到分页到日志到Lombok到动态SQL再到缓存

Mybatis 入门 1.导入maven依赖 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version> </dependency>2.配置核心文件 <?xml version"1.0" encoding"U…...

四节点/八节点四边形单元悬臂梁Matlab有限元编程 | 平面单元 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…...

机器视觉学习(一)—— 认识OpenCV、安装OpenCV

目录 一、认识OpenCV 二、通过pip工具安装OpenCV 三、PyCharm安装OpenCV 一、认识OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff0c;开源计算机视觉库&#xff09;是一个跨平台的计算机视觉库&#xff0c;最初由威尔斯理工学院的Gary Bradski于199…...

web3 DePIN赛道之OORT

文章目录 什么是DePIN什么是oort背景&#xff1a;去中心化云计算场景团队OORT AIOORT StorageOORT Compute 参考 什么是DePIN DePIN是Decentralized Physical Infrastructure Networks的简称,中文意思就是去中心化的网络硬件基础设施,是利用区块链技术和代币奖励来调动分散在世…...

QString 与 字符编码 QTextCodec

为了理解编码&#xff0c;我们要先区分 文件中字符编码 和 程序运行时字符编码 的区别。 文件中字符编码 顾名思义 就是 文字保存在文件中的采用的字符编码方式&#xff0c;可以在IDE中看到程序运行时字符编码&#xff0c;是编译器读取从源文件中读取到字符串后再按要求做的一次…...

【STA】SRAM / DDR SDRAM 接口时序约束学习记录

1. SRAM接口 相比于DDR SDRAM&#xff0c;SRAM接口数据与控制信号共享同一时钟。在用户逻辑&#xff08;这里记作DUA&#xff08;Design Under Analysis&#xff09;&#xff09;将数据写到SRAM中去的写周期中&#xff0c;数据和地址从DUA传送到SRAM中&#xff0c;并都在有效时…...

Git的基础使用

几条铁令&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 切换分支前先提交本地的修改代码及时提交&#xff0c;提交过就不会丢遇到任何问题都不要删除文件目录&#xff0c;第一时间找人请教push前和merge前一定要pull保证代码为最新的&#xff0c;有冲突解决冲…...

贪吃蛇(C语言实现)

贪食蛇&#xff08;也叫贪吃蛇&#xff09;是一款经典的小游戏。 —————————————————————— 本博客实现使用C语言在Windows环境的控制台中模拟实现贪吃蛇小游戏。 实行的基本功能&#xff1a; • 贪吃蛇地图的绘制 • 蛇吃食物的功能&#xff08;上、…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...