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

Redis进阶--一篇文章带你走出Redis

目录

什么是Redis??

Redis有哪些使用场景?

Redis是单线程还是多线程?

为什么Redis是单线程速度还是很快??

 Redis持久化

RDB机制:(Redis DataBase)            [是redis中默认的持久化方式]

AOF机制:(Append Only File)       

Redis和MySQL如何保持数据一致????

Redis事务

Redis与传统关系型数据库的区别:

Redis事务在Java中的运用:(Java代码中实现Redis的事务控制)

主从复制(Redis集群)

主从复制的作用??

 redis哨兵机制

Key的过期删除策略

缓存穿透、缓存击穿、缓存雪崩

缓存穿透

缓存击穿

缓存雪崩


什么是Redis??

Redis是一款非关系型数据库,以键值对的形式存储在内存中,储存在内存中,读写的速度非常快,还支持多种数据类型,支持数据持久化

Redis有哪些使用场景?

1.缓存

        访问量大的(秒杀、点赞)

        修改少的(新闻类型、电商类型)

        存储验证码(定时删除)

2.计数器(点赞)

3.排行榜(zset)

4.数据去重(set)

5.消息队列(list)

6.分布式锁(微服务)

Redis线程模型

Redis是单线程还是多线程?

        6.0版本之前:只有一个线程处理事情(处理客户端的连接\读写功能)(线程安全)

        6.0版本之后:引入了多线程

                                 但这并不是说明Redis完全是多线程的

                                 在网络请求过程中:多线程

                                 在对兼职的读写时:单线程(依旧是线程安全的)

为什么Redis是单线程速度还是很快??
  1. Redis基于内存操作,运算为内存级别,故性能很高
  2. Redis底层是hash结构 ==> 时间复杂度为O(1),可以通过key(计算hash值)快速定位
  3. 单线程设计避免线程切换(防止切换线程开销),也不会导致死锁问题

 Redis持久化

        众所周知Redis是基于内存操作的,那么如果有一天突然断电了,那么Redis里的数据岂不是都没有了?基于这个问题,Redis推出了持久化的机制:

RDB机制:(Redis DataBase)            [是redis中默认的持久化方式]

        以快照的方式,将某一时刻Redis中的数据保存到一个.rdb文件中        ​​

      可以在redis.conf中修改触发条件:

          save(同步机制):这是用来配置触发Redis的RDB持久化条件(即什么时候将内存中的数据持久化到硬盘中),  如:"save m n" 表示每m秒内,如果数据修改了n次或n次以上时,自动触发bgsave(存储)

        save  60  2  :表示60秒内如果redis中的数据被修改了2次或以上,则进行快照

        这时如果不需要持久化,将save所在的行全部注释,就不会进行持久化了

                (注意:这里注释的时候需要在该行前面加'# ')

AOF机制:(Append Only File)       

        以日志的形式,将你进行的写操作(增、删、改)的命令记录下来

                恢复时,逐行执行命令即可恢复数据

        如果想要使用AOF机制,需要再配置文件中开启:

        在redis.conf中找到appendonly  no,并将其改为yes开启

                                      appendfilename  ==>  指定日志记录文件(的名字)  默认为 appendonly.aof

               每次配置修改后,都需重启redis才会生效

        同步机制:         (默认:appendfsync  everysec)

            appendfsync  always        #每一次修改都会sync,   缺点:消耗性能

            appendfsync  everysec     #每秒执行一次sync      缺点:如果1s内多次修改,可能会丢失数据

        

Redis和MySQL如何保持数据一致????

解决方式一:更新完MySQL后,立即去更新Redis

        问题:万一更新Redis失败(e.g:Redis连接断开),会导致数据更新失败。

解决方式二:先删除Redis中的数据,然后更新MySql,有查询到来时Redis会从MySQL中查询

        问题:删除Redis后,更新MySQL中的事务还没有提交,这时如果有新来的请求访问,查询出来的还是原来的数据。

