【后端面经-数据库】Redis详解——Redis基本概念和特点

【后端面经-数据库】Redis详解——Redis基本概念和特点

    • 1. Redis基本概念
    • 2. Redis特点
      • 2.1 优点
      • 2.2 缺点
    • 3. Redis的应用场景
    • 面试模拟
    • 参考资料

声明:Redis的相关知识是面试的一大热门知识点,同时也是一个庞大的体系,所涉及的知识点非常多,如果用一篇文章罗列,往往会陷入知识海洋中无法感知其全貌,因此,这段时间我会试着拆分Redis的相关章节,辅以思维导图的形式介绍Redis的相关知识点,知识点范围包括如下几部分

  • Redis基本概念和特点
  • Redis数据结构和底层数据类型
  • Redis持久化(AOF和RDB)
  • Redis集群和高可用性
  • Redis缓存
  • Redis分布式锁
  • Redis实现异步队列
  • Redis运维问题

今天主要介绍的是Redis基本概念和特点。

1. Redis基本概念

最本质的,Redis是一个数据库,作为一个数据库,它和其他数据库自然不会完全相同,如下是它的一些本质特性:

  • C语言开发:这也是它高性能的一个重要原因;
  • 基于key-value键值对存储:键、值都有丰富的数据类型支持
  • 数据存于内存中:这是访问速度快的一个原因;
  • 非关系型数据库:NoSQL,之前所了解的MySQL是关系型数据库的代表。
  • 高性能:C语言开发+数据存于内存
  • 开源

2. Redis特点

2.1 优点

Redis技术之所以被广泛使用,是因为它具有很多优点,如下所示:

  • 访问速度快

    • 访问速度快主要有四个原因:C语言开发+数据存于内存+单线程+非阻塞I/O多路复用;
    • 这也是它被web应用广泛使用、在大厂技术中作为基础的原因之一。
  • 支持丰富的数据类型
    Redis基于键值对完成数据存储,那么对于键key、值value都有相对应的数据类型支持,如下所示:

    • key:只能是字符串类型
    • value:可支持丰富的数据类型,如下所示:
      • 五大基础数据类型
        • 字符串(String):最基础的数据类型,可以是字符串、整数、浮点数、二进制数据。
          • 很常用的数据结构,存储一般数据都会使用。
        • 列表(List):存储有序元素
          • 可在实现消息队列中可使用。
        • 哈希表(Hash):存储键值对集合,也就是整体Redis存储可实现键值对嵌套,从而提高数据存储的灵活性。
          • 可存储用户信息等。
        • 集合(Set):无序、不可重复的元素。
          • 例如标签tag、共同关注等数据信息,就可以使用集合来存储。
        • 有序集合(Sorted Set):可给每个元素设置权重,作为排序依据,同样不可出现重复元素,但是可以有顺序。
          • 在实现排行榜功能中可使用。
      • 高级数据类型(了解即可)
        • 位图(Bitmap)
        • HyperLogLog
        • 布隆过滤器
        • GeoHash
        • Pub/Sub
        • Stream
  • 单线程

    • Redis是单线程的,这是它访问速度快的一个重要原因,因为单线程不需要考虑线程安全问题,也不需要考虑上下文切换的问题,因此,它的访问速度自然会快很多。
    • Redis单线程的一个重要原因:Redis的瓶颈不在于CPU,而是内存和网络带宽,因此,单线程的Redis可以充分利用CPU的性能,从而提高访问速度。
    • Redis4.0的时候,尝试在主线程外开辟后台线程,处理一些较为耗时的操作,如清理脏数据、断开无用链接、删除过期key等,但是这些操作都是在后台线程中完成,不会影响主线程的访问速度。
    • Redis6.0在某种程度上实现了多线程,使用多线程并行处理读写操作和协议分析,对于命令执行部分依然使用单线程保证访问速度。
      • 这种多线程的方式提高了IO效率,解决了Redis性能限制的瓶颈之一。
  • 非阻塞I/O多路复用

    • I/O多路复用指的是:在一个线程中,可以同时监听多个文件描述符,一旦某个文件描述符就绪(可读或可写),就能够通知程序进行相应的读写操作。这样就不会出现“为了等待任意文件的I/O响应而阻塞主线程”。
    • 也许这时候你会问“不对啊,Redis不是单线程的吗?”,是啊,这里所说的多路复用,指的正是上文中Redis6.0使用多线程处理读写操作的技术部分。
    • I/O多路复用的实现方式主要有:selectpollepoll.具体可参考此篇博客:【后端面经-Java】I/O多路复用 简录
  • 支持持久化、分布式系统、事务、主从复制(集群)

    • 这些在后续的学习中都会具体详细解释

2.2 缺点

