Contents

数据库-redis-小林coding-面试篇

本系列笔记为作者在跟随小林coding学习的时候做的笔记。感谢小林大大。

Redis 是一种基于内存的数据库,读写速度非常快,常用于缓存,消息队列、分布式锁等场景。

单线程操作保证原子性

Redis 与 Memcached 区别

  • Redis 支持的数据类型更丰富
  • Redis 支持数据的持久化
  • Redis 原生支持集群模式
  • Redis 支持发布订阅模型、Lua 脚本、事务等功能

为什么用 Redis 作为 MySQL 的缓存

  1. Redis 具备高性能:基于内存
  2. Redis 具备高并发:单机QPS(Query Per Second,每秒钟处理完请求的次数)10w以上,单机mysql不到1w

Redis 数据结构

常见的有五种数据类型:

https://cdn.xiaolincoding.com/gh/xiaolincoder/redis/%E5%85%AB%E8%82%A1%E6%96%87/key.png

Redis 线程模型

Redis 程序是单线程吗?

Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程(主线程)来完成

Redis 程序并不是单线程的,会启动后台线程完成关闭文件、AOF 刷盘、释放内存等任务

Redis 为什么这么快

  • 大部分操作都在内存中完成,采用了高效的数据结构,Redis 瓶颈可能是机器的内存大小或者网络带宽,而并非 CPU
  • 单线程模型避免了多线程之间的竞争
  • I/O 多路复用机制,一个线程处理多个 IO 流,减少开销

Redis 6.0 之后为什么引入了多线程

Redis 的性能瓶颈有时会出现在网络 I/O 的处理上,使用多线程加速网络 I/O 的处理

但是对于命令的执行,Redis 仍然使用单线程来处理

引入的多线程 I/O 特性对性能提升至少是一倍以上

Redis 6.0 版本之后,Redis 在启动的时候,默认情况下会创建 6 个线程:

  • Redis-server : Redis的主线程,主要负责执行命令
  • bio_close_file、bio_aof_fsync、bio_lazy_free:三个后台线程,分别异步处理关闭文件任务、AOF刷盘任务、释放内存任务
  • io_thd_1、io_thd_2、io_thd_3:三个 I/O 线程,io-threads 默认是 4 ,所以会启动 3(4-1)个 I/O 多线程,用来分担 Redis 网络 I/O 的压力

Redis 持久化

  • AOF 日志:每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里
  • RDB 快照:将某一时刻的内存数据,以二进制的方式写入磁盘
  • 混合持久化方式:同时使用 AOF 和 RBD

Redis内存满了会发生什么

在 Redis 的运行内存达到了某个阀值,就会触发内存淘汰机制,这个阀值就是我们设置的最大运行内存,此值在 Redis 的配置文件中可以找到,配置项为 maxmemory

Redis 管道有什么用

将多个命令一起发送给redis执行,解决多个命令执行时的网络等待

Redis 事务支持回滚吗?

Redis 中并没有提供回滚机制,DISCARD命令也只是情况命令队列

 |