尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

理解Redis线程模型

理解Redis线程模型
📅 发布时间:2026/6/18 21:52:39

理解Redis线程模型

一、认识Redis 与 2024 年生态

  1. Redis 是什么?
  • 全称 Remote Dictionary Server,高性能 Key-Value 数据库,支持复杂数据类型(远超简单 K-V 存储)。

  • 核心特点:数据存于内存(高性能)+ 持久化到硬盘(安全性),可作为缓存(Cache)、数据库(Database)、向量搜索(Vector Search)使用。

  1. 2024 年 Redis 生态
  • 产品体系:Redis Cloud(云服务)、Redis Enterprise(企业级收费版)、Redis Insight(官方图形化客户端)、Redis OSS(开源基础版)、Redis Stack(基于 OSS 的扩展技术栈,含高级功能)。

二、Redis 线程模型(核心)

image-20250908194119489

  1. 整体模型:客户端多线程(维护 Socket 连接),服务端核心单线程(处理指令)。

Redis的网络IO和键值对的读写都是由主线程负责的(单线程),而客户端连接、数据持久化(aof/rdb)等都是由单独的子线程异步执行

  1. 版本差异
  • Redis 4.x 及之前:纯单线程。

  • Redis 5.x 及之后(6.x/7.x):核心指令仍单线程,但耗时操作(如 RDB/AOF 持久化、unlink 异步删除、集群同步)由额外线程处理(例:FLUSHALL [ASYNC]支持异步)。

  1. 单线程核心原因
  • CPU 通常不是瓶颈(瓶颈为内存和网络)。

  • 减少线程上下文切换开销,避免资源竞争,简化复杂度。

三、Redis 指令原子性保证机制

机制 特点与使用场景 注意事项
复合指令 单指令完成多操作(如MSET、SETNX、SETEX),天然原子性。 适用于简单批量操作。
事务(MULTI/EXEC) 批量指令排队,EXEC时一次性执行,中间不被其他指令插入。 - 不支持回滚:错误指令不影响其他指令执行;- WATCH机制:监听 key,若修改则事务取消;- DISCARD放弃事务。
Pipeline 客户端批量打包指令发送,减少网络往返时间(RTT),提升效率。 非原子性,可能被其他指令 “插队”;不建议打包过多指令(避免客户端阻塞和服务端内存占用过高)。
Lua 脚本 用 Lua 语言编写自定义逻辑,在服务端原子性执行(单线程特性保证)。 - 避免死循环 / 耗时操作(默认超时 5 秒,超时返回BUSY错误);- 7.x 支持EVAL_RO执行只读脚本(可在备份节点运行,减轻主节点压力);- 热点脚本可缓存到服务端。
Redis Function(7.x+) 预定义函数加载到服务端,可被客户端直接调用,支持函数嵌套复用(优于 Lua 脚本的不可复用)。 - 集群中需手动在各节点加载;- 不建议过多 / 过大函数(占用服务端缓存)。
  1. Lua 脚本是企业级场景首选(支持复杂逻辑 + 原子性),其他机制按需选择。
  2. https://wiki.luatos.com/index.html 这个网站可以学习lua,以及在线执行lua脚本验证语法

事务(MULTI/EXEC)

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> INCR k1
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> EXEC
1) "1"
2) (integer) 2
3) "2"

通过MULTI命令开启一个事务,指令进入排队中(此时命令还未执行),直到EXEC一次性执行所以命令并结束事务,事务中的指令执行无法被插队。

通过watch可以监听指定的key,如果在事务开启期间key被其他客户端修改过,则取消事务的执行。

通过管道Pipe批量执行指令

事先在一个文本中定义好一系列的指令,批量执行

[root@192 ~]# cat cmd.txt | redis-cli -a 1234 --pipe
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 4

不具备原子性,只是批量执行减少网络IO

Lua脚本

lua语言最大的特点是他的线程模型是单线程的模式,通过执行lua脚本同样可以实现指令集的原子执行。

127.0.0.1:6379> help evalEVAL script numkeys [key [key ...]] [arg [arg ...]]summary: Executes a server-side Lua script.since: 2.6.0group: scripting
  • script参数是⼀段Lua脚本程序。

  • numkeys参数⽤于指定键名参数的个数。

  • 键名参数 key [key ...] 表示在脚本中所⽤到的那些Redis键(key)。

  • 那些不是键名参数的附加参数 arg [arg ...] ,可以在Lua中通过全局变量ARGV数组访问, 访问的形式和KEYS变量类似( ARGV[1] 、 ARGV[2]

,诸如此类)。

在lua脚本中,可以使⽤redis.call函数来调⽤Redis的命令

127.0.0.1:6379> eval "local initcount = redis.call('get', KEYS[1])
local a = tonumber(initcount) local b = tonumber(ARGV[1]) if a >= b
then redis.call('set', KEYS[1], a) return 1 end redis.call('set',KEYS[1], b) return 0 " 1 "stock_1" 10

Redis Function

Redis允许我们将一些功能封装为函数,并加载到内存中。这样在lua脚本中就方便很多。

如下定义一个脚本文件mylib.lua

#!lua name=mylib  //指定函数的命名空间
local function my_hset(keys, args)local hash = keys[1]local time = redis.call('TIME')[1]return redis.call('HSET',hash, '_last_modified_', time, unpack(args))
end
redis.register_function('my_hset', my_hset)

将这个函数加载到Redis中:cat mylib.lua | redis-cli -a 1234 -x FUNCTION LOAD REPLACE

四、Bigkey 问题

  1. 定义:占用大量空间的 key(如含 200W 元素的 list、大字符串)。

  2. 风险:单线程处理时易阻塞服务(耗时操作阻塞后续指令)。

  3. 检测工具:客户端指令参数--bigkeys(找元素多的 key)、--memkeys(找占用内存大的 key)。

五、核心总结

  1. Redis 以 “服务端核心单线程” 为基础,兼顾多线程处理非核心操作,平衡性能与复杂度。

  2. 原子性机制需根据场景选择,Lua 脚本是复杂逻辑的首选。

  3. 避免 Bigkey,防止单线程阻塞,影响整体性能。

相关新闻

  • 内核知识地图
  • 文件不只是数据-一份稳健的文件处理指南
  • 【去日本玩了2】跟随空色轨迹一起去日本演出(2025年)

最新新闻

  • 6个免费方法让你的手机视频秒变MP4 - 软件工具教程方法
  • Kali Linux实战:ARP欺骗攻击原理、环境搭建与Wireshark流量分析
  • 杭州靠谱品牌首饰回收排行,光谱验金透明称重全款现结 - 奢品小当家
  • 2026年安徽省合肥市合肥医药卫生学校招生简章官网发布:报名入口+报考指南 - cc江江
  • 武汉钻石回收怎么选?2026年实测合规机构名录 - 薛定谔的梨花猫
  • 机器学习模型上线后如何应对系统性风险与数据漂移

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号