redis 入门及相关知识汇总

news2024/9/22 21:30:59

什么是 Redis ?

 1,相对于mysql ,oracle , 这种关系西数据库, 我们还有非关系数据库服务,他的产生是为了,解决常规数据库的并发能力,传统的关系型数据库受限于IO 和性能瓶颈, nosql 有着比较好的效率和性能,key-value 查询模式。

    那redis 是nosql 中的佼佼者, 他是一块内存高速缓存数据库,(读的速度是 110000次/s , 写的速度是 81000次/s ,) 底层使用万物之母c 语言编写,试问谁与争锋?,他的数据类型 ,String ,LIst ,set zet hash, 并且他的所有操作的都是原子性,他也支持持久化,rdb (全量备份,节省磁盘空间,回复速度快,但可能丢失数据,) aoF(日志增量备份,数据保存完整,但是整的恢复效率低,占用空间。如果数据比较敏感的,建议两个都开启,如果纯缓存,都不开启,默认开启rdb ) 等持久化方式,而且支持集群,支持主从复制(主机会自动将数据同步到从机,可以进行读写分离)。

面试题:redis 为啥那么快,说说reids 线程模型?

1, 很多人都知道redis基于内存,所以快, 那么你是个初级开发,面试官向让你说说细点,。其实就是redis底层有一套完善的多的时间处理机制来保证执行高效的。

redis 内部使用文件事件处理器 file event handler, 这个文件事件处理器是单线程的,所以redis 叫单线程模型。(面试题问,redis, 是单线程还是多线程啊, 单线程,那为啥是单线程啊,不要给你自挖坑那你旧的知道为啥?),它采用io多路复用机制同时监听多个socket ,根据socket 上的事件选择对饮的事件处理器进行处理。

线程模型 

 redis 内部使用文件事件处理器file event handle, 它包含几个部分

1, 多个socket ,2 io多路复用程序, 2, 文件事件分派器, 3 文件处理器(连接应答处理器,命令请求处理器,命令回复 处理器)

之所以说redis 是个单线程其实值文件事件处理器单线程,采用多路复用的方式监听系统上多个soket ,将socket 上产生的事件压入队列中,由文件处理分派器从队列选一个socket 根据事件类型发给相应的事件处理器,

redis 6  版本引入了多线程,上边已经提到redis 单线程处理有着很快地速度,那为啥用多线程?

单线程的瓶颈在于网络io 操作,上, 越纪事读写网络系统会占用大量的cpu ,如果你要对一些大的键值删除,短时间删除不玩,那么对于单线程,后边请求就会阻塞。

Redis 在设计上采用将网络数据读写和协议解析通过多线程的方式来处理,对于命令执行来说,仍然使用单线程操作(在网络数据传输,数据解析使用了多线程,但是数据操作还是单线程)

2, 他的应用场景 :  缓存 , 事件的发布订阅。

1, 缓存, 读取前先去redis ,如果没有,读取数据库,将数据拉到redis 对数据库有一定保护,

插入数据时,先写入redis。

   这里涉及到三个比较记混 名字 ,也是面试常问的:

击穿 、穿透 、 雪崩 :

   1.1  击穿 :  请求的数据 redis 不存在,捉着数据热点过期, 导致缓存失效, 直接去读取数据库,数据扛不住大量的请求,这就是像是 子弹击穿了 redis (防弹衣)到了数据库实体上.。 解决办法: 1、 互斥锁,保证同一时间只有一个业务员线程更新缓存,为鞥你获取互斥锁的请求,要么等待锁释放重新读取缓存,要么叫返回空,

2.不给热点数据设置过期时间,有后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间。

1.2  穿透: 缓存穿透是,用户或者黑客不断的发起请求访问缓存和数据库中没有的数据,导致数据库压力过大。子弹打过来,击穿了防弹衣reids,穿透了数据库。

