阿里JAVA面试题剖析:Redis 和 memcached 有什么区别?redis 的线程模型是什么?

柯里薄雾
• 阅读 335

面试原题

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

面试官心理分析

这个是问 redis 的时候,最基本的问题吧,redis 最基本的一个内部原理和特点,就是 redis 实际上是个单线程工作模型,你要是这个都不知道,那后面玩儿 redis 的时候,出了问题岂不是什么都不知道?

还有可能面试官会问问你 redis 和 memcached 的区别,但是 memcached 是早些年各大互联网公司常用的缓存方案,但是现在近几年基本都是 redis,没什么公司用 memcached 了。

面试题剖析

redis 和 memcached 有啥区别?

  1. redis 支持复杂的数据结构 redis 相比 memcached来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, redis 会是不错的选择。
  2. redis 原生支持集群模式 在 redis3.x 版本中,便能支持 cluster 模式,而 memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。

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

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

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

1.多个 socket

2.IO 多路复用程序

3.文件事件分派器

4.事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

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

阿里JAVA面试题剖析:Redis 和 memcached 有什么区别?redis 的线程模型是什么?

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

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

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

这样便完成了一次通信。


本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。同时我经过多年的收藏目前也算收集到了一套完整的学习资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,希望对想成为架构师的朋友有一定的参考和帮助

需要更详细架构师技能思维导图和以下资料的可以加一下技术交流分享群:“708 701 457”免费获取

阿里JAVA面试题剖析:Redis 和 memcached 有什么区别?redis 的线程模型是什么?
阿里JAVA面试题剖析:Redis 和 memcached 有什么区别?redis 的线程模型是什么?
阿里JAVA面试题剖析:Redis 和 memcached 有什么区别?redis 的线程模型是什么?
阿里JAVA面试题剖析:Redis 和 memcached 有什么区别?redis 的线程模型是什么?

点赞
收藏
评论区
推荐文章
把帆帆喂饱 把帆帆喂饱
3年前
Redis入门
Redis1、Redis概述Redis介绍Redis是一个开源的keyvalue存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset–有序集合)和
亚瑟 亚瑟
4年前
为什么单线程的Redis能支持高并发?
一、Redis为什么是单线程注意:redis单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程。因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万
最新Java大厂高频面试题,看这一篇就够了!
常见resdis面试真题40道(含解析)1.什么是Redis?2.Redis的数据类型?3.使用Redis有哪些好处?4.Redis相比Memcached有哪些优势?5.Memcache与Redis的区别都有哪些?6.Redis是单进程单线程的?7.一个字符串类型的值能存储最大容量是多少?8.Redis
Stella981 Stella981
4年前
Redis 单线程如何处理那么多的并发客户端连接?
为什么Redis是单线程的1.官方答案因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。IO多路复用技术redis采用网络IO多路复用技术来保证在多连接的
Stella981 Stella981
4年前
Linux实战教学笔记45:NoSQL数据库之redis持久化存储(一)
第1章redis存储系统1.1redis概述REmoteDIctionaryServer(Redis)是一个基于keyvalue键值对的持久化数据库存储系统。redis和大名鼎鼎的Memcached缓存服务软件很像,但是redis支持的数据存储类型比memcached更丰富,包括strings(字符串),lists(列
Stella981 Stella981
4年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Wesley13 Wesley13
4年前
PHP面试题2019年阿里巴巴面试题及答案解析
一、单选题(共27题,每题5分)1.Memcache与Redis的比较错误的是?A、Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据;B、Memcache和redis都是只支持单线程;CPU利用方面Memcache和redis部分伯仲C、Memcache只支持keyvalue
Stella981 Stella981
4年前
Redis 总结精讲
本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题
Stella981 Stella981
4年前
Redis全面解析
1、什么是Redis?Redis是BSD协议,是一个高性能的keyvalue非关系型数据库。2、redis单线程问题所谓的单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。redis采用多路复用机制:即多个网络socket复用一个io线程,实际是单个线程通过记录跟踪每一个S
Stella981 Stella981
4年前
Redis和Memcached有什么区别?
那么题主说memcached的事情redis都可以做,那么为什么memcached还有人用?那是因为它们两者并不是完全可以相互替代的,它们也有各自的长短优缺点:MemcachedMemcached的优点:Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、val
Stella981 Stella981
4年前
Redis为什么使用单进程单线程方式也这么快
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。Redis快的主要原因是:1.完全基于内存2.数据结构简单,对数据操作也简单3.使用多路I/O复用模型第一、二点不细讲,主要