面向面试知识-Redis

面向面试知识-Redis

什么是Redis

运行于内存的基于key-value的非关系型数据库。

一款开源的内存数据结构存储,用作数据库、缓存、消息代理等。(可以基于Redis实现分布式锁、以及消息队列)
发布订阅??

对数据类型的操作都是原子性的,因为执行命令由单线程负责,不存在并发竞争的问题。
除此之外,Redis还支持:

Redis与Memcached的区别?

Redis和Memcached的共同点:

  1. 都是基于内存的数据库,性能都很高,一般可以用做缓存;
  2. 都有过期策略。

Redis和Memcached的区别:

  • Redis支持的数据类型更加丰富(String、Hash、Set、List、Zset);而Memcached只支持最简单的key-value数据类型;
  • Redis支持数据的持久化,如何持久化??,可以将内存中的数据保持在磁盘中,重启时可以再次加载使用;而Memcached没有持久化功能;
  • Redis原生支持集群;
  • Redis支持订阅模型、Lua脚本、事务等功能,而Memcached不支持。

为什么使用Redis作为MySQL的缓存

主要是因为高性能和高并发

  1. Redis具备高性能
    运行在内存的key-value缓存,读取速度快。
    在这里插入图片描述
    但是需要一定的方法解决Redis和MySQL数据库数据一致性的问题。
  2. Redis具备高并发
    单台设备的Redis的QPS(Query Per Second),是MySQL的10倍,Redis单机的QPS能轻松破10w,而MySQL单机的QPS很难破1W。
    因此可以考虑把数据库的部分数据转移到缓存中,这样会直接到缓存而不用经过数据库。

Redis的数据类型

类型类型:存储的值:结构的读写能力;

String字符串;缓存对象、常规计数、分布式锁、共享session信息等;
Hash哈希;缓存对象、购物车等??
List列表;消息队列(有两个问题①生产者需要自行实现全局唯一;②不能以消费组形式消费数据等;);
Set集合;聚合计算(并集、交集、差集)场景,比如点赞、共同关注、==抽奖活动,为嘛?==等
Zset有序集合;排序场景,比如排行榜、电话和姓名排序等。

Redis常见数据类型:
在这里插入图片描述
数据类型:存储的值:结构的读写能力
在这里插入图片描述
Redis各数据类型的数据结构实现:
在这里插入图片描述

  1. String类型内部实现:
    主要是SDS,Simple Dynamic String,简单动态字符串。
  • SDS不仅可以保存文本数据,还可以保存二进制数据。
  • SDS获取字符串长度的时间复杂度为O(1)。
  • Redis的SDS API是安全的,拼接字符串不会造成缓冲区溢出。
  1. List类型内部实现:
    底层数据结构是由双向链表或压缩列表实现的:
  • if 列表元素个数小于512,每个item的值都小于64字节,Redis会使用List类型的底层;
  • else 使用双向链表;
    在Redis3.2之后,List数据类型的底层DS只由quickList实现。
  1. Hash类型内部实现:
    压缩列表或者哈希表
  • if 列表元素个数小于512,且所有值小于64字节,用压缩列表;
  • else 使用Hash表;
    Redis 7.0之后只由quickList实现
  1. Set类型内部实现:
    Hash表或者整数集合实现
  • if 集合中的元素都是整数,且元素个数小于512,使用整数集合;
  • else 使用哈希表;
  1. Zset类型内部实现
    压缩列表或者跳表:
  • if 有序集合的元素个数小于128个,且所有元素的值小于64个字节时,使用压缩列表;
  • else 使用跳表;
    Redis7.0之后使用listpack实现。

Redis的线程模型

Redis是单线程吗?

在处理一系列请求时,即接受客户端请求,解析请求,进行数据读写等操作,返回数据给客服端的过程,是单线程;
但是Redis程序并不是单线程的,Redis在启动的时候,会启动后台线程(BIO)。

  • Redis在2.6版本加了两个后台线程,分别处理关闭文件、AOF刷盘两个任务;
  • Redis 4.0之后,新增了一个后台线程,用来异步释放Redis内存,也就是lazyfree线程。
    详细内容见Redis 常见面试题
    之所以 Redis 为「关闭文件、AOF 刷盘、释放内存」这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。
    在这里插入图片描述
    此图太大了,内容有点多,慢慢看一下;
    在这里插入图片描述

为什么Redis采用单线程都能这么快?

  1. 运行在内存;
  2. 非多线程,避免了多线程竞争,免去了线程切换等的资源消耗;
  3. 采用I/O多路复用处理大量的客户端Socket请求;

Redis在6.0之后引入了多线程,但是主要面向I/O,采用了多个I/O线程来处理网络请求,因为随着网络硬件的性能提升,Redis的性能瓶颈有时会出现在网络I/O的处理上。

Redis持久化

Redis如何实现数据不丢失

