一、Redis是什么?能用来做什么?

Redis全称“远程字典服务”,是一个高性能的Key-Value数据库。它的核心特点是:

  • 数据存在内存里,所以读写速度极快(适合做缓存);
  • 数据会持久化到硬盘,所以数据安全(能当数据库用);
  • 支持复杂数据类型(如列表、哈希等),能实现很多业务场景。

到2024年,Redis已从单一缓存工具发展成“生态服务”:

  • 云服务(Redis Cloud)和企业版(Redis Enterprise);
  • 有官方图形化管理工具(Redis Insight);
  • 分两个版本:基础开源版(Redis OSS)和功能更全的技术栈版(Redis Stack),支持缓存、数据库、向量搜索三大功能。

二、Redis是单线程还是多线程?

这是个经典问题,答案是:整体多线程,核心单线程

  • 客户端连接是多线程:Redis用多线程维护与客户端的网络连接(比如支持上万客户端同时连接)。
  • 核心指令执行是单线程:处理数据读写的“主线程”只有一个,通过“IO多路复用”(类似一个人同时处理多个快递)高效响应多个客户端请求,指令排队串行执行,所以不用考虑MySQL那样的并发问题(如脏读)。

但Redis在进化:

  • 4.x及以前是纯单线程;
  • 5.x后(尤其是6.x、7.x),把耗时操作(如持久化、删除大key、集群同步)交给“额外线程”处理,避免阻塞主线程。
  • 为什么核心还是单线程?因为Redis的瓶颈通常是内存和网络,而非CPU;单线程还能减少线程切换和资源竞争,保持简单高效。

三、如何保证Redis指令的原子性?

“原子性”指指令要么全执行,要么全不执行,不会中途被打断。Redis提供了多种方案:

1. 复合指令

Redis自带一些“多功能指令”,比如MSET(批量设值)、SETNX(不存在才设值),这些指令本身就是原子的(一条指令干多件事,不会被打断)。

2. 事务(MULTI/EXEC)

类似数据库事务,用MULTI开启事务,指令会排队,EXEC一起执行。但不保证“全部成功或全部失败”

  • 如果执行前指令有误(如语法错),整个事务不执行;
  • 如果执行中指令有误(如对字符串用列表操作),错误指令不影响其他指令。

3. Pipeline(管道)

把多个指令打包一次性发给Redis,减少网络往返时间(RTT),提升效率。但不保证原子性,可能被其他客户端指令“插队”,适合批量非复杂操作。

4. Lua脚本

Redis支持用Lua脚本写自定义逻辑,脚本会被单线程执行,天然原子。比如“判断库存是否足够,足够则扣减”的逻辑,可用Lua脚本一次性完成,不会被打断。但要注意:脚本不能有死循环或耗时操作,否则会阻塞Redis。

5. Redis Function(7.x新增)

把常用Lua逻辑封装成“函数”,提前加载到Redis服务端,客户端直接调用。好处是可复用(函数能嵌套调用),适合复杂业务场景。

四、Bigkey问题

“Bigkey”指占用空间特别大的key(如一个列表存200万元素)。由于Redis核心是单线程,操作Bigkey会阻塞主线程,影响性能。

  • 如何发现?客户端可用redis-cli --bigkeys(找元素多的key)或--memkeys(找内存占用大的key)检测。
  • 处理方法:后面课程会详细讲(比如拆分key、异步删除等)。

五、线程模型总结

Redis整体是多线程(处理连接),但核心指令执行是单线程(排队串行)。处理数据读写的“主线程”只有一个,通过“IO多路复用”(类似一个人同时处理多个快递)高效响应多个客户端请求,指令排队串行执行,所以不用考虑MySQL那样的并发问题(如脏读)。这种模型简单高效,避免了复杂的并发问题,甚至能用来解决其他系统的并发控制。但要注意合理使用原子性方案(尤其是Lua脚本),避免Bigkey,才能充分发挥Redis的高性能。

 

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