Redis常见须知

介绍一下redis数据库

Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景

Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。

除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等。

介绍redis的单线程模型

  Redis是一个基于内存的高性能键值数据库,它的单线程模型是其最大特点之一。单线程模型意味着Redis在一个单独的线程中处理所有的读写请求,而其他线程则负责其他的任务,比如网络I/O和事件处理。

  Redis的单线程模型是通过使用一个单线程的IO线程和多个后台线程来实现的。IO线程负责接收客户端的请求,并将请求转发给后台线程。后台线程负责处理所有的命令请求,并将结果返回给IO线程。IO线程再将结果返回给客户端。

  虽然Redis的单线程模型可以提高性能,但也存在一些缺点。例如,由于只有一个线程,因此在高并发的情况下,可能会导致请求处理速度变慢。此外,由于Redis是基于内存的,因此也可能会存在内存泄漏的问题。
  总之,Redis使用单线程的IO线程,而不是多线程的IO线程,这样可以避免线程切换的开销,提高性能。此外,Redis还使用了阻塞I/O,这样可以避免在高并发情况下,因没有可用的线程而导致的性能下降。最后,Redis还使用了事务机制,可以将多个命令请求作为一个原子操作来执行,这样可以确保数据的一致性。

为什么redis更快/?

因为redis使用单线程(网络I/O和 执行命令),有几个原因:
·redis基于内存的数据库,采用了高效数据结构,瓶颈是内存,CPU不是瓶颈,所以用单线程就能解决。
·单线程模型避免多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,不会有死锁。
·redis采用I/O多路复用机制处理大量客户端socket请求,IO多路复用机制是一个线程处理多个 IO 流,就是常听到** select/epoll 机制**。在redis只允许单线程情况下,该机制允许内核中,同时存在多个监听socket和已连接socket内核会监听。一旦有请求,就交给redis线程处理,这就实现了一个redis处理多个IO流效果。

redis怎么实现持久化?

redis读写都在内存中,所以redis性能才会高,当redis重启后,内存中数据会丢失,所以需要持久化。存数据文件到磁盘中,这样redis重启就能从磁盘中恢复原有数据。
两种数据持久化方式
AOF【Append Only File(追加文件)】日志:每执行一条写,都会追加到文件中。
RDB【Redis Database Backup file(Redis数据备份文件)】快照:某一时刻的内存数据,以二进制方式写入磁盘。

redis单线程会不会浪费资源?

redis6.0后,也采用了多个I/O线程来处理网络模块,因为随着网络硬件性能提升,Redis的性能瓶颈可能出现在网络I/O处理上。
但只是redis6.0对于网络I/O采用多线程来处理,但是对于命令的执行仍用单线程来处理。

redis执行命令是单线程,如何利用多核心来提升性能?

部署多个 redis docker 容器来处理,达到充分利用 cpu 多核心的效果

redis缓存穿透、缓存击穿、缓存雪崩是什么?怎么解决?

  1. 缓存雪崩
    大量缓存数据在同一时间过期或者 Redis 故障宕机时,大量用户请求全部访问数据库。同时也会做大量给内存中缓存的操作,压力剧增,一系列连锁反应,导致整个系统崩溃。

· 解决办法

大量数据同时过期时

  1. 均匀设置过期时间
  2. 互斥锁:避免大量访问数据库的结果大量去做存内存操作,加锁同一时间只有一个请求能写缓存。
  3. 双key策略:使用两个key,主key和副key。过期时间,备用key,不过期。业务主线访问不到主key的缓存数据时,直接返回备key的缓存。(内存中同时写两份,一份过期,还有一份)
  4. 后台更新缓存策略:后台线程定时更新缓存

redis故障宕机时

  1. 启动服务熔断:防止整个系统雪崩,暂停业务对缓存服务的访问,直接返回错误。或者请求限流,只有少量请求发送到数据库中。
  2. 构建高可靠集群:通过主从节点方式构建redis缓存可靠集群
  1. 缓存击穿
    缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库数据库很容易就被高并发的请求冲垮。因为不只是访问都普通数据库,而是还会都去写内存。

