声明: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. 2021-09-07:单词接龙 II。按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -

    2021-09-07:单词接龙 II.按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s ...

  2. Django4全栈进阶之路13 template模板

    在 Django 中,模板(Template)用于生成动态的 HTML 页面.通常情况下,Django 项目包含多个视图函数,每个视图函数都负责渲染不同的 HTML 页面.使用模板可以让我们将 HTM ...

  3. distinct()去重

    distinct()去重 Student.objects.all().distinct()

  4. Burpsuite抓包工具的使用

    一.打开工具 1处箭头为 代理127.0.0.1 端口8080 2处箭头为 证书 将证书ca下载到桌面上 选择第一个 选择下载到桌面即可 可以修改其后缀为der 此即为证书文件 此处使用火狐浏览器为示 ...

  5. pnpm才是前端工程化项目的未来

    前言 相信小伙伴们都接触过npm/yarn,这两种包管理工具想必是大家工作中用的最多的包管理工具,npm作为node官方的包管理工具,它是随着node的诞生一起出现在大家的视野中,而yarn的出现则是 ...

  6. PowerShell脚本的基础知识

    参考文档https://learn.microsoft.com/zh-cn/powershell/scripting/samples/viewing-object-structure--get-mem ...

  7. k8s~RKE的方式升级Rancher集群

    kubectl安装 在主机或者远程访问的笔记本上安装kubectl命令行工具 rancher-cluster.yml(RKE配置文件) 通过RKE创建kubernetes集群,需要预先设置ranche ...

  8. JUC同步锁原理源码解析二--ReentrantReadWriteLock

    JUC同步锁原理源码解析二----ReentrantReadWriteLock 1.读写锁的来源 ​ 在开发场景下,对于写操作我们为了保证原子性所以需要上锁,但是对于读操作,由于其不改变数据,只是单纯 ...

  9. 数位DP?记忆化罢了!

    我看了半天的数位 DP,DP 没学会,人倒是麻了. 解决什么 一般用于求解给你一个区间 \([l,r]\),问你其中满足条件的数有多少个. 这种题目还是蛮常见的,我们一般情况下暴力只能拿一少部分分,之 ...

  10. Java String、StringBuilder、StringBuffer类

    1.String类 创建字符串对象后,字符串对象不可以发生改变,并且这个字符串对象存储在方法区中的字符串常量池中. 即使想改变字符串对象,那么也只是在字符串常量池中重新创建了一个字符串对象而已. 2. ...