Redis常见须知

news2024/11/26 4:43:45

介绍一下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.coloradmin.cn/o/771457.html

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

相关文章

【后端面经-Java】JVM垃圾回收机制

【后端面经-Java】JVM垃圾回收机制 1. Where:回收哪里的东西?——JVM内存分配2. Which:内存对象中谁会被回收?——GC分代思想2.1 年轻代/老年代/永久代2.2 内存细分 3. When:什么时候回收垃圾?——GC触发条…

【汉诺塔问题分析】

一、背景 汉诺塔问题是一种经典的递归问题,它由法国数学家Huygens在1665年发现,也是一道有趣的数学难题。这道问题的主要目的是将三根柱子上的一堆盘子移动到另一根柱子上,移动过程中每次只能移动一个盘子,并且大盘子不能放在小盘…

【LeetCode热题100】打卡第40天:翻转二叉树回文链表

文章目录 【LeetCode热题100】打卡第40天:翻转二叉树&回文链表⛅前言 翻转二叉树🔒题目🔑题解 回文链表🔒题目🔑题解 【LeetCode热题100】打卡第40天:翻转二叉树&回文链表 ⛅前言 大家好&#xff…

高数-第一章-函数-极限 连续

目录 第一章 函数 极限 连续第一节 函数第二节 极限一、极限的概念与性质(1)数列的极限例1例2 (2)函数的极限(3)极限的性质(保号性重点 有界性)例12例13例14 (4&#xff…

Python 3 拷贝、浅拷贝、直接引用

诸神缄默不语-个人CSDN博文目录 复杂的以后再补。 总的来说,像常数、字符串这种比较简单的变量无所谓,但是对于一些复杂对象(比如list等),如果直接使ba,相当于直接把a的路径给了b,b这个对象的…

stb_image简单使用

简介stb_image stb_image 是一个非常轻量级的、单文件的图像加载库,用于加载和解码多种图像格式(如BMP、JPEG、PNG、GIF等)的图像数据。它由Sean T. Barrett开发,并以公共领域(Public Domain)许可发布&…

【软件测试】web测试bug定位思路总结,“我“不再背锅...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 需要掌握的知识 …

LabVIEW - 采集声音并保存 wav 文件

1. 题目 编写程序,实现用户点击按钮时,采集声音,显示声音波形,对于采集的声音进行低频段、中频段、高频段分别进行适当的比例放大或者衰减,然后重新合成(三段相加即可),并将合成的声音下入wav格式的文件保存…

【ROS】ROS1人机界面开发:第一个最简ROS+QtGui程序(按钮启动发布者)

【ROS】郭老二博文之:ROS目录 1、创建工程 1)新建工程:Other Project --> ROS Workspace 2)设置工程名称、路径 3)可以通过点击“Browse”来创建目录 注意:使用自带ros插件的qtcreator-ros,无法创建目录、也不能选择目录,这是个bug,因此需要在终端手动创建目录…

江南大学轴承数据故障诊断(利用连续小波变换转换为二维图像,再利用CNN进行故障诊断)

1.江南大学轴承数据集介绍 采样频率:50khz,采样时间:10s 转速:600 800 1000/rpm 内圈:ib 外圈:ob 滚动体:tb 正常:N 以600转速下的内圈故障数据为例展示: 开始数据…

【云原生】Prometheus 之PromQL

前言 当 Prometheus 通过 Exporter 采集到相应的监控指标样本数据后,我们就可以通过PromQL 对监控样本数据进行查询,从而对相应的数据样本进行分析以及制定报警规则。 1. PromQL的简介 PromQL(Prometheus Query Language)是 Prome…

SaleSmartly,客户满意度调查的绝对好助手

企业使用客户满意度调查来收集反馈并评估客户满意度水平,包括有关产品质量、服务、支持和整体满意度的问题。客户满意度调查的主要目标是直接从客户那里收集有价值的见解,以了解他们的需求、偏好和期望。这种反馈可以帮助企业确定需要改进的领域&#xf…

STM32案例学习 GY-39环境监测传感器模块

STM32案例学习 GY-39环境监测传感器模块 硬件平台 野火STM32F1系列开发板正点STM32F1系列开发板STM32F103ZET6核心板GY-39环境监测传感器模块 GY-39环境监测传感器模块 GY-39 是一款低成本,气压,温湿度,光强度传感器模块。工作电压 3-5v…

JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch

目录 1_前端数据请求方式1.1_前后端分离的优势1.2_网页的渲染过程 – 服务器端渲染1.3_网页的渲染过程 – 前后端分离 2_HTTP协议的解析2.1_HTTP概念2.2_网页中资源的获取2.3_HTTP的组成2.4_HTTP的版本2.5_HTTP的请求方式2.6_HTTP Request Header2.7_HTTP Response响应状态码 3…

京东自动化功能之商品信息监控是否有库存

这里有两个参数,分别是area和skuids area是地区编码,我这里统计了全国各个区县的area编码,用户可以根据实际地址进行构造skuids是商品的信息ID填写好这两个商品之后,会显示两种状态,判断有货或者无货状态,详情如下图所示 简单编写下python代码,比如我们的地址是北京市…

Kaggle:树叶分类(使用Jupyter)

竞赛网址:https://www.kaggle.com/c/classify-leaves # 首先导入包 import torch import torch.nn as nn import pandas as pd import numpy as np from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Image i…

uniapp 小程序 实时拍照(仅拍照)限制上传5张 可预览 可删除

效果图: common.js /*** 预览图片*/ const previewImage (current,list)>{// 预览图片uni.previewImage({current: current,urls: list}); } /*** 删除图片*/ const removeImage (current,list)>{var photoFilesList list;photoFilesList.splice(curren…

AJAX:宏任务与微任务

异步任务划分为了 宏任务:由浏览器环境执行的异步代码 微任务:由 JS 引擎环境执行的异步代码 宏任务和微任务具体划分: 左边表格是宏任务,右边是微任务 事件循环模型 /*** 目标:阅读并回答打印的执行顺序 */ console…

国内软件外包公司开发流程

当企业发展到一定阶段后,现有市场上通用型的软件往往无法满足自身的业务需求,这就需要企业定制化开发软件系统来满足自身独特的需求。而传统企业往往没有自己的软件研发队伍,在开发软件系统时快速新建团队风险比较高,可以采用外包…

Docker 网络模型:多角度分析容器网络的原理与应用

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…