尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

01-Redis 基础架构:单线程模型、内存结构、优势与适用场景

01-Redis 基础架构:单线程模型、内存结构、优势与适用场景 Redis 基础架构单线程模型、内存结构、优势与适用场景作者黒漂技术佬 | 系列Redis 缓存与高并发实战一、Redis 是什么RedisRemote Dictionary Server是一个基于内存的 Key-Value 数据库。这句话里有两个关键词“基于内存和Key-Value”。所谓基于内存意思是 Redis 把数据直接存在 RAM内存条里而不是硬盘上。内存的读写速度大约是硬盘的 10 万倍——这就像你从书桌上拿笔内存和跑到隔壁楼的仓库去取笔硬盘的区别。既然数据都在内存里Redis 自然就快得飞起。“Key-Value是一种最简单的数据组织方式每个数据都有一个独一无二的键”Key通过这个键就能找到对应的值Value。就像你用身份证号Key查个人信息Value一对一简单直接。新手提示你平时用的 MySQL 是把数据存在硬盘上的关系型数据库数据按表、行、列组织。Redis 是把数据存在内存里的键值数据库结构更简单速度更快。二、单线程模型一个人干十个人的活Redis 最让人惊讶的设计是它是单线程的。什么意思想象一个餐厅MySQL 像是雇了 10 个厨师每个厨师负责一道菜——这叫多线程。Redis 呢就一个厨师但他手速快到你看不清——这就是单线程。为什么单线程还这么快三个原因纯内存操作数据都在内存里读写不需要等硬盘吱嘎吱嘎转。一次内存读写通常在 100 纳秒级别硬盘则要几毫秒——差了四个数量级。I/O 多路复用这个名词听起来吓人其实就是一个服务员同时盯好几桌客人。操作系统提供了epollLinux/kqueuemacOS等机制Redis 用它来同时监听成千上万个客户端连接。哪个客户端发来请求就处理哪个不会被某个慢客户端拖住。避免上下文切换多线程程序里CPU 要在不同线程之间切来切去上下文切换这个切换本身就要消耗时间。单线程没有这个问题——全部精力都在干活不用开会。一句话总结Redis 的单线程模型 纯内存操作快 I/O 多路复用不傻等 无上下文切换不磨蹭。注Redis 6.0 引入了多线程 I/O但命令执行仍然是单线程的核心逻辑没变。三、Redis 的内存结构打开 Redis 的内部世界主要看这两个东西1. 数据库dictRedis 内部用一张巨大的哈希表Hash Table存所有的 Key-Value。哈希表的特点就是 O(1) 的查找速度——不管数据有多少查一个 Key 的时间几乎是恒定的。你用SET name helloRedis 就把name作为键做一次哈希计算直接定位到内存位置。2. 过期字典expires除了主数据库Redis 还维护一个过期字典专门记录哪些 Key 设置了过期时间。当你执行EXPIRE key 60时Redis 不会把这个过期时间写进主数据里而是单独记在过期字典中。这样做的好处是查找过期 Key 时不需要扫描所有数据只要看这张小纸条就行。四、Redis vs MySQL内存数据库 vs 磁盘数据库维度RedisMySQL存储介质内存硬盘数据结构Key-Value表/行/列读写速度10 万 QPS几千 QPS持久化可选RDB/AOF默认持久查询方式按 Key 精确查SQL支持复杂查询数据容量受内存限制受硬盘限制简单说Redis 负责快MySQL 负责稳。两者不是替代关系而是搭档关系。五、适用场景什么时候用 Redis1. 缓存最高频场景把 MySQL 里的热点数据缓存到 Redis减少数据库压力。比如一个无人售货柜后台每秒钟可能有几百个请求来查3 号柜 5 号货道还有几瓶可乐每次都查 MySQL 太奢侈了。把商品库存信息缓存到 Redis请求直接走内存既快又省资源。2. 计数器文章阅读量、点赞数、设备心跳计数——这些高频写入场景用 Redis 的INCR命令原子递增一毫秒搞定。3. 排行榜游戏积分榜、商品销量榜用 Redis 的 Sorted SetZSet天然支持排序。4. 分布式锁多台服务器同时操作同一个资源时用 Redis 的SETNX实现分布式锁保证同一时间只有一台机器在处理。5. Session 共享多台 Web 服务器共享用户登录状态把 Session 存 Redis 里。六、不适用场景什么时候别用 Redis存大量冷数据比如三年前的订单记录。内存贵没必要把不常用的数据占着。需要复杂 SQL 查询Redis 不支持 JOIN、GROUP BY 这些。复杂查询老老实实用 MySQL/PostgreSQL。数据量超出内存Redis 数据量受物理内存限制虽然可以开虚拟内存但性能会急剧下降。七、无人售货柜场景实战思路假设你在做一个无人售货柜系统Redis 可以这样用商品库存缓存SET cabinet:3:slot:5:stock 10每个货道的库存实时存 Redis用户扫码时前端毫秒级展示。设备状态SET cabinet:3:online 1用EXPIRE设 30 秒过期。设备每 10 秒发心跳更新这个 Key后台如果发现 Key 过期就触发告警。订单幂等用SETNX order:20240730001 processing防止同一订单被重复处理。限流用INCREXPIRE对用户请求频率做限制防止恶意刷单。一个百台售货柜的系统用 Redis 把接口响应从 200ms 压到 5ms用户体验质的飞跃。Redis 就像一个住在内存里的超快管家——它不存老档案但当下最紧急、最频繁的事交给它准没错。理解了这个基础架构后面的各种数据结构、持久化策略就都顺理成章了。
返回列表