Redis核心揭秘:内存提速原理×六大特性×实战指令×过期策略,一键解锁高性能缓存
发布时间:2026/9/8 20:05:55 作者:尧图编辑部 阅读量:1,286

本篇摘要介绍Redis定义、特性与优势详述Ubuntu安装步骤解析基础命令、客户端形态及key过期策略对比MySQL并总结应用场景与认知提升。欢迎拜访点击进入博主主页本篇主题Redis的六大特性×实战指令×过期策略制作日期2025.09.05隶属专栏点击进入所属Redis专栏一. redis背景介绍1. Redis 定义与核心特点定义Redis 是一个在内存中存储数据的中间件用作缓存支持分布式系统并具备良好扩展性。数据结构支持字符串string、哈希hashes、列表lists、集合sets、有序集合sorted sets、流streams等。对比 MySQLMySQL 主要通过“表”关系型存储数据Redis 主要通过“键值对”非关系型存储数据。键值对Key 通常是字符串stringvalue 可以是上述各种数据结构。主打特点就是快(例如⾕歌公司给出的各层级硬件执⾏速度):2. Redis 的特性优点A. 内存数据结构 (In-memory data structures)数据主要存储在内存中提供高速访问。B. 可编程性 (Programmability)支持服务器端脚本Server-side scripting特别是使用 Lua 语言。除了交互式命令行操作还可以通过 Lua 脚本批量执行操作可带逻辑判断。Lua 是一种编程语言官方称其为“胶水”语言。C. 可扩展性 (Extensibility)提供 API允许开发者编写自定义扩展。扩展本质上是动态链接库DLL可以增强 Redis 功能如新的数据结构、命令。示例Redis 自身已提供丰富功能扩展可进一步定制。D. 持久化 (Persistence)如图默认数据存储在内存中但支持将数据持久化到磁盘。目的防止进程退出或系统重启导致数据丢失。机制RDB (快照)定期将内存中的数据备份到磁盘文件。AOF (日志)记录所有写操作命令重启时重新执行这些命令恢复数据。持久化策略旨在平衡性能和数据安全性。E. 集群 (Clustering)支持分布式集群部署。通过哈希分片hash-based sharding将数据分布在多个节点上。支持自动重分片automatic repartitioning方便集群扩容水平扩展类似“分库分表”。单个 Redis 实例存储容量受限于内存大小。F. 高可用性 (High availability)如图支持主从复制Replication with automatic failover。通过配置多个从节点slave/replica来备份主节点master数据。主节点故障时可以从节点自动或手动提升为主节点保证服务不中断。G.实时数据存储Real - time data store把 Redis 当作数据库在大多数情况下考虑数据持久化优先考虑 RDB因其“快”。H.缓存Caching使用 MySQL 缓存如 Redis采用二八原则把热点数据存出来存储在 Redis 中。Redis 存的都是热数据全量数据可以以 MySQL 为主的存储即使 Redis 数据丢失了还可以从 MySQL 恢复回来。I.消息队列Streaming messaging基于消息队列可以实现一个异步化的生产者 - 消费者模型。例如在分布式系统中服务与服务之间通信时有时需要用到生产者和消费者模型如电商场景中的订单处理等。业界有很多成熟的消息队列如 RabbitMQ、Kafka、RocketMQ 等Redis 也能实现消息队列功能在一些对消息队列功能要求不是特别高并且不想引入额外依赖的场景下Redis 可以作为一个选择。K.Session 存储Session storage之前 session 是存储在应用服务器上的通过在 cookie 中实现用户身份信息的保存需要 session 配合只是在浏览器这边存储了一个用户的身份标识 sessionId服务端真正存储了用户数据。3. 为什么 Redis 快数据存储数据主要在内存中操作。操作逻辑核心功能基于相对简单的操作如增删改查特定数据结构。I/O 模型使用 I/O 多路复用技术epoll/kqueue能高效管理大量并发连接socket。线程模型Redis 本身是单线程模型处理命令请求的核心逻辑是单线程。优点避免了多线程间的锁竞争和上下文切换开销。资源利用多核 CPU 可以通过启动多个 Redis 实例来充分利用。澄清虽然核心命令处理是单线程但某些后台任务如持久化、集群节点间通信可能会使用额外线程。但其处理用户请求的核心逻辑是单线程的因此不会因为多核CPU而“吃掉很多CPU”。4.客户端与服务端交互过程相关问题及解决方案负载均衡下 session 问题问题在负载均衡场景下同一个用户的请求可能被分配到不同服务器导致 session 不一致。解决方案办法一让负载均衡器把同一个用户的请求始终调度到同一个机器上不能轮询了而是要通过 userid 之类的方式来分配机器。办法二把 session 数据单独拿出来放到一组独立的机器上存储Redis应用程序重启了session 不丢失。Redis 使用限制Redis 不能做的事情存储大规模数据。学习与认知提升一方面对于分布式系统有了一个初步的认识不同业务场景下分布式系统的实践方式差异很大。另一方面对于 Redis 也有了一个基本的认识Redis 是一个使用内存存储数据的中间件一般被作为内存数据库/缓存/消息队列来使用。二. 如何进行基于linux的Ubuntu 20.04 上安装 Redis切换用户先切换到root用户也可通过su命令切换到root需输入 root 密码。搜索 Redis 相关软件包使用apt命令来搜索 Redis 相关的软件包即执行apt search redis。安装 Redis执行apt install redis命令完成 Redis 的安装。修改配置文件按需调整cd /etc/redis vim redis.conf若需限制 Redis 只监听本地回环地址127.0.0.1可手动修改配置文件里的 IP 绑定配置项protected - mode no表示关闭保护模式让 Redis 可以接受外部连接需根据实际安全需求决定是否修改。重启 Redis 服务执行service redis - server restart命令重启 Redis 服务使配置生效。连接与测试 Redis使用 Redis 自带的客户端连接执行redis - cli进入交互式命令行也可以redis -h ip -p 端口指定启动—这里我们还是访问的是当下ip对的服务器上的同一个redis实例测试连通性在客户端里执行ping若返回PONG则表示连接正常退出客户端按ctrl d即可退出 Redis 客户端。由于连接的 Redis 服务位于本地回环地址127.0.0.1且使用的默认端口为6379因此在连接时可以省略-h {host}主机地址和-p {port}端口号参数直接使用redis-cli命令即可完成连接。三.基于Redis认识Redis 基础概念与架构Redis 是一个客户端 - 服务器结构的程序和 MySQL 类似。Redis 客户端和服务器可在同一主机也能在不同主机当前阶段一般在一台机器上即客户端和服务端在同一机器。架构示意Redis 服务器负责存储和管理数据通过网络接收多个 Redis 客户端的请求并响应。Redis 客户端形态图形化界面客户端桌面程序、web 程序像这类图形化工具依赖 Windows 系统未来实际工作中若用办公 Windows 系统连接服务器可能会有请求限制且自己电脑上的图形化界面客户端不一定能连上公司服务端 Redis类似 MySQL 可能受限。基于 Redis API 自行开发客户端工作中主要形态非常类似 MySQL 的 C 语言 API 和 JDBC属于自定义开发客户端与 Redis 交互。Redis “快” 的相对性Redis 的快是相对于 MySQL 这类关系型数据库而言。但如果和直接操作内存如应用程序里直接搞个哈希表存数据比Redis 没优势甚至更慢。Redis 使用场景思考要结合实际需求判断是否用 Redis比如引入 Redis 有网络延迟等缺点但也有优势数据单独存储、后续扩容方便等未来扩展成分布式系统时用 Redis 更合适。四.Redis的一些基本全局指令注:可以使用单引号 双引号 或者没有 不区分大小写。1. SET 命令作用设置键值对存在则覆盖不存在则新建。示例SET daweidai liangzi把键daweidai的值设为liangzi。2. GET 命令作用获取指定键的值键不存在返回空。示例GET daweidai返回之前SET的liangzi若键不存在则返回空nil。3. KEYS 命令作用按模式匹配查找键也就是查找key生产环境少用会遍历所有键影响性能。通配规则h?llo?匹配单个字符能匹配hello、hallo等。h*llo*匹配多个字符能匹配hll o、heeeello等。h[ae]llo[]内任一字符能匹配helloe、halloa不匹配hillo。h[^e]llo[^]内取反能匹配halloa、hbllob不匹配hello。h[a - b]llo-表示范围能匹配halloa、hbllob 。注意keys*的风险时间复杂度与性能影响keys *这类命令时间复杂度是 O(N)当 Redis 中 key 很多时执行会特别耗时。而 Redis 是单线程模型一旦keys *长时间阻塞就无法处理其他客户端请求导致服务不可用。生产环境的连锁风险Redis 常用来做 MySQL 缓存、减轻数据库压力。如果keys *把 Redis 堵死大量请求会直接打到 MySQL容易造成 MySQL 也扛不住、甚至宕机进而拖垮整个系统。4.exists 命令功能判定 key 是否存在。语法EXISTS key [key ...]返回值key 存在的个数。应用场景针对多个 key 来说非常有用。时间复杂度O(1)补充说明Redis 是键值对存储的体系类似于哈希表key 是唯一的Redis 支持很多数据结构自身的这个键值对是通过哈希表的方式来组织的Redis 具体的某个值又可以是一些数据结构Redis 组织这些 key 就是按照哈希表的方式来组织的。5. del 命令功能删除指定的 key。语法DEL key [key ...]返回值被删除 key 的个数。时间复杂度O(1)应用场景可以一次删除一个或者多个。补充说明之前学 mysql 的时候当时强调删除类的操作drop database、drop table、delete from … 都是非常危险的一旦删除了之后数据就没了。6. expire 命令功能作用是指定 key 的过期时间前提必须存在key。语法EXPIRE key seconds返回值设置成功返回 1设置失败返回 0。时间复杂度O(1)应用场景很多业务场景是有时间限制的如手机验证码 —— 该验证码 5 分钟内有效点外卖、优惠券 —— 在指定时间之内有效。基于 Redis 实现分布式锁为了避免出现不能正确解锁的情况通常都会在加锁的时候设置一下过期时间所谓的给锁设置过期时间就是给 redis 写一个特殊的 key value。补充说明对于计算机来说秒是一个非常长的时间。此处的设定过期时间必须是针对已经存在的 key 设置。时间复杂度也是 O(1)。ttl key查看当前 key 的过期时间还剩多少单位是秒。7.type 命令总结功能返回 key 所存储的 value 的数据类型。语法TYPE key返回值string字符串类型list列表类型set集合类型zset有序集合类型hash哈希类型nonekey 不存在时间复杂度O(1)8.ttl 命令总结功能查看指定 key 的剩余生存时间单位秒。语法TTL key返回值剩余秒数正整数key 设置了过期时间且未过期-1key 存在但未设置过期时间-2key 不存在或已过期时间复杂度O(1)补充说明与PTTL命令类似但PTTL返回的是毫秒级时间常用于监控 key 的生命周期或调试过期逻辑。其他知识补充客户端-服务器通信Redis 基于网络通信客户端与服务器分离数据传输需逐层封装/解封类似快递包装/拆包效率低于直接操作内存且客户端与服务器可能相距较远。单线程模型Redis 为解决网络通信效率问题支持单次操作多个 key提升性能。Redis 与 MySQL 数据存储对比作为缓存Redis 存热点数据全量在 MySQL删少量 key 影响小删大量热点数据可能导致请求直接冲击 MySQL 甚至引发故障作为数据源删数据影响极大作为缓存队列删数据影响需具体分析。五.基于生成环境介绍办公环境入职后公司配备的电脑有笔记本或台式机当前办公电脑。开发环境有时与办公环境相同有时是单独服务器。前端开发环境多为办公环境后端常为单独服务器部分后端程序编译耗时久、启动资源需求大。测试环境供测试工程师使用。线上/生产环境外网用户可访问出现问题影响用户使用和公司营收操作需谨慎上线情况是程序员重要考核指标 。六. Redis的key过期策略分析Redis Key 过期策略的核心问题与解决方案核心问题Redis 中可能存在大量设置了过期时间的 key若直接遍历所有 key 检查是否过期效率极低类似“大海捞针”会严重影响性能。整体策略定期删除 惰性删除结合使用定期删除Redis周期性非实时地从所有 key 中随机抽取一部分进行过期检查若发现过期则直接删除。目的是通过“抽样清理”减少全量扫描的开销但无法保证所有过期 key 都被及时处理。惰性删除当客户端访问某个 key 时Redis 会先检查该 key 是否已过期若未过期正常返回 value若已过期则立即删除该 key 并返回 nil类似“用时才检查并清理”。依赖用户访问触发避免了对未访问 key 的无效检查。策略效果与残留问题两种策略结合后仍可能有部分过期 key 残留定期删除未抽到、惰性删除未被访问触发。这些残留 key 会占用内存但 Redis 通过额外的内存淘汰策略进一步清理无用数据。未采用定时器方式的原因关键Redis 是单线程模型主要任务是处理客户端命令请求若通过定时器频繁扫描过期 key可能阻塞正常命令处理类似执行KEYS *命令导致服务卡顿。打破设计初衷Redis 作者早期坚持单线程架构引入多线程定时器会破坏其简单高效的初衷单线程避免了锁竞争和上下文切换。定时器实现方案补充知识Redis 未采用但需了解基于优先级队列堆的定时器原理将所有设置了过期时间的 key 按过期时间排序类似“紧急程度”放入优先级队列队首是最早过期的 key。操作分配一个线程专门检查队首 key 的过期时间若未过期其他 key 更不会过期无需遍历线程可休眠至接近过期时间再唤醒若已过期则删除该 key 并处理下一个队首 key。优势避免全量扫描只需关注队首 key节省 CPU 开销支持动态调整检查频率如新任务到达时重新计算等待时间。基于时间轮的定时器原理将时间划分为多个小段如每 100ms 一个格子每个格子挂载一个链表存储该时间段内要过期的任务key。操作通过一个指针循环移动每到达一个格子时触发该格子内所有任务的过期处理如删除过期 key。优势任务分配均匀时间复杂度低适合高并发场景如大量 key 同时过期。也就是基于时间转动如果发现新来了插入过期key就根据当前指针位置以及对应的间隔时间往对应位置添加如果不够了就继续转。Redis 的实际选择Redis未采用上述定时器方案而是通过定期删除 惰性删除的组合实现过期管理并依赖事件循环机制处理其他任务如网络 I/O、命令执行。原因可能与单线程架构的简洁性、避免多线程复杂度有关优先保证高性能和低延迟。七.本篇小结本篇学习了redis表面认识以及一些全局常见指令使用及对应策略后面将继续更新对应的数据类型相关知识。