任何一个技术都不会是完美的,有优点就必然也存在缺点。——鲁迅(:“我没说过”)
Redis的缺点如下所示

  • 瓶颈问题:内存和网络带宽
    • 在分析Redis单线程原因的时候,我们已经提到过Redis的瓶颈问题,主要就是物理内存的容量大小和IO操作的带宽限制。
    • 举个例子:一个数据库就像一个自由职业者,它的赚钱速度(效率)取决于接单速度和完工速度,而Redis就像一个完工速度非常快的自由职业者(访问速度快),且面对着海量的请求,因此,它的技术瓶颈就在于接单速度(IO操作带宽)。不仅如此,它完工速度快是因为把所有东西都堆在房间(内存)里面,因此,它也同样受限于物理房间的大小(物理内存容量)。
  • 不具备自动容错/恢复的能力
    • 主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  • 在线扩容难度高
    • 集群容量在后续维护中很难扩容,因此一开始就需要根据使用规模预备合适的容量空间。

3. Redis的应用场景

Redis是Web应用的常用中间件,它的应用场景非常广泛,如下所示:

  • 缓存
    • Redis作为客户端和服务器数据库之间的缓存数据,可以有效减少数据库的访问压力,提高访问速度。
    • 结构图如下所示:
  • 分布式锁
    • Redis可实现分布式锁,解决分布式系统中的并发问题。
  • 简单消息队列
    • Redis提供发布订阅功能和阻塞队列功能,可以满足一般消息队列功能。
  • 网络流量管理
    • 计数器
      • 天然支持,可记录浏览量、点赞了
    • 排行榜
      • Redis中的列表、有序集合可以用于构建排行榜
    • 社交网络
      • 各类数据之间的关联,赞踩比例、共同好友、共同爱好等等可以使用Redis实现。

面试模拟

Q:Redis、内存、磁盘的区别,为什么快为什么慢?
A:Redis是内存数据库,内存是计算机中最快的存储介质,磁盘是最慢的存储介质。Redis快速是因为它将数据存于内存之后,而内存访问可以直接传输到CPU中,磁盘访问则需要通过IO操作先将数据写入内存空间之后然后再传入CPU中。

Q:Redis的数据库类型、存储结构如何?如何实现排行榜功能
A:Redis属于NoSQL数据库,它的存储结构是键值对,其中键的数据类型只支持字符串,而值可以支持丰富的数据类型,包括列表、有序集合、集合、哈希表、字符串等等,通过列表、有序集合等数据结构实现排行榜功能。

Q:Redis是单线程还是单进程?哪些模块是单线程?
A:Redis执行指令的相关模块是单线程,6.0之后,关于网络IO的处理则转为多线程,使用非阻塞IO多路复用提高IO效率

参考资料

  1. Redis教程 - Redis知识体系详解
  2. 三万字+八十图,详解Redis五十二问!太全面了!
  3. 妈妈再也不担心我面试被Redis问得脸都绿了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HttpClint 项目中使用

大家好 , 我是苏麟 , 今天带来一个HTTP通信库 HttpClient . HttpClient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包 . HttpClient的功能包括但不限于 1.模拟浏览器发送HTTP请求,发送…

变形金刚在图像识别方面比CNN更好吗?

链接到文 — https://arxiv.org/pdf/2010.11929.pdf 术语说明: 1)transformer:对应的汉译是”转换器、变形金刚、变压器“等,文中见到类似语句一律理解为transformers。 2)ViT:是 VISION TRANSFORMER 的…

实现动画的连续展示 JAVA

目录 1、前言:2、图片的展示以及自动关闭:3、动画的连续展示: 1、前言: 要实现动画的流畅展示需要在能展示图片的基础上对图片进行关闭,再切换下一张图片,这要关闭窗口,与延时函数以及while函数…

SpringBoot案例-部门管理-根据id查询

目录 根据页面原型,明确需求 查看接口文档 思路分析 接口功能实现 控制层(Controller类) 业务层(Service类) 业务类 业务实现类 持久层(Mapper类) 接口测试 前后端联调 根据页面原型&…

前端性能优化——包体积压缩插件,打包速度提升插件,提升浏览器响应的速率模式

前端代码优化 –其他的优化可以具体在网上搜索 压缩项目打包后的体积大小、提升打包速度,是前端性能优化中非常重要的环节,结合工作中的实践总结,梳理出一些 常规且有效 的性能优化建议 ue 项目可以通过添加–report命令: "…

开发过程中自己遇到的异常(四)

mysql 报错:‘Lost connection to MySQL server during query 出现这种情况大多是因为,两个事物抢一个表的使用权造成的。 show processlist; 观察Command 列,有明显的update,insert, delete 时间比较久的,直接kill掉…

