redis和memcache学习

本文探讨了Redis为何采用单线程模型,主要原因是内存和网络带宽通常成为瓶颈,而非CPU。虽然在高并发下多线程有优势,但Redis通过异步IO模型和单线程保持高效。同时,多线程操作内存中的数据结构会引入锁机制,降低效率并增加逻辑复杂性。Redis的单线程设计允许几乎无代价地实现原子操作,支持复杂数据结构和Lua脚本,牺牲了并发性来换取功能和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://segmentfault.com/a/1190000009695841

redis单线程

进程和线程的学习

redis为什么是单线程?

因为CPU不是redis的瓶颈,redis的瓶颈最可能是内存和网络带宽。

万一CPU成了redis的瓶颈了或者不想浪费CPU多核,多开几个redis进程


  考虑性能问题的前提是得了解性能的瓶颈在哪。redis 目标就是高性能内存kv存储。 异步io,纯内存操作(持久化逻辑fork),全非阻塞(非耗时)操作,并且不包含复杂计算。
靠开多线程反而会把开销浪费在加锁,miss cache,很多数据结构也不能实现无锁,而且异步服务的状态和设计比较下更复杂。相比较多进程,单线程的模式在性能和代码设计带来的优势更明显


重申一遍,这篇文章不是讲多线程,单线程谁的好坏,而是redis的实现机制,它这样设计有它的架构优势。
Redis采用的是基于内存(速度非常快),高吞吐,其他定义就不扯了。
这取决于你如何定义并发:
并发和并行通常被认为是不同的概念,有什么区别?
1、并发性I/O流,意味着能够让一个计算单元来处理来自多个客户端的流请求。
2、并行性,意味着服务器能够同时执行几个事情(具有多个计算单元),这是不同的。
例如,酒吧能够服务几个顾客,同时他只能一次准备一个饮料。所以他可以提供没有并行性的并发服务。
Redis虽然是单线程程序,但可以通过使用I / O多路复用同一个线程和事件循环在I / O级别上提供并发性。
像Redis这样的高效存储引擎的瓶颈通常是网络,在CPU之上。
因此,Redis原子性(隔离事件循环)在没有额外成本的情况下提供并发性(不需要进程、线程同步),无需支付同步开销。

并行性有一个代价:现在硬件设备都是多核,当然多核速度肯定比单核效率高,但进程线程之间的同步是非常昂贵的。
好比,人家redis只要一台服务器可以搞定的事情,你干嘛一定要让我使用多台服务器。它轻巧,可作为构建高效可扩展的服务器,何必纠结一定要装波音747的发动机(对应的设计比较复杂),redis设计有它自己架构的好处!
官网也说了,要发挥多核CPU性能,可以通过在单机开多个Redis core实例来完善,一样实现分布式;


其次,所谓服务端单线程应该这么理解,即多客户端并发连接的时候,服务器在同一个线程里处理这些请求。但并不是说服务器自己只准开一个线程,有一些线程/进程去处理其他非连接任务也是完全合理的。好像Redis后台持久化是用了额外的线程/进程,时间久了,记得不是很清楚。

单线程指的是网络请求模块使用了一个线程,其他模块用了多个线程。

可能因为用了异步IO模型,单线程的效率已经足够高了。

单线程指的是网络请求模块使用了一个线程,其他模块用了多个线程。

可能因为用了异步IO模型,单线程的效率已经足够高了。

单纯的网络IO来说,量大到一定程度之后,多线程的确有优势——但并不是单纯的多线程,而是每个线程自己有自己的epoll这样的模型,也就是多线程和multiplexing混合。

一般这个开头我们都会跟一个“但是”。
但是。

还要考虑Redis操作的对象。它操作的对象是内存中的数据结构。如果在多线程中操作,那就需要为这些对象加锁。最终来说,多线程性能有提高,但是每个线程的效率严重下降了。而且程序的逻辑严重复杂化。
要知道Redis的数据结构并不全是简单的Key-Value,还有列表,hash,map等等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象,等等。这些操作还可以合成MULTI/EXEC的组。这样一个操作中可能就需要加非常多的锁,导致的结果是同步开销大大增加。这还带来一个恶果就是吞吐量虽然增大,但是响应延迟可能会增加。
Redis在权衡之后的选择是用单线程,突出自己功能的灵活性。在单线程基础上任何原子操作都可以几乎无代价地实现,多么复杂的数据结构都可以轻松运用,甚至可以使用Lua脚本这样的功能。对于多线程来说这需要高得多的代价。

并不是所有的KV数据库或者内存数据库都应该用单线程,比如ZooKeeper就是多线程的,最终还是看作者自己的意愿和取舍。单线程的威力实际上非常强大,每核心效率也非常高,在今天的虚拟化环境当中可以充分利用云化环境来提高资源利用率。多线程自然是可以比单线程有更高的性能上限,但是在今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,这些方案中多线程的技术照样是用不上的,所以单线程、多进程的集群不失为一个时髦的解决方案。

作者:马克思基
链接:https://www.zhihu.com/question/23162208
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值