当前位置: 首页 > news >正文

【Redis】 核心知识点全面讲解

大家好,我是程序员二叉。


简介

Redis 是一款开源、基于内存的高性能 Key-Value NoSQL 数据库,由 C 语言开发,兼顾高速读写与数据持久化能力。它凭借优秀的网络模型、单线程执行架构和优化的数据结构,具备超高并发处理能力,同时提供丰富的数据类型与分布式配套功能,是互联网后端开发中最常用的中间件之一,广泛应用于缓存、锁、队列、统计、排行榜等各类业务场景。欢迎点赞收藏关注。


一、Redis 是什么

Redis 全称 Remote Dictionary Server(远程字典服务),是一款开源、使用 C 语言编写、基于内存运行的高性能 Key-Value 型 NoSQL 数据库。

核心特性

  1. 数据默认驻留内存,读写速度极快,同时支持RDB、AOF两种持久化机制,服务宕机后可恢复数据。
  2. 功能丰富,原生支持事务、Lua 脚本、发布订阅、主从复制、哨兵模式、集群等高可用能力。
  3. 数据类型丰富,不止基础键值存储,还拓展了多种特色数据结构,适配各类业务场景。

产品定位

在互联网项目中,Redis 常被用作分布式缓存、分布式锁、简易消息队列、计数器、排行榜中间件,是后端开发中使用频率极高的基础组件。

二、Redis 高性能的核心原因

Redis 之所以能做到毫秒级响应、支撑高并发请求,核心由四大底层设计决定:

1. 纯内存操作(最核心优势)

所有数据的读写、运算都在内存中完成。传统关系型数据库基于磁盘存储,存在磁盘寻道、扇区读取等机械IO开销,速度很慢;而内存属于电子读写设备,访问延迟极低,这是 Redis 高性能的首要前提。

2. 多路 IO 复用 + 非阻塞网络模型

Linux 环境下基于Epoll、Mac 环境下基于Kqueue实现IO 多路复用
单个线程可以同时监听成千上万条客户端连接,无需为每一个连接单独创建线程,极大节约线程资源,网络请求处理效率大幅提升。

3. 命令执行采用单线程模型

Redis 核心命令执行逻辑为单线程运行:

  • 规避了多线程带来的锁竞争、线程同步、CPU 上下文切换等性能损耗;
  • 所有命令串行执行,天然保证线程安全,无需额外做并发控制。

补充说明:Redis 6.0 及以上版本引入多线程处理网络IO(网络数据读写、协议解析、响应回写),但命令执行依旧保持单线程,不会改变核心执行模型。

4. 底层数据结构深度优化

对外暴露简单易用的数据类型,底层封装了自研+经典高效数据结构,将操作时间复杂度压缩到极致:

  • String:基于 SDS 动态字符串,规避原生C字符串缺陷,预分配内存减少扩容次数;
  • List:基于 quicklist 快速链表,结合压缩列表,兼顾读写性能与内存占用;
  • Hash/Set:底层依托哈希表,增删改查时间复杂度接近 O(1);
  • ZSet:底层使用跳表,相比平衡树实现更简单,范围查询、排序效率优异。

三、单线程模型为何能支撑高并发

不少开发者会疑惑:单线程处理能力有限,为何 Redis 可以承载上万并发?结合底层设计逐一解析:

  1. CPU 并非性能瓶颈
    Redis 业务逻辑简单,无复杂计算、运算逻辑,压力主要集中在网络IO内存读写,单线程完全可以跑满性能,CPU 资源始终处于富余状态。

  2. IO 多路复用承接海量连接
    依靠 Epoll 多路复用机制,单一线程可同时监听、处理海量客户端 Socket 连接,连接数增长不会造成性能断崖式下跌。

  3. 串行执行,无锁开销
    所有客户端命令按到达顺序排队串行执行,不存在多线程争抢资源的问题,不需要加锁、解锁,省去大量并发控制的性能消耗。

  4. 无线程上下文切换损耗
    多线程运行时,操作系统会频繁切换线程上下文,消耗大量CPU资源;单线程全程独占CPU执行任务,硬件资源利用率最大化。

注意事项

单线程模型存在明显短板:耗时命令会阻塞整个服务。生产环境禁止使用keysflushall、超大Value操作等耗时指令。

四、Redis 全量数据类型

Redis 数据类型分为五大基础类型、三大特殊类型、高级拓展类型,覆盖绝大多数业务场景。

(一)五大基础数据类型(通用核心)

