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

简介: 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 事件通知 / 回调机制 (新出的, 效率高)

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

热门文章

最新文章