Redis运行在内存,当重启或者崩溃,内存中的数据会丢失,因此需要将数据保存至磁盘实现数据的持久化,在Redis重启后重新恢复保存在磁盘中的数据,避免数据丢失。
三种持久化方式:

  • AOF日志:每执行一条写操作,就将该命令以追加的方式写入一个特定文件中。
  • RDB快照:将某一时刻的内存数据,以二进制的方式写入磁盘。
  • 混合持久化方式:集成了AOF和RDB的优点。

AOF日志是如何实现的?

AOF,Append only File(追加文件)
记录写操作命令到一个文件中,然后Redis重启时,读取文件记录的命令,并逐一执行命令,进行数据恢复。
在这里插入图片描述
为什么先执行命令再保存到文件?

  • 避免额外的检查开销:防止保存完执行过程发现语法错误等;
  • 不会阻塞写命令的执行:;
    可能的风险:
  • 数据可能会丢失:两个过程,如果写文件过程中,服务器宕机,那么数据就会有丢失的风险;
  • 可能阻塞其他操作:因为AOF日志是需要主线程执行的;
AOF的写回策略有哪些?

在这里插入图片描述
内核缓冲区的数据何时写入硬盘?

  • Always,
  • Everysec,
  • No,
    在这里插入图片描述
    AOF文件过大时,会出发AOF重写机制。即去除冗余操作,精简文件内容。
    在这里插入图片描述

RDB是如何实现的?

RDB,Redis DataBase,内存快照。

上两部分见参考:Redis 如何实现数据不丢失?
RDB的优点是:数据恢复速度快,但是快照的时机把握是一个比较难的问题;
AOF的优点是:丢失数据少,但是恢复慢;

混合持久化

发生在AOF日志重写过程。
使用混合持久化的AOF文件,前半部分是RDB格式的全量数据,后半部分是AOF格式的增量数据。
在这里插入图片描述
优点:

  • 前半部分是RDB数据,所以加载速度快;
  • 后半部分是AOF数据,加载完RDB数据,再加载AOF,所以数据的完整性较好,丢失的数据少。
    缺点:
  • AOF文件中加入RDB文件,可读性变差;
  • 兼容性差,不能用于Redis4.0之前的版本;

Redis集群

主从复制

在这里插入图片描述
主从服务器的命令复制是异步进行的。无法实现强一致性,数据不一致在所难免。

哨兵模式

在这里插入图片描述
主从复制模式有一个问题,当主节点宕机时,需要手动恢复。为了自动恢复,Redis增加了哨兵模式,因为哨兵模式可以监控主从服务器,且提供主从节点故障转移功能

切片集群模式

当Redis缓存数据量大到一台服务器无法缓存时,就需要使用Redis切片集群
使用哈希槽的方案,

Redis的内存淘汰策略

Redis使用的过期删除测试是惰性删除+定期删除

  • 惰性删除:只有被访问时,才会检查过期时间,若过期则删除。问题:如果一直不被访问,就一直无法删除。在这里插入图片描述

  • 定期删除:每过一段时间,随机从数据库中取出一定数量的key值进行检查,删除过期的key。在这里插入图片描述

  • redis的定期删除:如上图
    缺点是无法准确的设定删除执行时长和频率。

持久化时,对过期键的处理

RDB:
AOF:

Redis如何保证数据一致性

Redis如何解决数据一致性问题?

先更新数据库,再更新缓存
先更新缓存,再更新数据库
先删除缓存,再更新数据库
先更新数据库,再删除缓存

延迟双删

如何解决缓存击穿、穿透、雪崩等问题?

缓存击穿

缓存穿透

缓存雪崩

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

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

相关文章

Jmeter接口测试

前言: 本文主要针对http接口进行测试,使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。 1.介绍什么是…

利用爬虫技术自动化采集汽车之家的车型参数数据

导语 汽车之家是一个专业的汽车网站,提供了丰富的汽车信息,包括车型参数、图片、视频、评测、报价等。如果我们想要获取这些信息,我们可以通过浏览器手动访问网站,或者利用爬虫技术自动化采集数据。本文将介绍如何使用Python编写…

使用Python做一个微信机器人

介绍 简介 该程序将微信的内部功能提取出来,然后在程序里加载Python,接着将这些功能导出成库函数,就可以在Python里使用这些函数 程序启动的时候会执行py_code目录下的main.py,类似于你在命令行使用python main.py。 现在会以…

011_第一代软件开发(三)

第一代软件开发(三) 文章目录 第一代软件开发(三)项目介绍带下知识点系统日志滤波器陷波滤波器带通滤波器 打印初始化调用打印机打印文件保存到PDF 总结一下 关键字: Qt、 Qml、 日志、 打印、 滤波器 项目介绍 欢迎来到我们的 QML & C 项目!这…

rom修改----安卓系列机型如何内置app 如何选择so文件内置

