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. 场景…

一文读懂Mysql 优化之order by【百万乃至千万数据查询优化推荐】

一文读懂Mysql 优化之order by 驱动表与被驱动表概念复合索引的三大原则排序方式对比索引排序驱动表排序临时表排序排序算法驱动表与被驱动表概念 当使用left join时,左表是驱动表,右表是被驱动表当使用right join时,右表是驱动表,左表是被驱动表当使用join(inner join) …

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输出用到的几个参数我…

【解决】 Android Studio Failed to find configured root that contains

问题出现 尝试将拍摄的图像存储至手机自定义的存储空间,不料却一直报错,主要问题是在使用 FileProvider 从文件路径中获取 Uri 时出现异常。 相关代码 报错区域的文件路径相关的代码 主要是在 File imageDir new File(getExternalCacheDir(), “Galler…

【Nginx08】Nginx学习:HTTP核心模块(五)长连接与连接处理

Nginx学习:HTTP核心模块(五)长连接与连接处理 HTTP 基础知识大家掌握的怎么样呀?对于长连接这一块的内容应该也不是什么新鲜东西了吧。毕竟 HTTP1.1 都已经发布这么久了。今天主要来看的就是长连接相关的配置,另外还会…

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…

go map[string]any 转map[string]string

目录 一 、map[string]any参数转为map[string]string 二 、go 请求参数绑定 gin框架示例 三、 go 中实现接口 四 、go中设计模式策略模式实现 一 、map[string]any参数转为map[string]string 场景:在go中有将map[string]any参数转为map[string]string 其中…

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支持,而且拥有丰富的插件生态系统,可通过安装…

关于GDP调试

说出一些常见的指令 break(或缩写为b):设置断点,例如 b main 在 main 函数处设置断点run(或缩写为r):运行程序。step(或缩写为s):单步执行程序,进…

SylixOS下SSH和SFTP连接

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

快速替换chatgpt-web项目的access token的脚本

问题背景,由于GPT access token 会定期失效,更换服务器的项目的access token较为繁琐,特写一脚本协助完成更换access token。 使用方法: # token从https://chat.openai.com/api/auth/session获取 ./replace_token.sh token脚本内…