【Redis】 核心知识点全面讲解
大家好我是程序员二叉。简介Redis 是一款开源、基于内存的高性能 Key-Value NoSQL 数据库由 C 语言开发兼顾高速读写与数据持久化能力。它凭借优秀的网络模型、单线程执行架构和优化的数据结构具备超高并发处理能力同时提供丰富的数据类型与分布式配套功能是互联网后端开发中最常用的中间件之一广泛应用于缓存、锁、队列、统计、排行榜等各类业务场景。欢迎点赞收藏关注。一、Redis 是什么Redis 全称 Remote Dictionary Server远程字典服务是一款开源、使用 C 语言编写、基于内存运行的高性能 Key-Value 型 NoSQL 数据库。核心特性数据默认驻留内存读写速度极快同时支持RDB、AOF两种持久化机制服务宕机后可恢复数据。功能丰富原生支持事务、Lua 脚本、发布订阅、主从复制、哨兵模式、集群等高可用能力。数据类型丰富不止基础键值存储还拓展了多种特色数据结构适配各类业务场景。产品定位在互联网项目中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 可以承载上万并发结合底层设计逐一解析CPU 并非性能瓶颈Redis 业务逻辑简单无复杂计算、运算逻辑压力主要集中在网络IO和内存读写单线程完全可以跑满性能CPU 资源始终处于富余状态。IO 多路复用承接海量连接依靠 Epoll 多路复用机制单一线程可同时监听、处理海量客户端 Socket 连接连接数增长不会造成性能断崖式下跌。串行执行无锁开销所有客户端命令按到达顺序排队串行执行不存在多线程争抢资源的问题不需要加锁、解锁省去大量并发控制的性能消耗。无线程上下文切换损耗多线程运行时操作系统会频繁切换线程上下文消耗大量CPU资源单线程全程独占CPU执行任务硬件资源利用率最大化。注意事项单线程模型存在明显短板耗时命令会阻塞整个服务。生产环境禁止使用keys、flushall、超大Value操作等耗时指令。四、Redis 全量数据类型Redis 数据类型分为五大基础类型、三大特殊类型、高级拓展类型覆盖绝大多数业务场景。一五大基础数据类型通用核心1. String 字符串特性二进制安全字符串可存储文本、数字、二进制数据单个 Value 最大限制 512MB常用命令set、get、incr、decr、append适用场景通用缓存、计数器、验证码、分布式 Session、简单键值存储。2. List 列表特性双向有序链表元素可重复、有顺序头尾操作效率极高中间位置查询较慢常用命令lpush、rpush、lpop、rpop、lrange适用场景简易消息队列、用户时间线、粉丝列表、动态列表。3. Set 集合特性无序集合元素唯一不可重复支持交集、并集、差集等集合运算常用命令sadd、smembers、sismember、sinter适用场景好友关系、数据去重、共同好友计算、随机抽奖。4. Hash 哈希特性Key - Field-Value层级结构类比 Java 中的 HashMap适合存储结构化对象常用命令hset、hget、hmset、hgetall适用场景用户信息、商品信息、各类实体对象存储。5. ZSetSorted Set有序集合特性元素唯一每个元素关联一个分数score自动按照分数排序底层由跳表哈希表实现常用命令zadd、zrange、zrank、zrevrank适用场景各类排行榜、延时队列、带权重排序的业务。二三大特殊数据类型功能衍生型1. Bitmap 位图底层依托 String 实现以bit 二进制位为最小单位存储数据内存占用极低常用命令setbit、getbit、bitcount适用场景用户每日签到、在线状态标记、开关类状态统计。2. HyperLogLog专门用于海量数据基数统计统计不重复元素总数特点存在约 0.81% 微小误差但内存极致精简亿级数据仅占用十几KB常用命令pfadd、pfcount适用场景网站UV统计、独立访客计数、海量数据去重统计。3. Geospatial 地理位置用于存储经纬度坐标支持计算两地距离、查询指定范围内的元素底层基于 ZSet 实现常用命令geoadd、geodist、georadius适用场景附近门店、附近的人、外卖/打车定位服务。三高级数据类型Redis 5.0 新增1. Stream 流Redis 官方主推的可靠消息队列支持消息持久化、消息回溯、消费组、消息ACK确认、阻塞读取优势弥补 List 队列消息易丢失、无消费组的缺陷适用场景异步任务、日志收集、事件推送、可靠消息投递。2. Module 扩展类型需加载模块使用属于社区/官方拓展能力需额外安装模块启用JSON原生支持JSON格式读写、路径查询适配复杂JSON对象存储Search全文检索模块实现Redis内部文本搜索能力TimeSeries时序数据类型专门存储监控指标、埋点、时序日志。五、Redis 主流应用场景结合数据类型与底层特性整理生产环境最常用的业务场景1. 热点数据缓存使用频率最高将首页数据、商品详情、接口返回结果、字典常量等热点数据存入Redis设置过期时间。大幅拦截数据库请求减轻 MySQL 压力同时提升接口响应速度。推荐类型String、Hash2. 分布式锁分布式集群环境下保证同一资源同一时间仅被一个线程操作用于下单扣库存、定时任务防重复执行、并发抢单等场景。实现方式set key value nx ex 过期时间原子命令防止死锁。3. 计数器 接口限流计数器文章点赞、阅读量、粉丝数、活动参与次数利用incr自增命令实现限流网关接口防刷、API 限流结合过期时间实现固定窗口/滑动窗口限流。推荐类型String4. 排行榜系统热搜榜单、商品销量榜、游戏战力榜、积分排名等利用 ZSet 分数自动排序特性轻松实现正序、倒序查询。推荐类型ZSet5. 分布式 Session 共享Web 服务集群部署时统一存储用户登录会话信息实现多服务节点 Session 共享。推荐类型String6. 消息队列 异步任务简易队列使用 List 实现适用于短信、邮件等非核心异步任务可靠队列使用 Stream 实现保障消息不丢失、可重试。推荐类型List、Stream7. 地理位置服务外卖骑手定位、同城推荐、附近商家查询、网约车位置检索。推荐类型Geospatial8. 海量数据去重 UV 统计统计页面独立访客、活动独立参与人数海量数据场景下用极小内存完成基数统计。推荐类型HyperLogLog9. 用户签到 状态标记记录用户每日连续签到、账号开关状态、设备在线状态等极致节省内存。推荐类型Bitmap10. 延时队列订单超时自动取消、预约提醒、定时待办任务将时间戳作为 ZSet 的分数轮询取出到期任务执行。推荐类型ZSet11. 发布订阅Pub/Sub实现简单实时消息推送、系统站内通知、直播间临时弹幕。缺点消息无持久化服务断开后消息丢失仅适用于非核心实时通知场景。总结Redis 凭借内存存储、IO多路复用、单线程执行、高效底层数据结构四大核心优势实现了高性能与高并发。它不仅拥有 String、List、Hash、Set、ZSet 五大基础类型还拓展了位图、基数统计、地理位置等特色类型以及 Stream 等高级类型功能覆盖范围极广。在实际开发中Redis 主要用于缓存降库、分布式锁、计数限流、排行榜、消息队列、位置服务等场景。使用时需留意单线程模型的短板规避大Key、耗时命令造成的服务阻塞合理搭配不同数据类型才能充分发挥 Redis 的价值。