解决方式三:延时双删机制:先删除Redis,再更新MySql,延迟几百毫秒之后再次删除Redis

        解决了方案二中,MySQL提交事务之前,Redis查询数据后,以后访问过来还是原数据的问题

这时后方再有查询过来时,redis会从数据库中重新查询当前的新值。

Redis事务

Redis与传统关系型数据库的区别:

        Redis事务中,同一个事物中的命令不会相互影响

                                不支持roll back(回滚)

                                不支持复杂的事务管理(嵌套事务、并发控制等)

        优点: 高性能(基于内存的数据存储)

                    简单的操作命令: mutil(开启事务)  set 1   set 2    exec(执行事务)

                    灵活的数据类型(Redis支持多种数据类型,如字符串、列表、集合、散列等)

        Redis事务本质上是一组命令的集合,一个事务中所有命令都会序被列化,在事务执行过程中,会按照顺序执行。事务添加命令后,该命令不会立即执行,在执行exec命令时,才回执行此实物中的所有命令.

        值得注意的是:与传统关系型数据库不同,Redis事务中不保证多条命令执行的原子性,即:Redis事务只负责将这几条命令打包放在一起,无所谓他们正确与否,即使其中有命令报错也不影响其他命令的执行结果。

Redis事务在Java中的运用:(Java代码中实现Redis的事务控制)

@Autowired
RedisTemplate redisTemplate;public static void main(String[] args) {redisTemplate.multi();//开启Redis事务//命令一//命令二//命令三redisTemplate.exec();//执行Redis事务
}

主从复制(Redis集群)

        主从复制,是指将一台Redis服务器的数据,复制到其他Redis服务器,前者称之为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能从主节点到从节点

        一台Redis作为主机,其他redis服务作为从机,一主多从,这样即使其中一台宕机,其余还可正常运行,保证数据的完整性,写入命令时,发送命令到主机,主机执行后将自动备份到从机,进而达到读写分离,分担redis服务的压力。

        (人话:主机可以进行增删改查,从机只有两个操作:从主机处获取数据,进行读操作)

主从复制的作用??

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  • 高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和陳群能够实施的基础,因此说主从复制是Redis高可用的基础。

 redis哨兵机制

        现在我们都知道了主从复制是为了分担redis服务的,如果其中有一台服务器宕机,其余还可正常运行,那么如果是主机宕机了,我们又该作何处理呢??

  • 对主机和从机进行监控:哨兵系统能够监控Redis主机和从机的运行状态,包括是否正常运行、是否能够响应命令等。
  • 向管理员发起通知:当某个节点出现问题时,哨兵可以通过API向管理员发送通知。
  • 解决主机宕机问题:一旦主机宕机,哨兵机制会从剩余从机中选举一个当做主机,确保了系统的连续运行和数据的一致性

Key的过期删除策略

        惰性删除:

        当key过期后,标记为过期状态(字典,记录过期key),下次使用时再删除

缺:如果一个key长时间未被访问,即使它已经过期,也不会被删除,可能会导致内存的浪费。

        定期删除:

        在设定的时间节点,去扫描过期的key,删除过期key。

缺点:可能会在大量key同时过期时造成卡顿现象。

        Redis操作时是两者结合的,具体是怎么操作的我在这里就不赘述了,如果有想深入了解的可以看大佬的:redis中key的过期键删除策略

缓存穿透、缓存击穿、缓存雪崩

前台请求时,数据查询的处理流程:

理解了数据查询时的处理流程,接下来让我们一同走进缓存高并发时常见的三大难题:

缓存穿透

        key对应的数据在数据库中不存在,如果我们查询Redis时,该数据在Redis中不存在,那么该请求还是会去访问数据库,如果有大量的这种请求访问过来,有可能压垮数据库

解决方法:

1.添加参数验证

e.g:  id肯定是integer类型,如果有人恶意访问 ?id='abc',这时肯定不可能查到该条数据
        我们可以在后端添加一条验证 :if( id instanceof Integer) ,如果不符合条件,直接忽略此次请求或者返回return false;