系统内置app的需求 在与各工作室对接中操作单中,很多需要内置客户特定的有些app到系统里,这样方便客户刷入固件后直接调用。例如内置apk 去开机引导 去usb调试 默认开启usb安全设置等等。那么很多app内置有不同的反应。有的可以直接内置。有的需要加so…

【三、centOS安装后的基本配置】

Centos的ip地址设定,cmd查看 Windows: ipconfig 再到windows电脑的网络共享中心查看 设置虚拟机的IPv4,锁定本地电脑的ip地址和网关 再重启虚拟机机器,vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROXY_MET…

JavaScript学习笔记05

JavaScript笔记05 操作 BOM 对象(重点) 什么是 BOM BOM(Browser Object Model)是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型。浏览器对象模型(BOM)提供了独立于内容的、可…

设计模式再探——原型模式

目录 一、背景介绍二、思路&方案三、过程1.原型模式简介2.原型模式的类图3.原型模式代码4.原型模式深度剖析5.原型模式与spring 四、总结五、升华 一、背景介绍 最近在做业务实现的时候,为了通过提升机器来降低开发人员的难度和要求,于是在架构设计…

用Redis做数据排名

1.背景 用Redis做数据缓存用的比较多,大家都能熟练使用String和Hash结构去存储数据,今天讲下如何使用ZSet来做数据排名。 假设场景是需要按天存储全国城市的得分数据,可以查询前十名的城市排名。 这个case可以使用传统关系型数据库做…

【lesson7】git的介绍及使用

文章目录 什么是gitgit的历史git使用在gitee上创建仓库git clone HTTPS地址git add .git add 文件名git commit “日志”git pushgit loggit rm 文件名git statusgit pull 什么是git git是版本控制器,那么什么是版本控制器呢? 下面讲个故事为大家讲解一…

AI AIgents时代 - (三.) AutoGPT和AgentGPT

前两篇讲解了Agent的原理和组件,这节我将给大家介绍两个agent项目,给出它们的工作原理和区别,并教大家亲手尝试使用 Agents🎉 🟢 AutoGPT🤖️ 我们的老朋友,之前文章也专门写过。AutoGPT 是一…

iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色

要想修改顶部背景颜色&#xff0c;需要用到这个属性&#xff1a;content就是你要设置的颜色 <!-- 状态栏的背景色 --><meta name"theme-color" content"#f8f8f8" /> 然后再加上下面的设置&#xff1a; <!-- 网站开启对 web app 程序的支持…

【数据结构】C++实现哈希表

闭散列哈希表 哈希表的结构 在闭散列的哈希表中&#xff0c;哈希表每个位置除了存储所给数据之外&#xff0c;还应该存储该位置当前的状态&#xff0c;哈希表中每个位置的可能状态如下&#xff1a; EMPTY&#xff08;无数据的空位置&#xff09;。EXIST&#xff08;已存储数…

Qt创建线程(线程池)

1.线程池可以创建线程统一的管理线程&#xff08;统一创建、释放线程&#xff09; 2.使用线程池方法实现点击开始按钮生成10000个随机数&#xff0c;然后分别使用冒泡排序和快速排序排序这10000个随机数&#xff0c;最后在窗口显示排序后的数字&#xff1a; mainwindow.h文件…

FPGA的DQPSK调制解调Verilog

名称&#xff1a;DQPSK调制解调 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 使用Verilog语言进行DQPSK调制和解调&#xff0c;并进行仿真 代码下载&#xff1a;DQPSK调制解调verilog&#xff0c;quartus_Verilog/VHDL资源下载 代码网&#xff1a;h…

Vector Art - 矢量艺术

什么是矢量艺术&#xff1f; 矢量图形允许创意人员构建高质量的艺术作品&#xff0c;具有干净的线条和形状&#xff0c;可以缩放到任何大小。探索这种文件格式如何为各种规模的项目提供创造性的机会。 什么是矢量艺术作品? 矢量艺术是由矢量图形组成的艺术。这些图形是基于…

【音视频】ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …

快递发货小程序商城的效果是什么

商家搭建小程序商城后&#xff0c;客户交易可以通过到店自提、同城配送、快递发货的方式满足不同场景不同客户购物。 本地客户难以拓展&#xff0c;三公里范围内流量有限&#xff0c;外地无疑是商家拓展市场、客户的绝佳选择&#xff0c;传统电话、微信联系难以信任及选择&…

问题:conda删除虚拟环境,报错no package names supplied

用conda 用 conda remove -n ScratchDet_20200114 删除虚拟 环境ScratchDet_20200114时报错 conda remove -n ScratchDet_20200114CondaValueError: no package names supplied,try "conda remove -h" for more details 解决方法&#xff0c;用下面的命令 conda env…

FPGA的BPSK调制verilog

名称&#xff1a;BPSK调制verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 一、设计说明 BPSK调制广泛应用于卫星通信、移动通信等领域。本题目要求设计一个基于直接数字频率合成技术的BPSK调制器&#xff0c;实现对输入周期数字比特流的BPSK调…