【Mysql 连接报错】

文章目录 遇到问题查看用户信息修改加密规则成功连入mysql 遇到问题 socket: auth failed …/…/lualib/skynet/socketchannel.lua:482: errno:1251, msg:Client does not support authentication protocol requested by server; consider upgrading MySQL client,sqlstate:080…

SpringBoot 异步、邮件任务

异步任务 创建一个Hello项目 创建一个类AsyncService 异步处理还是非常常用的,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线…

Kubernetes+EFK构建日志分析平台

目录 Elasticsearch产品介绍 Fluentd 工作原理 Kibana产品介绍 一、环境准备 1.1、主机初始化配置 1.2、部署docker环境 二、部署kubernetes集群 2.1、组件介绍 2.2、配置阿里云yum源 2.3、安装kubelet kubeadm kubectl 2.4、配置init-config.yaml 2.5、安装master…

Spring-Bean的生命周期

目录 生命周期汇总 细分生命周期 1.实例化 2.属性赋值(依赖注入) 3.Aware接口 4.BeanPostProcessor接口 5.初始化 6.销毁 测试验证 类结构 业务类 测试类 生命周期汇总 Spring Bean 的生命周期见下图 (一定记忆好下图&#x…

Maven之Servlet 版本问题

maven-archetype-webapp 骨架的 Servlet 版本问题 通过 maven-archetype-webapp 骨架去创建 java web 项目时,自动生成的 web.xml 配置文件所使用的 Servlet 的版本比较低(2.3),而在低版本的 Servlet 中 EL 表达式默认是关闭的。…

【c语言】通讯录(动态版+文件+背景音乐)含源码

开饭了,之前写的通讯录,是否会有人觉得申请1000人的空间是不是有点用不上呀,怎么才能做到要多少申请多少个呢??我们学完动态内存管理,和文件的相关操作,终于可以继续完善我们的通讯录了 船新版本…

解决 adb install 错误INSTALL_FAILED_UPDATE_INCOMPATIBLE

最近给游戏出包,平台要求 v1 签名吧,AS 打包后,adb 执行安装到手机,我用的设备是google pixel6 , android 系统 13, 提示如下: adb install -r v5_android_202308161046.apk Performing Streamed Install a…

kali linux查看局域网下所有IP,并对指定IP攻击

kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击 首先我们打开我们熟悉的kali linux操作系统,利用指令: ifconfig来确认本机的ip地址 确认了本机的ip地址之后,利用一下的指令查看局域网下所有ip: fping -g 本机IP地址…

C# Linq源码分析之Take (三)

概要 本文在前两篇Take源码分析的基础上,着重分析Range参数中有倒数的情况,即分析TakeRangeFromEndIterator的源码实现。 源码及分析 TakeRangeFromEndIterator方法用于处理Range中的开始和结束索引存在倒数的情况。该方法位于Take.cs文件中。通过yie…

【Windows系统编程】06.HotFixHook与进程通信(详解HotFixHook)

上一讲讲到的InlineHook,每次Hook的时候,都要读写两次内存(先Hook,再还原)这种Hook方式,性能比较低,今天我们讲的这种Hook方式,可以说是InlineHook的升级版本 HotFix(热…

[JavaWeb]【七】web后端开发-MYSQL

前言:MySQL是一种流行的关系型数据库管理系统,它的作用是存储和管理数据。在Web开发中,MySQL是必备的数据库技能之一,因为它可以帮助Web开发人员处理大量的数据,并且提供了强大的数据查询和管理功能。 一 数据库介绍 1.1 什么是数据库 1.2 数据库产品 二 MySQL概述…

NLPR、SenseTime 和 NTU 加速自动视频纵向编辑

视频人像编辑技术已经在电视、视频和电影制作中得到了应用,并有望在不断发展的网真场景中发挥关键作用。最先进的方法已经可以逼真地将同源音频合成为视频。现在,来自北京模式识别国家实验室(NLPR)、商汤科技研究和南洋理工大学的…

深度分析纳斯达克上市公司慧择的竞争优势和投资价值

来源:猛兽财经 作者:猛兽财经 一、保险行业的现状、竞争与机遇 在疫情期间,很多行业的经营理念与经营方式,甚至客户行为、客户需求都发生了变化,进而催生出新的机遇。保险行业亦是如此,受疫情影响&#xf…

借助 AI 工具,真的能成为 10x 工程师?

或许你听说过 10x 工程师吗? 如果你问猎头公司 10x 工程师是什么意思,他们可能会说 “生产力”!10x 是指完成任务比别人快 10 倍的工程师。 2019 年,Twitter 上就曾经对 10 x 工程师这一议题有过一次空前热烈的讨论,引…