2.设置key-null

e.g:  如果对方想要查找key为'abc'的数据,但是后端数据库中没有这条数据,可以在Redis中设置一个键值对:{ 'abc' , null } 这样,对方再次访问过来时,直接return  null就行,同样不会造成缓存穿透

缓存击穿

        key对应的数据在数据库中存在,但是在redis某一个时间节点恰好过期了,此时如果有大量的并发请求过来,这些请求发现缓存过期后,都会从数据库中加载该数据,这时候也有可能会压垮数据库.

解决方法:

1.灵活设置key过期时间

        在设置key过期时间时,设置不要再访问量大的时候过期

2.加互斥锁

        给该查询加一个互斥锁,这样去MySQL中查询时,可以确保同一时间只有一个请求去访问MySQL,其余请求只能等所释放了以后才能进

缓存雪崩

        在高并发情况下,有大量的缓存失效(或者缓存层出现故障),造成大量请求到达数据库,导致数据库的调用量暴增,甚至可能导致数据库宕机。

解决办法:

1.避免缓存集体失效

        设置随机过期时间,可有效避免大量key同时过期。

2.集成redis集群

        将热点数据均匀分布再不同的Redis中,同样可以避免key同时失效的问题

3.设置定时任务

        设置在缓存失效之前,重新设置过期时间。

相关文章:

Redis进阶--一篇文章带你走出Redis

目录 什么是Redis?? Redis有哪些使用场景? Redis是单线程还是多线程? 为什么Redis是单线程速度还是很快?? Redis持久化 RDB机制:(Redis DataBase) [是redis中默认的持久化方式] AOF机制:(Append Only File) Redis和MySQL如何保持数据一致????…...

【框架设计】MVC、MVP、MVVM对比图

1. MVC(Model-View-Controller) 2. MVP(Model-View-Presenter) 3. MVVM(Model-View-ViewModel)...

四桥臂三相逆变器动态电压恢复器(DVR)MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 简介 四桥臂三相逆变器 电路 的一般形式如图 1,为 便于分析 ,将其等效成图所示的电路 。以直流母线电压Ud的 1/2处为参考点 ,逆变器三相和零线相 输 出可等效成…...

阿里云一键登录(号码认证服务)

前言 用户登录原来的登录方式如下 1. 手机号验证码 2. 账号密码 运营觉得操作过于复杂, 因此想引入阿里自动登录的逻辑, 也就是号码认证服务,所以才有了这篇问文章 注: 本文只是记录Java端的实现, app端的请自行查询文档实现 官方资料 文档 : 什么是号码认证服务_号码认证服务(…...

全量知识系统中的翻译器以及百度文库AI应用中心给出的答复

Q1. 下面是全量知识系统中的翻译器的规划(参考前一篇:全量知识系统 之 “百度翻译”。从“全量知识系统的翻译器”起。链接在下面)。下面的文字分5次发出。链接: 全量知识系统 之 “百度翻译”-CSDN博客 第一次回答:…...

抓包工具获取请求信息

Charles 下载安装 下载 官方下载地址:https://www.charlesproxy.com/latest-release/download.do 下载后傻瓜式安装就好,这个官方的需要激活,可以选择绿色版或者学习版 绿色版 绿色中文版:https://soft.kxdw.com/pc/Charles.z…...

【Java Web】秒懂CSS样式!

目录 一、CSS的使用 二、CSS引用方式 三、CSS三大选择器 四、CSS浮动 五、CSS定位 六、CSS盒子模型 一、CSS的使用 css层叠样式表能够对网页中标签元素位置的排版进行像素级别的精确控制,支持几乎所有的字体和字号样式,拥有对网页对象和模型的样式…...

Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用

概述 Golang 提供 net/rpc/jsonrpc 库来实现rpc方法采用 json 方式进行数据编解码,支持跨语言调用 这里实现跨语言示例 1 )go 服务端 package main import ( "log" "net" "net/rpc" "net/rpc/jsonrpc" )…...

