文章目录1. Redis 为什么出现1.1 数据库性能瓶颈1.2 为什么需要缓存1.3 Redis 与 MySQL2. Redis 基础概念2.1 Redis 是什么2.2 Redis 的核心特点高性能丰富的数据结构单线程模型I/O 多路复用持久化机制高可用机制2.3 Redis 为什么快重点基于内存单线程避免线程切换I/O 多路复用3. Redis 安装与配置3.1 Redis 安装安装编译环境下载 Redis编译安装3.2 Redis 配置远程访问关闭保护模式后台运行 Redis3.3 启动 Redis3.4 连接 Redis结语1. Redis 为什么出现在互联网系统发展的早期大部分系统通常只依赖关系型数据库例如MySQL来完成数据存储。当系统访问量较低时数据库能够轻松支撑业务需求。 但随着用户规模增长一个问题逐渐暴露数据库扛不住高并发请求。尤其是在电商、社交平台、新闻门户等高访问场景下大量重复查询会给数据库带来巨大压力。Redis 出现的核心原因就是解决数据库性能瓶颈问题。1.1 数据库性能瓶颈关系型数据库如 MySQL虽然功能强大但它并不是为极致高并发场景而设计的。在互联网业务快速增长后数据库通常会遇到三个核心瓶颈。磁盘 IO 性能限制MySQL 的数据通常存储在磁盘中。即使使用B 树索引和Buffer Pool缓存池本质上仍然依赖磁盘IO。而磁盘读取速度远低于内存。存储介质访问速度CPU Cache纳秒级内存RAM微秒级SSD毫秒级机械硬盘更慢因此当请求量增长时磁盘 IO 很容易成为数据库性能瓶颈。例如某个热门博客页面一天可能被访问几十万次。但数据实际上几乎不变。如果每次都查询数据库本质上是在重复消耗数据库资源。高并发导致数据库压力激增数据库连接数是有限的当瞬间涌入大量请求时容易出现连接池耗尽、查询阻塞、响应变慢、数据库宕机。例如电商秒杀场景如果几十万人同时抢购商品请求全部直接访问 MySQL数据库可能瞬间被压垮。热点数据被重复查询在很多系统中存在大量高频访问、低变化的数据。例如用户信息、商品详情、排行榜。这些数据读远远大于写于是工程师想到能不能把经常访问的数据放到更快的位置于是缓存思想Cache诞生了。1.2 为什么需要缓存缓存Cache的核心思想就是将热点数据存储到访问速度更快的介质中减少数据库访问压力。如果没有缓存用户每次发起请求系统都会直接查询数据库引入缓存后系统会先在缓存中查询如果缓存未命中才会查数据库并把结果写到缓存中第二次查询就可以命中缓存了。例如某商品详情原本10万请求 → MySQL引入 Redis 后99999 请求 → Redis 1 次 → MySQL数据库压力骤降。因此 Redis 本质上是一个高性能缓存系统。1.3 Redis 与 MySQL很多初学者容易误解“既然 Redis 这么快为什么不用 Redis 替代 MySQL”原因在于两者解决的问题不同。MySQL 属于关系型数据库能够维持数据持久化、支持事务并且强一致适合用户订单、支付记录等复杂的核心业务数据查询。例如SELECT*FROMordersWHEREamount100ORDERBYcreate_timeDESC;而这类复杂查询Redis 并不擅长。Redis 属于内存型 Key-Value 数据库它基于内存所以查询速度快性能高并发高并且支持丰富的数据结构。适合处理会话管理、排行榜、实时统计等业务。例如INCR article:view:1# 统计文章阅读量Redis 与 Mysql 两者不是竞争关系而是合作关系。Mysql负责”存“而Redis 负责”快“。在现代互联网系统中Redis Mysql是基本的标配架构。![[RedisMySQL 架构.png]]2. Redis 基础概念2.1 Redis 是什么RedisRemote Dictionary Server是一个基于内存的高性能Key-Value 数据库属于NoSQLNot Only SQL数据库的一种。与传统关系型数据库如 MySQL不同Redis 不以“表结构”存储数据而是采用Key-Value键值对的形式组织数据。例如SET username zhangsan GET username其中key是usernamevalue是zhangsan。Redis 的 value 并不仅仅是字符串它支持多种丰富的数据结构String字符串Hash哈希List列表Set集合ZSet有序集合BitmapHyperLogLogGEOStream因此Redis 并不仅仅是一个缓存工具更是一个高性能的数据存储中间件。2.2 Redis 的核心特点Redis 核心特点主要有高性能、数据结构丰富、单线程、i/o多路复用、数据持久化和高可用。高性能Redis 最大的特点就是快。官方测试中Redis 单机每秒可处理十万级以上请求QPS。之所以性能优秀主要原因包括基于内存高效数据结构单线程避免锁竞争I/O 多路复用后面会重点讲 Redis 为什么这么快。丰富的数据结构相比传统 Key-Value 存储系统Redis 提供了非常丰富的数据类型。数据结构典型场景String缓存、计数器Hash用户对象List消息队列Set点赞、共同好友ZSet排行榜这意味着 Redis 不只是缓存还能模拟很多中间件能力。例如排行榜ZADD score_rank 100 tom ZADD score_rank 95 jack点赞系统SADD article:1:likes user001阅读量统计INCR article:view:1因此 Redis 在很多业务场景下既是缓存也是业务组件。单线程模型Redis 在执行命令时核心命令处理采用单线程模型。也就是说同一时间只有一个线程执行命令。很多初学者会疑惑“单线程为什么还能这么快” 实际上Redis 的瓶颈通常不是 CPU而是网络 IO。 采用单线程反而避免了上下文切换、锁竞争和线程同步从而减少性能损耗。例如在多线程环境中多个线程同时修改共享资源需要加锁线程 A 线程 B 线程 C ↓ 加锁而 Redis请求队列 ↓ 单线程执行天然避免线程安全问题。不过需要注意Redis 并不完全是单线程。在 Redis 6 之后命令执行仍然是单线程但网络 IO 已支持多线程。也就是说多线程处理网络请求 ↓ 单线程执行命令因此面试中“Redis 是单线程吗”更准确回答应该是Redis 核心命令执行是单线程但 Redis 6 后网络 IO 已支持多线程。I/O 多路复用Redis 能够高并发处理海量连接一个重要原因是I/O 多路复用机制。简单来说Redis 不会为每个客户端连接都创建一个线程。否则10000 个连接 ↓ 10000 个线程线程切换成本会非常高。Redis 的做法是一个线程同时监听多个连接。当某个连接准备好数据时再去处理它。整体模型多个 Socket ↓ I/O 多路复用器 ↓ Redis 单线程处理命令持久化机制Redis 虽然是内存数据库但并不意味着断电数据一定丢失。 Redis 支持 RDB 快照 和AOF日志用于数据恢复。这一部分后面详细展开。高可用机制单机 Redis 存在风险Redis 挂了 ↓ 系统缓存失效 ↓ 数据库被打爆因此 Redis 提供主从复制Replication实现数据备份。哨兵Sentinel实现故障自动转移。集群Cluster实现横向扩容。保证了高可用 高并发。2.3 Redis 为什么快重点Redis 性能强大的原因本质上可以归结为内存 单线程 I/O 多路复用 高效数据结构基于内存Redis 的数据存储在内存RAM而不是磁盘因此访问速度极快。相比 MySQLMySQL 磁盘 → 数据 Redis 内存 → 数据内存访问速度远高于磁盘。这是 Redis 高性能的根本原因。单线程避免线程切换Redis 使用单线程执行命令避免了锁竞争上下文切换CPU 调度开销提高了执行效率。I/O 多路复用Redis 通过epoll Reactor 模型实现单线程管理海量连接。做到少线程高并发因此Redis 可以做到又简单又快。3. Redis 安装与配置在学习 Redis 数据结构之前我们需要先搭建 Redis 环境并能够成功连接、执行基础命令。本文以Linux 虚拟机CentOS为例进行安装。3.1 Redis 安装安装编译环境Redis 采用 C 语言编写因此需要先安装 GCC 编译工具yuminstallgcc-y安装完成后可以执行gcc-v验证是否安装成功。下载 Redis进入安装目录cd/usr/local下载 Redis 压缩包以 Redis 7.4.1 为例wgethttps://download.redis.io/releases/redis-7.4.1.tar.gz解压tar-zxvfredis-7.4.1.tar.gz为了后续操作方便可以重命名mvredis-7.4.1 redis目录结构如下/usr/local/redis编译安装进入 Redis 目录cdredis执行编译make安装makeinstall安装完成后可执行redis-server-v查看 Redis 是否安装成功。3.2 Redis 配置Redis 的核心配置文件为redis.conf通常需要修改以下配置。远程访问默认情况下 Redis 只允许本机访问。找到bind 127.0.0.1将其注释掉# bind 127.0.0.1关闭保护模式找到protected-mode yes修改为protected-mode no否则远程连接可能失败。后台运行 Redis找到daemonize no修改为daemonize yes这样 Redis 会以守护进程方式运行。3.3 启动 Redis启动服务./redis-server ./redis.conf查看 Redis 进程ps-ef|grepredis如果出现 Redis 进程则说明启动成功。3.4 连接 Redis进入 Redis 客户端./redis-cli测试连接ping如果返回PONG说明 Redis 已成功运行。至此Redis 环境已经安装完成接下来开始学习 Redis 最核心的内容数据类型与底层结构。结语本文主要介绍了Redis 为什么出现Redis 与 MySQL 的关系Redis 的核心特点Redis 为什么快Redis 的安装与基础配置至此我们已经完成 Redis 入门准备。下一篇将进入 Redis 最核心的部分数据类型与底层实现。