欢迎访问凯铧科技有限公司网站! |7X24服务热线:158-0160-3153
  • 阿里云服务器

    简单高效、处理能力可弹性伸缩的计算服务

    了解详情
当前位置:首页 > 常见问题 > 帮助中心 >
redis 和 memcached 有什么区别? 2020-10-09 08:32:46

客户问题:

redis和memcached有什么区别?redis的线程模型是什么?为什么redis单线程却能支撑高并发?

凯铧互联技术回复:

redis最基本的一个内部原理和特点,就是redis实际上是个单线程工作模型, memcached是早些年各大互联网公司常用的缓存方案,但是现在近几年基本都是redis,很少公司用memcached了。

redis和memcached有啥区别?

1、redis 支持复杂的数据结构

redis相比memcached来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, redis会是不错的选择。

2、redis原生支持集群模式

在redis3.x版本中,便能支持cluster模式,而memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。

3、性能对比

由于redis只使用单核,而memcached可以使用多核,所以平均每一个核上redis在存储小数据时比 memcached性能更高。而在100k以上的数据中,memcached性能要高于redis。虽然redis最近也在存储大数据的性能上进行优化,但是比起memcached,还是稍有逊色。

redis 的线程模型

redis内部使用文件事件处理器file event handler,这个文件事件处理器是单线程的,所以redis 才叫做单线程的模型。它采用IO多路复用机制同时监听多个socket,将产生事件的socket压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

多个socket

IO多路复用程序

文件事件分派器

事件处理器(连接应答处理器、命令请求处理器、命令回复处理器) 多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将产生事件的 socket 放入队列中排队,事件分派器每次从队列中取出一个 socket,根据 socket 的事件类型交给对应的事件处理器进行处理。

来看客户端与redis的一次通信过程:

要明白,通信是通过socket来完成的,不懂的同学可以先去看一看socket网络编程。

首先,redis 服务端进程初始化的时候,会将 server socket 的 AE_READABLE 事件与连接应答处理器关联。

客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该 socket 压入队列中。文件事件分派器从队列中获取 socket,交给连接应答处理器。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 AE_READABLE 事件与命令请求处理器关联。

假设此时客户端发送了一个 set key value 请求,此时 redis 中的 socket01 会产生 AE_READABLE 事件,IO 多路复用程序将 socket01 压入队列,此时事件分派器从队列中获取到 socket01 产生的 AE_READABLE 事件,由于前面 socket01 的 AE_READABLE 事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 key value 并在自己内存中完成 key value 的设置。操作完成后,它会将 socket01 的 AE_WRITABLE 事件与命令回复处理器关联。

如果此时客户端准备好接收返回结果了,那么 redis 中的 socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联。

这样便完成了一次通信。关于 Redis 的一次通信过程,推荐读者阅读《Redis 设计与实现——黄健宏》进行系统学习。

为啥 redis 单线程模型也能效率这么高?

纯内存操作。

核心是基于非阻塞的 IO 多路复用机制。

C 语言实现,一般来说,C 语言实现的程序“距离”操作系统更近,执行速度相对会更快。

单线程反而避免了多线程的频繁上下文切换问题,预防了多线程可能产生的竞争问题。


本文适用于:

redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?
 

阿里云代理商凯铧互联提醒您

如果您对阿里云虚拟主机数据有修改、变更等风险操作,务必注意阿里云虚拟主机备份,确保数据安全。

如果您对实例(包括但不限于 ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

 

如果以上回复对您的问题还未能解决,请联系凯铧互联售后技术支持。阿里云代理商凯铧互联提供阿里云服务器/企业邮箱等产品的代购服务,同样的品质,更多贴心的服务,更实惠的价格。阿里云代理商凯铧互联会为您提供一对一专业全面的技术服务,同时还能为您提供阿里云其他产品购买的专属折扣优惠。通过凯铧互联购买可以获得折上折优惠!若您需要帮助可以直接联系我方客服,阿里云代理商凯铧互联专业技术团队为您提供全面便捷专业的7x24技术服务。 电话专线:136-5130-9831,QQ:3398234753。

为什么选择凯铧互联购买阿里云产品:北京凯铧互联科技有限公司(简称凯铧互联)由多名前阿里云资深技术专家创立,核心员工来自阿里巴巴、腾讯服务器运维团队,团队90%的成员均是超过10年具备专业运维经验的精英。作为阿里云,腾讯云,百度云,金山云,华为云重要的合作伙伴,凯铧互联专注于为企业用户提供云计算及云服务器解决方案。公司总部设在北京,并在内蒙设有办事处,服务全国各地企业,与互联网专业公司及主流服务商建立了良好合作关系。

凯铧互联始终坚持帮助企业节省成本、提高效率、创造价值的原则,力求为企业及创业型团队 提供可靠、安全、稳定的运维服务,与之共同成长。做为一家综合性方案商,为用户获得优质服务的同时,秉承"专业规划、周到服务"的服务理念,根据用户的实际情况,充分考虑各种网络资源的特点及功效,为用户量身定做一套适合于其实际应用需求的网络应用方案。帮助用户利用互联网的力量展开新的营销方式,并大大缩短了项目实施周期,获得用户的一致好评!

公司官网:www.bjkaihua.com;腾讯云网站www.bjkaihua.net.cn; 阿里云业务网站:www.alibjyun.com。大家可以扫以下微信,一起交流!

凯铧互联官网微信