1. String 字符串
  • 特性:二进制安全字符串,可存储文本、数字、二进制数据,单个 Value 最大限制 512MB;
  • 常用命令:setgetincrdecrappend
  • 适用场景:通用缓存、计数器、验证码、分布式 Session、简单键值存储。
2. List 列表
  • 特性:双向有序链表,元素可重复、有顺序,头尾操作效率极高,中间位置查询较慢;
  • 常用命令:lpushrpushlpoprpoplrange
  • 适用场景:简易消息队列、用户时间线、粉丝列表、动态列表。
3. Set 集合
  • 特性:无序集合,元素唯一不可重复,支持交集、并集、差集等集合运算;
  • 常用命令:saddsmemberssismembersinter
  • 适用场景:好友关系、数据去重、共同好友计算、随机抽奖。
4. Hash 哈希
  • 特性:Key -> Field-Value层级结构,类比 Java 中的 HashMap,适合存储结构化对象;
  • 常用命令:hsethgethmsethgetall
  • 适用场景:用户信息、商品信息、各类实体对象存储。
5. ZSet(Sorted Set)有序集合
  • 特性:元素唯一,每个元素关联一个分数(score),自动按照分数排序;底层由跳表+哈希表实现;
  • 常用命令:zaddzrangezrankzrevrank
  • 适用场景:各类排行榜、延时队列、带权重排序的业务。

(二)三大特殊数据类型(功能衍生型)

1. Bitmap 位图
  • 底层依托 String 实现,以bit 二进制位为最小单位存储数据,内存占用极低;
  • 常用命令:setbitgetbitbitcount
  • 适用场景:用户每日签到、在线状态标记、开关类状态统计。
2. HyperLogLog
  • 专门用于海量数据基数统计(统计不重复元素总数);
  • 特点:存在约 0.81% 微小误差,但内存极致精简,亿级数据仅占用十几KB;
  • 常用命令:pfaddpfcount
  • 适用场景:网站UV统计、独立访客计数、海量数据去重统计。
3. Geospatial 地理位置
  • 用于存储经纬度坐标,支持计算两地距离、查询指定范围内的元素;底层基于 ZSet 实现;
  • 常用命令:geoaddgeodistgeoradius
  • 适用场景:附近门店、附近的人、外卖/打车定位服务。

(三)高级数据类型(Redis 5.0+ 新增)

1. Stream 流
  • Redis 官方主推的可靠消息队列,支持消息持久化、消息回溯、消费组、消息ACK确认、阻塞读取;
  • 优势:弥补 List 队列消息易丢失、无消费组的缺陷;
  • 适用场景:异步任务、日志收集、事件推送、可靠消息投递。
2. Module 扩展类型(需加载模块使用)

属于社区/官方拓展能力,需额外安装模块启用:

  • JSON:原生支持JSON格式读写、路径查询,适配复杂JSON对象存储;
  • Search:全文检索模块,实现Redis内部文本搜索能力;
  • TimeSeries:时序数据类型,专门存储监控指标、埋点、时序日志。

五、Redis 主流应用场景

结合数据类型与底层特性,整理生产环境最常用的业务场景:

1. 热点数据缓存(使用频率最高)

将首页数据、商品详情、接口返回结果、字典常量等热点数据存入Redis,设置过期时间。大幅拦截数据库请求,减轻 MySQL 压力,同时提升接口响应速度。
推荐类型:String、Hash

2. 分布式锁

分布式集群环境下,保证同一资源同一时间仅被一个线程操作,用于下单扣库存、定时任务防重复执行、并发抢单等场景。
实现方式set key value nx ex 过期时间原子命令,防止死锁。

3. 计数器 & 接口限流

  • 计数器:文章点赞、阅读量、粉丝数、活动参与次数,利用incr自增命令实现;
  • 限流:网关接口防刷、API 限流,结合过期时间实现固定窗口/滑动窗口限流。
    推荐类型:String

4. 排行榜系统

热搜榜单、商品销量榜、游戏战力榜、积分排名等,利用 ZSet 分数自动排序特性,轻松实现正序、倒序查询。
推荐类型:ZSet

5. 分布式 Session 共享

Web 服务集群部署时,统一存储用户登录会话信息,实现多服务节点 Session 共享。
推荐类型:String

6. 消息队列 & 异步任务

  • 简易队列:使用 List 实现,适用于短信、邮件等非核心异步任务;
  • 可靠队列:使用 Stream 实现,保障消息不丢失、可重试。
    推荐类型:List、Stream

7. 地理位置服务

外卖骑手定位、同城推荐、附近商家查询、网约车位置检索。
推荐类型:Geospatial

8. 海量数据去重 & UV 统计

