声明: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问得脸都绿了

【后端面经-数据库】Redis详解——Redis基本概念和特点的更多相关文章

  1. Spring Data操作Redis详解

    Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...

  2. Redis学习——详解Redis配置文件(三)

    一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...

  3. .Net使用Redis详解之ServiceStack.Redis(七) 转载https://www.cnblogs.com/knowledgesea/p/5032101.html

    .Net使用Redis详解之ServiceStack.Redis(七)   序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现 ...

  4. Redis详解入门篇

    Redis详解入门篇 [本教程目录] 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介 ...

  5. .Net使用Redis详解之ServiceStack.Redis(7)

    Net使用Redis详解之ServiceStack.Redis(七) 序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中 ...

  6. Redis详解入门篇(转载)

    Redis详解入门篇(转载) [本教程目录] 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 ...

  7. Redis详解(二)——AOF

    Redis详解(二)--AOF 前言 RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失).对于数据完整性要求很严格的需求 ...

  8. Redis详解(一)——RDB

    Redis详解(一)--RDB 前言 由于 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比, ...

  9. Redis详解(四)——删除策略

    Redis详解(四)--删除策略 Redis中的数据特征 Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令来获取其状态,当 key 不存在时,返回 -2 . 当 k ...

  10. Redis详解(八)——企业级解决方案

    Redis详解(八)--企业级解决方案 缓存预热 缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统.避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓 ...

随机推荐

  1. 2022-11-14:rust语言,请使用过程宏给结构体AAA生成结构体AAABuilder和创建AAABuilder实例的方法。 宏使用如下: #[derive(Builder)] pub stru

    2022-11-14:rust语言,请使用过程宏给结构体AAA生成结构体AAABuilder和创建AAABuilder实例的方法. 宏使用如下: #[derive(Builder)] pub stru ...

  2. mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异

    json 非数组 建表语句ddl CREATE TABLE tb_json_test ( id INT NOT NULL AUTO_INCREMENT, user_no VARCHAR(100), u ...

  3. vue全家桶进阶之路32:Vue3 WatchEffect和watch 监听

    在 Vue 3 中,watchEffect 是一个用于监听响应式数据变化的 API.它可以在函数内部自动跟踪数据的依赖,并在依赖变化时重新运行函数. watchEffect 的作用以及各个参数的功能讲 ...

  4. <form>表单中的action和method使用方法

    <form action="" method="post"> form是表单   里面的内容是要提交出去的. action 是链接   点击浏览选择 ...

  5. only仅显示一些字段

    only仅显示一些字段 仅显示nickname,age两列的数据 Student.objects.all().only('nickname','age')

  6. Netty实战(一)

    目录 第一章 Java网络编程 1.1 Java NIO 1.2 选择器 第二章 Netty是什么 2.1 Netty简介 2.2 Netty的特性 2.2.1 设计 2.2.2 易于使用 2.2.3 ...

  7. 代码随想录算法训练营Day55 动态规划

    代码随想录算法训练营 代码随想录算法训练营Day55 动态规划| 392.判断子序列 115.不同的子序 392.判断子序列 题目链接:392.判断子序列 给定字符串 s 和 t ,判断 s 是否为 ...

  8. cookie和session以及token

    cookie和seesion以及token 技术都基于状态保持, cookie: ​ 有服务器生成, 以 k:v 形式保持在浏览器端,下次请求服务器,附带cookie信息:存在恶意修改可能:可以对co ...

  9. 自定义 coding.net 静态网站域名

    点击文章左下角 "阅读原文",预览本文章的示例站点. 在上一篇文章<使用 coding.net 发布你的个人博客>,我们介绍了怎么在 coding.net 部署个人的静 ...

  10. pytorch的torch、torchvision、torchaudio版本对应关系

    torch与torchvision对应关系 torch与torchaudio对应关系