Guitar Pro 8.1中文版永久许可证激活2024最新24位注册激活码生成器

Guitar Pro是一款非常受欢迎的音乐制作软件,它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款产品可能已经成为全球最受欢迎的吉他打谱软件,在编写吉他六线谱和乐队总谱中始终处于行业领先地位&#…...

自然语言处理(NLP)练习题

问题:什么是自然语言处理(NLP)? 答案:自然语言处理(NLP)是一种人工智能技术,旨在让计算机理解和处理人类语言。NLP涉及语言学、计算机科学和人工智能等多个领域,旨在开发…...

P2386 放苹果

题目传送门 题目描述 把 m 个同样的苹果放在n 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。(5,1,15,1,1 和 1,1,51,1,5 是同一种方法) 输入格式 第一行是测试数据的数目 t,以下每行均包括二个整…...

TI IWR6843ISK ROS驱动程序搭建

1、设备准备 1.1 硬件设备 1)TI IWR 6843 ISK 1块 2)Micro USB 数据线 1条 1.2 系统环境 1)VMware Workstation 15 Player 虚拟机 2)Ubuntu18.04 并安装有 ROS1 系统 如若没有安装 ROS 系统,可通过如下指令进行…...

【Godot4自学手册】第二十节增加游戏的打击感,镜头震颤、冻结帧和死亡特效

这节我主要学习增加游戏的打击感。我们通过镜头震颤、冻结帧、增加攻击点特效,增加死亡。开始了。 一、添加攻击点特效 增加攻击点特效就是,在攻击敌人时,会在敌人受击点显示一个受击动画。 1.添加动画。 第一步先做个受击点动画。切换到…...

[论文笔记] Open-Sora 1、sora复现方案概览

GitHub - hpcaitech/Open-Sora: Unofficial implementation of OpenAIs Sora Open-Sora已涵盖: 提供完整的Sora复现架构方案,包含从数据处理到训练推理全流程。 支持动态分辨率,训练时可直接训练任意分辨率的视频,无需进行缩放。 支持多种模型结构。由于Sora实际模型结构未…...

持续更新 | 与您分享 Flutter 2024 年路线图

作者 / Michael Thomsen Flutter 是一个拥有繁荣社区的开源项目,我们致力于确保我们的计划公开透明,并将毫无隐瞒地分享从问题到设计规范的所有内容。我们了解到许多开发者对 Flutter 的功能路线图很感兴趣。我们往往会在一年中不断更改并调整这些计划&a…...

Go语言数据结构(二)堆/优先队列

文章目录 1. container中定义的heap2. heap的使用示例3. 刷lc应用堆的示例 更多内容以及其他Go常用数据结构的实现在这里,感谢Star:https://github.com/acezsq/Data_Structure_Golang 1. container中定义的heap 在golang中的"container/heap"…...

NERF论文笔记(1/2)

NeRF:Representing Scene as Neural Radiance Fields for View Synthesis 笔记 摘要 实现了一个任意视角视图生成算法:输入稀疏的场景图像,通过优化连续的Volumetric场景函数实现;用全连接深度网络表达场景,输入是一个连续的5维…...

深入理解nginx一致性哈希负载均衡模块[上]

1. 引言 在现代的网络应用中,负载均衡是一个至关重要的组件。它能够分配流量到多个服务器上,实现高可用性和性能扩展。Nginx是一个广泛使用的高性能Web服务器和反向代理服务器,其负载均衡模块提供了多种算法来实现流量的分发。其中&#xff0…...

【Linux】Docker安装

卸载旧版Docker 新版docker无法覆盖旧版的,所以需要先卸载原来的旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-eng…...

动态SLAM论文阅读笔记

近期阅读了许多动态SLAM相关的论文,它们基本都是基于ORB-SLAM算法,下面简单记录一下它们的主要特点: 1.DynaSLAM 采用CNN网络进行分割多视图几何辅助的方式来判断动态点,并进行了背景修复工作。 2.Detect-SLAM 实时性问题&…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如&#xff1a…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...