· 解决办法

  1. 互斥锁方案:保证同一时间只有一个业务线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。
  2. 热点数据不设置过期时间:临近过期的热点数据,重写设置过期时间。
  1. 缓存穿透
    频繁去请求一个不在内存和数据库中的数据。使得数据库压力剧增。
    · 解决办法
  1. 非法请求的限制:在API入口处判断请求参数是否合理,是否是带一些特殊字符或者超区间的访问
  2. 缓存存空值或默认值:不存在的就先存空值或默认值。可以使得不必都去查询数据库。
  3. 布隆过滤器: 布隆过滤器100%确定不存在。

怎么用redis分布式锁?

  1. 加锁包括了读取锁变量、检查锁变量值和设置锁变量值。
    setnx
  2. 锁变量需要设置过期时间。
    setnx的ex/px选项,设置过期时间。ex和px区别是粒度不一样。
  3. 锁变量的值,需要能区分是哪个客户端的加锁操作,所以最好设置为能唯一标识某个客户端的值,这样防止失误地释放。

讲讲redis持久化

redis在内存中,如果意外关机或下次重启,如何恢复内存中的数据。有两种方式RDB、AOF。

  1. RDB方式
    1> 概念:rdb是快照策略,在配置文件中
    2>底层机制:每次存快照会fork一个子进程,父进程继续处理请求,而子进程去把当前的所有数据
    2.1> 做保存生成临时rdb文件,替换掉之前的rdb文件,就成了正是的rdb文件。
    2.2> save规则满足的情况下会触发rdb规则。
    2.3> 执行flushall(触发清除整个redis数据缓存)命令也会触发rdb规则。
    2.4>退出redis也会产生rdb文件。

在dump.rdb文件中:里面设定了:
save 900 1
save 1000 2
意思是:每900秒内改1个值,就做一次快照。会触发RDB快照。
当配置好后,启动后激活rdb操作后:在bin下会生成rdb文件。

· RDB的优点:
1 适合大规模数据恢复。
2 对数据的完整性要求不高!
· RDB的缺点:
1 需要一定的时间间隔进行操作。如果redis意外宕机了,最后一次修改数据就没有了
2 fork进程时,会占用一定内存空间

  1. AOF方式

append only file
默认不开启的,需要手动配。操作发现 appendonly.aof中就有了操作记录。
· 机制:
  父进程fork子进程,记录全部写操作。
· AOF文件出错后会导致redis不能重启:
  redis提供了工具,redis -check-aof–fix。

· 缺点:
aof远大于rdb,修复速度比rdb慢
aof运行效率要比rdb慢,redis默认配置是rdb持久化
如果AOF文件大于64m,太大了,fork新进程来将文件重写。
AOF无限追加,必然会越来越大。
rewrite参数,在配置中可以看到。

· 建议:
RDB只在从机上,15分钟备份一次即可。
微博每次启动,看哪个从机RDB更新更大,就用哪个RDB。

讲讲redis的订阅发布

信息通信模式,发送者push,订阅者订阅接收。
消息发布者发送消息到队列中,而消息订阅者去抢队列中的内容。
在这里插入图片描述
关注(订阅)频道、订阅(已经订阅频道的)信息、退订、发送到指定频道
操作
先订阅一个频道,频道名称。
一个redis端去订阅a频道
subscribe a
而redis-server 服务端维护了一个字典,字典的键就是个频道,而字典的值是一个链表,链表中保存了所有订阅这个频道的客户端。subscribe命令的关键,是将客户端添加到给定的channel的订阅链表中。
本质是将客户端添加到管道的链表中。
另外一个去给频道中发布:publish a “mess_test”,
则在第一个redis端收到了推送过来的。
场景
适合实时消息系统,实时聊天系统。

讲讲redis主从复制

· 机制:
  一台redis服务的数据,复制到其它redis服务器,前者是主节点,后者从节点。
复制的是从机,原始是主节点,且主机写为主,从机读为主。
80%的情况都是在做读操作。减缓服务器压力,在架构中经常使用。
· 主从复制的主要作用:
  数据冗余
  故障恢复
  负载均衡
  高可用基石:一般至少一主二从。