解决办法:  1,首先一般我们的系统都是有接口鉴权校验的一般是 token 什么的,这种防止随便请求,或者是防止1s 多次请求一个资源。

2,对于缓存取不到, 数据库也没有的请求这时候可以将key-value 写出,key-null, 缓存有效时间可以设置30s,

3,布隆过滤器,bitmap(除了五种基础类型之外的数据结果)  默认为0对请求三次hash 值分别设置1,假设一个没有匹配上就说数据库中没有,直接返回。

1.3  雪崩 

缓存雪崩是,一段时间,缓存集中失效,导致全部走数据库,有可能把数据库瘫痪,

1,雪崩就是缓存中大批数据过期后系统涌入大量请求,redis失效了,就会渗透到数据库,导致数据库宕机,(和击穿类似,就是大量的数据同时过期,缓存实力宕机,就是雪崩)

  解决办法: 让redis 永不过期,2, 将缓存失效时间分散开,防止同一时间过期,3,可以启动服务熔断机制,暂停业务访问服务4,创建redis 集群读写分离。

 redis  的高可用?

  1 ,主从模式

2, 哨兵模式

3, 集群模式

主从模式中,一旦节点由于故障不能提供服务,需要人工将节点升级为主节点,同时还要通知应用更新主节点地址,多数业务场景是不能接收这种故障处理方式的,redis 在2.8开始提供了哨兵架构,

,哨兵模式,由一个或者多个sentienel 实力组成的sentinel系统,它可以监视所有的redis 主节点和从节点,并在被监视的主节点下线后,自动将下线的主服务属下的某个节点升级为新的主节点,但一个哨兵进程对redis 节点进行监控,就可能出现问题,因此可以使用多个哨兵进行监控redis 节点,并且各个哨兵之间还会进行监控(ping)

 总结 : 哨兵是一个独立的进程,每个哨兵监控一个服务器,哨兵实现消息通知选举

 (1) 发送命令,等待redis 服务器*(主服务和从服务)返回监控其运行状态:(2) 哨兵检测到主节点宕机,会自动将从节点切换成主节点,然后通过发布订阅模式通知其他从节点修改配置文件,让他们切换主机;(3)哨兵之间会相互监控

(1)每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他Sentinel实例发送一个 PING命令。
(2)如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel标记为主观下线。
(3)如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
(4)当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线。
(5)在一般情况下, 每个 Sentinel 会以每10秒一次的频率向它已知的所有Master,Slave发送 INFO 命令。
(6)当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
(7)若没有足够数量的 Sentinel同意Master已经下线, Master的客观下线状态就会被移除;若Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除

补充: redis 作为缓存的时候,随着访问量的增肌,对redis 读写很快,一个节点压力大,通常会使用主从复制,master写为主,slave 读为主,并用哨兵进行监控 

配置方式:首先复制redis.conf

[root@localhost ~]# cd /usr/local/redis/bin/

[root@localhost bin]# cp redis.conf redis6379.conf

[root@localhost bin]# cp redis.conf redis6380.conf

[root@localhost bin]# cp redis.conf redis6381.conf

然后对这3个配置文件redis6379.conf、redis6380.conf、redis6381.conf分别进行修改

①、修改配置端口,分别改成对应的端口即可 port 6380  |  6381 ,

②、修改daemonize为yes

③、配置pid文件路径 pidfile    pidfile  /var/run/redis_6380.pid

④、配置log 文件名字    logfile "6380.log"

⑤、配置rdb文件名       dbfilename dump_6380.rdb

⑥、看情况选择:如果redis配置了密码(requirepass 123456),则还需在从redis服务中设置这一项,如果没有设置密码则忽略这一项

当三份都配置完成后,分别启动这三个服务:

image

使用  ps -ef | grep redis 查看:

image

然后通过如下命令选择不同的端口进入到这三个Redis客户端:

01

redis-cli -p 6379

image

3、设置主从关系

①、设置一主二从:

通过 INFO replication 命令查看发现,三个默认的都是Master角色,

