我给大家解释一下,分享一些Redis中关于分布式缓存的面试问题(附答案分析)。相信朋友们也应该很关心这个话题。现在就为他们说说吧。
我给大家解释一下,分享一些关于Redis中分布式缓存的面试问题(附答案分析)。相信朋友们也应该很关心这个话题。现在分享一些关于Redis中分布式缓存的面试问题(附答案分析)。边肖还收集了一些相关信息,分享了一些关于Redis中分布式缓存的面试问题(附答案分析)。我希望你看到它们时会喜欢。
本文将与大家分享一些关于Redis中分布式缓存的面试问题的答案。有一定的参考价值,有需要的朋友可以参考一下,希望能帮到大家。
面试问题
redis和memcached有什么区别?redis的线程模型是什么?为什么redis单线程可以支持高并发?
面试官的心理分析
这是问redis时最基本的问题吧?redis一个最基本的内在原理和特点就是redis实际上是一个单线程的工作模型。如果不知道这个,以后玩redis就什么都不知道了吗?
可能面试官会问你redis和memcached的区别,但是memcached是早些年各大互联网公司常用的缓存方案,但是近几年基本都是redis,很少有公司用memcached。【相关推荐:Redis视频教程】
面试问题分析
redis和memcached有什么区别?
Redis支持复杂的数据结构。
与memcached相比,redis拥有更多的数据结构,可以支持更丰富的数据操作。如果您需要一个缓存来支持更复杂的结构和操作,Redis将是一个不错的选择。
Redis本身支持集群模式。
在redis 3 . x 3 . x版本中,可以支持集群模式,但是memcached没有原生集群模式,所以要依靠客户端将数据分片写入集群。
性能比较
因为redis只使用单核,memcached可以使用多核,所以平均来说,每个核上的redis在存储小数据时的性能都比memcached高。但是,在100k以上的数据中,memcached的性能要高于redis。虽然redis最近对存储大数据的性能进行了优化,但还是略逊于memcached。
redis的线程模型
Redis在内部使用文件事件处理程序。这个文件事件处理程序是单线程的,所以redis被称为单线程模型。它使用IO复用机制同时监控多个套接字,并将产生事件的套接字压入内存队列。事件调度器根据套接字上的事件类型选择相应的事件处理程序进行处理。
文件处理程序的结构由四部分组成:
多套接字多路复用程序文件事件调度程序的事件处理程序(连接响应处理程序、命令请求处理程序、命令回复处理程序)
多个套接字可能同时生成不同的操作,每个操作对应一个不同的文件事件,但IO复用器会监听多个套接字,并将生成事件的套接字排队。事件调度器会一次从队列中取出一个套接字,根据套接字的事件类型交给相应的事件处理程序进行处理。
看一下客户端和redis之间的通信过程:
要明白通信是通过socket来完成的,不明白的同学可以先看一下socket网络编程。
首先,当redis服务器进程初始化时,服务器套接字的AE_READABLE事件将与连接响应处理器相关联。
客户端socket01请求连接到redis进程的服务器套接字。此时,服务器套接字会生成一个AE_READABLE事件。IO多路复用器监听服务器套接字生成的事件,并将套接字推入队列。事件调度程序从队列中获取套接字,并将其提供给连接响应处理器。响应处理器将创建一个socket01,它可以与客户端通信,并将socket01的AE_READABLE事件与命令请求处理器相关联。
假设客户端发送设置键值请求,redis中的socket01会生成AE_READABLE事件。IO多路复用器将socket01推入队列。此时,事件调度程序从队列中获取socket01生成的AE_READABLE事件。由于socket01的前一个AE_READABLE事件已经与命令请求处理器相关联,事件调度程序会将该事件交给命令请求处理器进行处理。命令处理器读取socket01的键值,并完成其自身存储器中键值的设置。操作完成后,它会将socket01的AE_WRITABLE事件与命令回复处理程序关联起来。
此时,如果客户端准备好接收返回的结果,redis中的socket01将生成一个AE _ writeable事件,该事件也将被推入队列。事件调度程序将找到相关的命令回复处理程序,命令回复处理程序将向socket01输入此操作的结果。例如,在ok之后,socket01的AE _ writeable事件将与命令回复处理程序解除关联。
这就完成了一次交流。一个关于Redis的通信过程推荐读者阅读Redis设计与实现-黄进行系统的学习。
redis单线程模型为什么效率这么高?
仅记忆操作。核心基于非阻塞IO复用机制。C语言实现一般来说,用C语言实现的程序更接近操作系统,执行速度相对更快。相反,单线程避免了多线程频繁的上下文切换问题,防止了多线程可能带来的竞争问题。面试问题
edis的并发竞争问题是什么,如何解决?你知道redis交易的CAS方案吗?
面试官的心理分析
这也是网上很常见的问题,就是多个客户端同时写一个密钥可能本来就到了的数据,然后数据版本就错了;或者多个客户端同时获得一个修改后的键值,然后写回。只要顺序不对,数据就不对。
而且redis有自己类似CAS的乐观锁解决方案,自然解决了这个问题。
面试问题分析
在某些时候,多个系统实例更新一个键。分布式锁可以基于zookeeper实现。每个系统都通过zookeeper获取分布式锁,以确保同一时间只有一个系统实例可以操作一个键,不允许其他任何人读写。
所有你想写入缓存的数据都在mysql中找到了,而且必须写入mysql。当你写入mysql时,你必须保存一个时间戳。当你从mysql查出来的时候,时间戳也查出来了。
每次写入前,判断当前值的时间戳是否比缓存中值的时间戳新。如果有,可以写,否则不能用旧数据覆盖新数据。
有关编程的更多信息,请访问:编程视频!!
以上是分享Redis中关于分布式缓存的一些面试问题(附答案分析)的细节!
来源:php中文网
标签:声明:本文由用户上传。如有侵权,请联系删除!