配置方式
把redis.conf配置几份,不同端口配置到不同conf文件中。
改端口,pid名字,日志名字,备份文件dump.rdb名,依次修改后,分别启动使用。

一主二从
默认情况下,每一台都是主节点,而配置完后,才有主从节点。
只需要在从机中配置即可。
在从机中执行:slaveof 127.0.0.1 6379 让从机寻找某个端口做主机,
主机中可以查看从机信息:info replication
配置好后,从节点不能写。
全量复制
从机第一次连接到主机时,就会全部复制一遍。
增量复制
后面增加的内容

宕机后配置
当主节点宕机后,如何从节点做替补设置?
slaveof no one:使自己成为主节点
之后主机恢复,也没有用了,只能重新配置。
如果把这些写到配置文件中,每次改得比较麻烦。
而当不写配置文件,反而执行命令就能达到想要的效果。

哨兵模式:自动选取主机节点的模式

自动版的自动选举主机的模式
哨兵也需要多个,哨兵之间也互相监督,且哨兵也监督各个节点

在这里插入图片描述
故障转移操作, 投票的结果由一个哨兵发布,然后通过发布订阅模式,让哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。

操作
各个主机上配置:vim sentinel.conf
一串配置最后的1是说主机挂掉,做投票,让某个节点去做主机

启动哨兵模式
redis-sentinel sentinel.conf
当主机没了,就发生故障转移。
如果master节点断开,此时就会从从机中随机选择服务器。这里有投票算法。
哨兵日志:
当主机恢复后,也只能是从机。
·哨兵模式的优点:
基于主从模式,自动化
主从可以切换,故障转移,系统可用性更好
· 哨兵模式的缺点:
redis不好做在线扩容,数量一旦上限,在线扩容就很麻烦。
实现哨兵模式配置很麻烦,里面有很多选择。
还有哨兵集群。

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

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

相关文章

15 - 信号处理设计模式

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录 1. Linux应用程序安全性讨论1.1 问题1.2 不同场景1.2.1 场景一:不需要处理信号1.2.2 场景二:需要处理信号 2. 场景…

python_day11_pymysql

SQL基础语法回忆 show DATABASES;use world;-- SELECT DATABASES();show TABLES;CREATE TABLE Student(id int,name VARCHAR(10),age int,gender VARCHAR(5) );删除表 # 删除表 DROP TABLE Student;插入操作 insert into student(id) VALUES(1),(2),(3);insert i…

STM32使用高级定时器输出互补pwm波

STM32使用高级定时器输出互补pwm波 前言硬件和软件cubemx新建工程打开Debug模式配置时钟源六大时钟的作用选择Crystal/Ceramic Resonator,即使用外部晶振作为HSE的时钟源。 配置时钟配置高级定时器TIM8和通用定时器TIM3这里大概解释一下配置pwm输出用到的几个参数我…

ylb-接口4投资排行榜

