redis-学习笔记(redis 单线程模型)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis-学习笔记(redis 单线程模型)

redis 在宏观上是多线程运行, 在微观上是单线程模型

什么是线程安全问题

多线程中, 会出现多个线程同时对一个变量进行操作(如自增), 那么两次操作之后, 可能会出现结果不准确的情况(比如两次自增只让该变量的值+1, 而非+2)

redis 中不存在线程安全问题

redis 只使用一个线程, 来处理所有命令请求, 所以当多个请求同时到达 redis 服务器, 这些请求会在队列中排队, 再等待 redis 服务器 一个一个将队列里的请求取出执行, 因此, 微观上讲, redis 服务器是串行 / 顺序执行这多个命令的.

redis 能够使用单线程模型很好工作的原因

redis 的核心业务逻辑, 都是短平快的, 不太消耗 cpu 资源, 因此也就不太吃多核了

(老板向员工分派任务, 只要说你去整理一下报表, 具体表的结构, 内容, 整理方式 etc, 不需要老板再给你详细说了吧, 那只是分一下任务, 自然短 - 平 - 快 !)

redis 使用单线程模型效率仍然很高, 速度仍然很快的原因 (参照物是数据库 mysql, Oracle, sql server …)

  1. redis 访问内存. 数据库则是访问硬盘.
  2. redis 的核心功能, 比数据库的核心功能更简单
  3. 单线程模型, 避免了一些不必要的线程竞争开销
  4. 处理网络 IO 的时候, 使用了 epoll 这样的 IO多路复用机制

什么是 IO 多路复用机制

一个线程可以管理多个 socket

对 TCP 来说, 服务器每服务一个客户端, 就会分配一个 socket 给客户端

但是同一时间只有少数 socket 是活跃的

如果使用一个线程来管理一个 socket , 那么大多数时间都会是静默的

因此 我们可以使用一个线程来处理多个 socket, 这就是 IO 多路复用

Linux 上提供 IO 多路复用, 主要是三套 API

select 轮询, 挨个查看, 该事件会不会被调用

poll

epoll 事件通知 / 回调机制 (新出的, 效率高)

目录
相关文章
|
4月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
4月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
11月前
|
监控 NoSQL 安全
如何在 Redis 中正确使用多线程?
【10月更文挑战第16天】正确使用 Redis 多线程需要综合考虑多个因素,并且需要在实践中不断摸索和总结经验。通过合理的配置和运用,多线程可以为 Redis 带来性能上的提升,同时也要注意避免可能出现的问题,以保障系统的稳定和可靠运行。
302 2
|
11月前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
252 1
|
6月前
|
缓存 NoSQL 中间件
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
173 6
|
9月前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
159 1
|
11月前
|
并行计算 JavaScript 前端开发
单线程模型
【10月更文挑战第15天】
|
11月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
149 1
|
11月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
265 0
|
4月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?