内存缓存系统memcached与redis实现的对比.docxVIP

内存缓存系统memcached与redis实现的对比.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE 1 PAGE 1 内存缓存系统memcached与redis实现的对比 memcached和redis,作为近些年最常用的缓存服务器,相信大家对它们再熟识不过了。前两年还在学校时,我曾经读过它们的主要源码,如今写篇笔记从个人角度简洁对比一下它们的实现方式,权当做复习,有理解错误之处,欢迎指正。 memcached和redis,作为近些年最常用的缓存服务器,相信大家对它们再熟识不过了。前两年还在学校时,我曾经读过它们的主要源码,如今写篇笔记从个人角度简洁对比一下它们的实现方式,权当做复习,有理解错误之处,欢迎指正。 文中使用的架构类的图片大多来自于网络,有部分图与最新实现有出入,文中已经指出。 一.综述 读一个软件的源码,首先要弄懂软件是用作干什么的,那memcached和redis是干啥的?众所周知,数据一般会放在数据库中,但是查询数据会相对比较慢,特殊是用户许多时,频繁的查询,需要耗费大量的时间。怎么办呢?数据放在哪里查询快?那确定是内存中。memcached和redis就是将数据存储在内存中,根据key-value的方式查询,可以大幅度提高效率。所以一般它们都用做缓存服务器,缓存常用的数据,需要查询的时候,直接从它们那儿获取,削减查询数据库的次数,提高查询效率。 二.服务方式 memcached和redis怎么供应服务呢?它们是独立的进程,需要的话,还可以让他们变成daemon进程,所以我们的用户进程要使用memcached和redis的服务的话,就需要进程间通信了。考虑到用户进程和memcached和redis不一定在同一台机器上,所以还需要支持网络间通信。因此,memcached和redis自己本身就是网络服务器,用户进程通过与他们通过网络来传输数据,明显最简洁和最常用的就是使用tcp连接了。另外,memcached和redis都支持udp协议。而且当用户进程和memcached和redis在同一机器时,还可以使用unix域套接字通信。 三.事件模型 下面开始讲他们详细是怎么实现的了。首先来看一下它们的事件模型。 自从epoll出来以后,几乎全部的网络服务器全都抛弃select和poll,换成了epoll。redis也一样,只不多它还供应对select和poll的支持,可以自己配置使用哪一个,但是一般都是用epoll。另外针对BSD,还支持使用kqueue。而memcached是基于libevent的,不过libevent底层也是使用epoll的,所以可以认为它们都是使用epoll。epoll的特性这里就不介绍了,网上介绍文章许多。 它们都使用epoll来做事件循环,不过redis是单线程的服务器(redis也是多线程的,只不过除了主线程以外,其他线程没有eventloop,只是会进行一些后台存储工作),而memcached是多线程的。redis的事件模型很简洁,只有一个eventloop,是简洁的reactor实现。不过redis事件模型中有一个亮点,我们知道epoll是针对fd的,它返回的就绪事件也是只有fd,redis里面的fd就是服务器与客户端连接的socket的fd,但是处理的时候,需要依据这个fd找到详细的客户端的信息,怎么找呢?通常的处理方式就是用红黑树将fd与客户端信息保存起来,通过fd查找,效率是lgn。不过redis比较特别,redis的客户端的数量上限可以设置,即可以知道同一时刻,redis所打开的fd的上限,而我们知道,进程的fd在同一时刻是不会重复的(fd只有关闭后才能复用),所以redis使用一个数组,将fd作为数组的下标,数组的元素就是客户端的信息,这样,直接通过fd就能定位客户端信息,查找效率是O(1),还省去了复杂的红黑树的实现(我曾经用c写一个网络服务器,就因为要保持fd和connect对应关系,不想自己写红黑树,然后用了STL里面的set,导致项目变成了c++的,最终项目使用g++编译,这事我不说谁知道?)。明显这种方式只能针对connection数量上限已确定,并且不是太大的网络服务器,像nginx这种http服务器就不适用,nginx就是自己写了红黑树。 而memcached是多线程的,使用master-worker的方式,主线程监听端口,建立连接,然后顺序安排给各个工作线程。每一个从线程都有一个eventloop,它们服务不同的客户端。master线程和worker线程之间使用管道通信,每一个工作线程都会创建一个管道,然后保存写端和读端,并且将读端加入eventloop,监听可读事件。同时,每个从线程都有一个就绪连

文档评论(0)

185****9607 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档