总览: 1、使用Redis存储投资信息 2、Redis常量类 在common模块constants包,创建一个Redis常量类(RedisKey): package com.bjpowernode.common.constants;public class RedisKey {/*投资排行榜*/public static fin…

Qt5.15.2安装

解释一下 Qt 的版本号 比如 5.15.2 是完整的 Qt 版本号,第一个数字 5 是大版本号(major),第二个数字 15 是小版本号(minor),第三个数字 2 是补丁号(patch)。 只要前面两个…

oracle 如何连同空表一起导出成dmp的方法

1、oracle导出dmp文件的时候,经常会出现一些空表,没有一并被导出的情况。 执行sql select alter table ||table_name|| allocate extent; from user_tables where num_rows0 or num_rows is null; 新建一个sql窗口,把查询结果的sql&#…

GSV6201替代方案|CS5466设计资料|CS5466原理图|typec转HDMI_8k方案芯片

GSV6201是一款高性能、低功耗、高性能的,USB Type-C备用模式显示端口1.4至HDMI 2.1转换器。通过集成增强型微控制器,GSV6201创造了一个经济高效的解决方案提供了上市时间优势。显示端口接收机支持高达32.4Gbps(HBR3,4通道&#xf…

uniapp和uview组件实现下拉触底刷新列表

下面是一个在UniApp中使用uView组件实现下拉触底刷新列表的示例,并使用Axios来请求分页数据列表: 首先,确保你已经在UniApp项目中添加了uView组件库。你可以在项目根目录执行以下命令安装它们: npm install uview-ui或者使用 Hb…

曲师大2023大一新生排位赛-D.Factor题解

D.Factor 题目描述 你有一个集合 ,和具有 个正整数的数组 . 最初,集合 为空(不包含任一元素)。你将按照以下方式填充集合 : 以此枚举数组 a 中的每个元素。对于数组中的第 i 个元素 ,生成 ​ 的因子集合 ​。如果…

使用对象解构赋值,将对象的某些属性赋值给另一个对象

在处理接口返回的数据时,我需要将接口返回的数据(对象)的某些属性用另一个对象进行接收,学习对象解构赋值之前,我一直使用的都是最笨的方法: this.formData.projectId res.data.projectId this.formData.…

idea中常用的快捷键

快捷键: 1.快速生成main方法 main/psvm public static void main(String[] args) {} 2.快速复制当前行的代码: ctrld 3.快速捕获异常: altctrlt 4.快速打印结果: sout/soutv System.out.println(s); System.out.println("s " s); 5.自动生成对象的返回值…

【运维工程师学习六】LAM部署搭建个人Discuz论坛

【运维工程师学习六】LAM部署搭建个人Discuz论坛 1、先卸载Mariadb再安装Mysql2、MySQL官网rpm包下载3、在rpm包路径下安装 YUM Repo 文件4、更新软件仓库本地数据库信息5、开始部署——php的安装6、搜索yum包7、开始部署——配置apache以支持php(1)配置…

GitHub上整理的一些实用的工具

1. Visual Studio Code 简称VScode,是一个轻量且强大的跨平台开源代码编辑器(IDE),支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装…

SylixOS下SSH和SFTP连接

简要 基于网络的连接(telnet,ftp)方便高效,但其是基于明文的通信,容易被窃取、篡改和攻击,存在网络安全问题,尤其在进行远程访问时,穿过复杂未知的公网环境非常危险,为此…

ELK-日志服务【es-安装使用】

目录 【1】安装-配置elasticsearch(01、02、03相同) 端口 【2】安装-配置-启动-Kibana 【3】浏览器访问测试(10.0.0.21:5601) 【4】使用kibana创建、更新、删除es索引、文档 【5】组es集群(投票选举机制&#xf…

【多线程】(六)Java并发编程深度解析:常见锁策略、CAS、synchronized原理、线程安全集合类和死锁详解

文章目录 一、常见锁策略1.1 乐观锁和悲观锁1.2 读写锁1.3 重量级锁和轻量级锁1.4 自旋锁1.5 公平锁和非公平锁1.6 可重入锁和不可重入锁 二、CAS2.1 什么是CAS2.2 CAS的实现原理2.3 CAS应用2.4 ABA问题 三、synchronized原理3.1 synchronized锁的特点3.2 加锁工作过程3.3 锁消…

自动驾驶多任务框架 MultiTask V3、HybridNets和YOLOP比较

目标检测和分割是自动驾驶汽车感知系统的两个核心模块。它们应该具有高效率和低延迟,同时降低计算复杂性。目前,最常用的算法是基于深度神经网络的,这保证了高效率,但需要高性能的计算平台。 在自动驾驶汽车的场景下,大多使用的都是计算能力有限的嵌入式平台,这使得难以满…

力扣 332. 重新安排行程

一、题目描述 给你一份航线列表 tickets,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。…

计算机网络基础-OSI七层模型 和 TCP/IP四层模型的对比

OSI七层模型 和 TCP/IP四层模型的对比 OSI七层模型: 理论上的网络通信模型 记忆: (物、链、网、输、会、示、用) TCP/IP四层模型: 实际上的网络通信标准 (1) 七层网络体系结构各层的主要功能: 应用层: 最上层的&am…

Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用

一、基本概念 1.什么是Nginx Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强,其并发能力确实在同类型的网页server中表现较好。 http服务器 Web服务器是指驻留于因特网上某种类型计算机的程…