image

image

image

然后我们将 6380 和 6381设置为Slave角色,可以使用如下命令:

  • SLAVEOF 127.0.0.1 6379
  • REPLICAOF 127.0.0.1 6379

image

image

这时 6380 和 6381成为了Slave,然后查看一下主机(Master)信息:

image

可以发现主机下面有两个Slave节点。

注:通过这种方式来设置主从关系,一旦服务重启,那么角色关系将不复存在。想要保存这种关系,可以通过Slave的 配置文件来进行配置。

分别编辑 redis6380.conf 和 redis6381.conf 配置文件,加入(约在286行):

01

replicaof 127.0.0.1 6379

image

4、测试数据

①、给主节点设置值:set k1 v1

image

image

image

从节点也可以获取到值,说明没问题。

在没有设置主从关系之前,如果主节点内有数据,那么在设置主从关系后,Slave从节点也能获取到主节点原来的数据。

如果Master主节点挂掉了,Slave从节点的角色不会发生变化,一直处于等待状态,直到Master主节点重新启动。

如果要将Slave从节点变成Master节点,可以使用如下命令:

01

SLAVEOF no one

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

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

相关文章

xshell可以远程登录服务器但是vscode一直显示让输入密码的解决方案

vscode报错 但是xshell可以登录 原因:可能因为我上一次没有恰当的退出远程链接导致的,我每次退出远程都是直接强制关闭VScode。 解决方法:打开VScode的 view (查看) palette(命令面板)然后输…

[AutoSar]BSW_OS 06 Autosar OS_Alarms

一、 目录 一、关键词平台说明一、Timer1.1 配置1.2Periodical Interrupt Timer (PIT)和High Resolution Timer (HRT) 二、Alarm 工作机制三、Code3.1创建一个15ms的runnable3.2mapping到basic task3.3生成代码 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueO…

还在用JS?过来看看GS

什么是GS?GS是我自创的一门编程语言,全名叫“GreatScript”,是一门类型化语言,可以编译成JavaScript。简单来说,就是又一门TypeScript。 GreatScript的生态位跟Typescript,CoffeeScript,ReScri…

ZigBee学习(一)

文章目录 一、ZigBee介绍二、IEEE 802.15.42.1 物理层2.2 MAC层2.3 如何实现网络和设备寻址2.4 能量管理 三、ZigBee网络拓扑结构四、ZigBee配置参数 一、ZigBee介绍 ZigBee是一种基于IEEE 802.15.4标准的高级通信协议,它被设计用于低速率、低功耗和短距离无线通信&…

带头 + 双向 + 循环链表增删查改实现

目录 源码: List.c文件: List.h文件: 简单的测试: 很简单,没什么好说的,直接上源码。 源码: List.c文件: #include"DLList.h"ListNode* creadNode(LTDataType x) {L…

自己重装Win10系统详细步骤教程

用户不喜欢自己电脑当前的操作系统,想自己重新一款喜欢的Win10系统,但不知道如何操作才能重新安装系统Win10?以下小编带来自己重装Win10系统详细步骤教程,帮助用户们轻轻松松地完成Win10系统的重装,快速体验Win10系统的…

2023.1.21 关于 Redis 主从复制详解

目录 引言 单点问题 分布式系统 主从模式 配置 Redis 主从结构 断开主从关系 切换主从关系 补充知识点一 只读 网络延迟 拓扑结构 一主一从 一主多从 树形主从结构 主从复制的基本流程 数据同步 replicationid offset pzync 运行流程 具体流程 补充知识点二…

JS 将字符串‘10.3%‘ 经过运算加2转换为 ‘12.3%‘

文章目录 需求分析 需求 已知 字符串 a ‘10.3%’,现需将转换为 字符串’12.3%’ 分析 去掉百分号,将字符串转换为数字 const aNumber parseFloat(10.3%); const resultNumber aNumber 2;将结果转换为带百分号的字符串 const resultString re…