统计页面独立访客、活动独立参与人数,海量数据场景下用极小内存完成基数统计。
推荐类型:HyperLogLog

9. 用户签到 & 状态标记

记录用户每日连续签到、账号开关状态、设备在线状态等,极致节省内存。
推荐类型:Bitmap

10. 延时队列

订单超时自动取消、预约提醒、定时待办任务,将时间戳作为 ZSet 的分数,轮询取出到期任务执行。
推荐类型:ZSet

11. 发布订阅(Pub/Sub)

实现简单实时消息推送、系统站内通知、直播间临时弹幕。

缺点:消息无持久化,服务断开后消息丢失,仅适用于非核心实时通知场景。


总结

Redis 凭借内存存储、IO多路复用、单线程执行、高效底层数据结构四大核心优势,实现了高性能与高并发。它不仅拥有 String、List、Hash、Set、ZSet 五大基础类型,还拓展了位图、基数统计、地理位置等特色类型,以及 Stream 等高级类型,功能覆盖范围极广。

在实际开发中,Redis 主要用于缓存降库、分布式锁、计数限流、排行榜、消息队列、位置服务等场景。使用时需留意单线程模型的短板,规避大Key、耗时命令造成的服务阻塞,合理搭配不同数据类型,才能充分发挥 Redis 的价值。

http://www.jsqmd.com/news/926517/

相关文章:

  • 从热敏到针式:手把手教你为单片机项目选配合适的微型打印机模块
  • Cortex-A7 L2缓存电源管理机制与优化策略
  • 手把手教你给Ubuntu虚拟机“增肥”:从开机卡住到流畅运行的完整磁盘扩容指南
  • OSPF综合练习
  • 语言超详细系统学习路线(2025年最新)
  • 动手实践:如何用现代仿真软件(如Multisim)搭建一个简易的PDM中波发射机原理模型
  • SCREME框架:低成本高可靠内存ECC技术解析
  • 2026年q2西安学校灭四害公司专业选型技术推荐:西安灭老鼠公司电话/西安灭蟑螂公司/排行一览 - 优质品牌商家
  • 别再只会复制代码了!手把手教你从STM32F407手册出发,搞懂CubeMX定时器PWM配置(附TB6612驱动避坑)
  • 统信UOS 1070安装后必做的10件事:从软件商店到AI助手,快速上手新系统
  • 告别状态机!在STM32单片机上用Protothread协程库实现异步LED闪烁(附完整代码)
  • 用 Agent 构建个人知识管理系统的完整方案
  • 2026火锅店划算底料供应商实测:火锅底料怎么选商用/火锅底料批发/火锅店专用底料/三家厂商核心维度对比 - 优质品牌商家
  • 用Unity Toggle做个游戏设置菜单:手把手实现音效开关、画质选项与导航逻辑
  • 保姆级教程:装完Ubuntu20.04没WiFi?手把手教你搞定驱动和内核更新
  • LangGraph工作流引擎深度剖析:状态持久化与循环控制的工程实践
  • 2026年6月新消息:防火检测服务商深度盘点与联系方式指南 - 2026年企业资讯
  • 2026年第二季度靠谱的合肥离婚打官司律师哪位靠谱?深度剖析与选择指南 - 2026年企业资讯
  • 你的BetaFlight电流为啥总不准?从采样电路到代码,一次讲清所有硬件‘坑’
  • Windows Server 2022组策略实战:从桌面管理到IE配置,一份给运维新手的保姆级清单
  • 火锅底料批量采购技术全解析:适配多场景的选型与风控 - 优质品牌商家
  • Skill 是什么?——AI Agent 的“技能包“
  • 2026年可靠的鸿鱼锌锡合金钻尾螺丝哪家好?深度解析行业优选 - 2026年企业资讯
  • 推荐系统能耗分析与绿色优化实践
  • 2026湖州工业气体权威机构排行:萧山,湖州,绍兴,绍兴特种气体/黄山丙烷/黄山二氧化碳/合规与实力双维度盘点 - 优质品牌商家
  • 2026现阶段河北镀锌网片定做厂家选择与价值深度剖析 - 2026年企业资讯
  • 通达信.lc1文件格式全解析:从二进制字节到可读的K线数据(Python/Pandas实战)
  • 国内氩气供应厂商排行:兼顾性价比与合规标准 - 优质品牌商家
  • WSL2多Ubuntu环境配置避坑全记录:从用户权限设置到磁盘路径规划
  • 别再死记硬背命令了!用CentOS 7.9实战GlusterFS三种卷(分布式/复制/分布式复制)的选型与性能对比