〖大前端 - ES6篇①〗- ES6简介

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…

2024年Java SpringBoot 计算机软件毕业设计题目推荐

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容:SpringBoot、Vue、SSM、HLM…

k8s---pod的水平自动伸缩HPA

HPA:Horizontal Pod Autoscaling是pod的水平自动伸缩。是k8s自带的模块 pod占用CPU的比率到达一定的阈值会触发伸缩机制。 replication controller:副本控制器。控制pod的副本数 deployment controller:节点控制器。部署pod hpa控制副本的…

浅析位运算符(左移、右移、与、或、异或)

C语言是一种很奇妙的语言&#xff0c;它既有高级语言的特点&#xff0c;又有低级语言的特点&#xff0c;支持位运算让它更方便于硬件编程。 一、左移运算符&#xff08;<<&#xff09; 左移运算就是将一个二进制位的操作数按指定位数整体向左移位&#xff0c;移出位被丢…

【力扣】记录一下竞赛分上 Knight

记录一下力扣上 Knight 力扣的题还是相对来说比较简单的&#xff0c;前两个月写的题多一点&#xff0c;后面几乎都是只做了每日一题&#xff0c;感觉正常来说刷个两三个月的题水平就差不多够了&#xff0c;甚至在我才刷半个月的时候就可以做三题了&#xff0c;排名和现在差不多…

手机上菜谱记录簿在哪 用备忘录放大看菜谱更清晰

作为一个热爱生活的现代人&#xff0c;我深知健康饮食的重要性。然而&#xff0c;每当我想亲手为自己和家人烹饪美食时&#xff0c;厨艺的不精常常让我望而却步。好在互联网时代&#xff0c;网上搜罗的各式菜谱成了我的救星。但问题是&#xff0c;每次做菜时都得反复查找&#…

docker运行redis,jdk,nginx

Redis 1.查询redis [rootlocalhost ~]# docker search redis NAME DESCRIPTION STARS OFFICIAL redis Redis is an open source key-value store that… 12620 …

解决vue 2.6通过花生壳ddsn(内网穿透)实时开发报错Invalid Host header和websocket

请先核对自己的vue版本&#xff0c;我的是2.6.14&#xff0c;其他版本未测试 起因 这两天在维护一个基于高德显示多个目标&#xff08;门店&#xff09;位置的项目&#xff0c;由于高德要求定位必须使用https服务&#xff0c;遂在本地无法获取到定位坐标信息&#xff0c;于是…

因谷歌Play Store审核超过7天和联系他们的方式

三种联系他们的方式 1.让他们打电话过来 英语好不好没关系&#xff0c;主要是他们讲着一口浓厚的印度口音英语&#xff0c;很难听懂 2.在线实时聊天沟通 可以选择英文、中文、但是英文肯定容易约上 3.发送邮件 回复太慢了&#xff0c;1-2天回复你一次 传送门&#xff1…

时间轮设计

目录 基本概念 函数定义 函数实现与测试 测试1结果如下 测试2结果如下 基本概念 时间轮 是一种 实现延迟功能&#xff08;定时器&#xff09; 的 巧妙算法。如果一个系统存在大量的任务调度&#xff0c;时间轮可以高效的利用线程资源来进行批量化调度。把大批量的调度任务…

【算法与数据结构】377、LeetCode组合总和 Ⅳ

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题明面上说是组合&#xff0c;实际上指的是排列。动态规划排列组合背包问题需要考虑遍历顺序。 d p …

[Python] opencv - 如何使用VideoCapture类进行摄像头视频捕获并显示

VideoCapture类介绍 OpenCV-Python 中的 VideoCapture 类是一个用于捕获视频的类&#xff0c;它可以从摄像头、视频文件或者设备上捕获视频。主要方法有&#xff1a; class VideoCapture:# Functions_typing.overloaddef __init__(self) -> None: ..._typing.overloaddef _…