作家
登录

Redis 和 Memcached 的区别大吗?只选一个做缓存我们该选哪个?

作者: 来源: 2017-11-14 09:09:42 阅读 我要评论

Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践


懂得过两者的同窗有那么个大年夜致的印象:

Redis 和 Memcached 的差别大年夜吗?只选一个做缓存我们钙揭捉?哪个?

1、redis与memcached比拟,比仅支削发单的key-value数据类型,同时还供给list,set,zset,hash等数据构造的存储;

3、redis支撑数据的持久化,可以将内存中的数据保持在磁盘中,重启的时刻可以再次加载进行应用等等。

Memcached应用预分派的内存池的方法,应用slab和大年夜小不合的chunk来治理内存,Item根据大年夜小选择合适的chunk存储,内存池的方法可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方法也会带来必定程度上的空间浪费,并且在内存仍然有很大年夜空间时,新的数据也可能会被剔除,原因可以参考Timyang的文┞仿:http://timyang.net/data/Memcached-lru-evictions/

这似乎看起来redis比memcached加倍牛逼一些,那么事实上是不是如许的呢?存期近合理,我们来根据几个不合点来一一比较一下。

收集IO模型

memcached是多线程,非浊宣IO复竽暌姑的收集模型,分为监听主线程和worker子线程,监听线程监听收集连接,接收请求后,将连接描述字pipe传递给worker线程,进行读写IO,收集层应用libevent封装的事宜库,多线程模许可以发挥多核感化,然则惹人了cache coherency和锁的问题,比如:memcached最常用的stats敕令,实际memcached所有操作都要对这个全局变量加锁,进行技巧等工作,带来了机能损耗。

redis应用单线程的IO复竽暌姑模型,本身封装了一个简单的AeEvent事宜处理框架,重要实现了epoll, kqueue和select,对于单存只有IO操作来说,单线程可以将速度优势发挥到最大年夜,然则redis也供给了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型施加会严重影响整体吞吐量,CPU计算过程中,全部IO调剂都是被壅塞的。

2、redis支撑数据的备份,即master-slave模式的数捷报份;

数据支撑类型

memcached应用key-value情势存储和拜访数据,在内存中保护一张巨大年夜的HashTable,使得对数据萌芽的时光复杂度降低到O(1),包管了对数据的高机能拜访。

正如开篇所说:redis与memcached比拟,比仅支削发单的key-value数据类型,同时还供给list,set,zset,hash等数据构造的存储;具体可以翻阅《Redis内存应用优化与存储》

Redis 和 Memcached 的差别大年夜吗?只选一个做缓存我们钙揭捉?哪个?

内存治理机制

对于像Redis和Memcached这种基于内存的数据库体系来说,内存治理的效力高低是影响体系机能的关键身分。传统C说话中的malloc/free函数是最常用的分派和释放内存的办法,然则这种办法存在着很大年夜的缺点:起首,对于开辟人员来说不匹配的malloc和free轻易造成内存泄漏;其次频繁调用会造成大年夜量内存碎片无法收受接收从新应用,降低内存应用率;最后作为体系调用,其体系开销远弘远年夜于一般函数调用。所以,为了进步内存的治理效力,高效的内存治理筹划都不会直接应用malloc/free调用。Redis和Memcached均应用了自身设计的内存治理机制,然则实现办法存在很大年夜的差别,下面将会对两者的内存治理机制分别进话旧绍。

Redis 和 Memcached 的差别大年夜吗?只选一个做缓存我们钙揭捉?哪个?

当Memcached接收到客户端发送过来的数据时起首会根据收到数据的大年夜小选择一个最合适的Slab Class,然后经由过程萌芽Memcached保存着的该Slab Class内余暇Chunk的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过时或者丢弃时,该记录所占用的Chunk就可以收受接收,从新添加到余暇列表中。大年夜以上过程我们可以看出Memcached的内存治理制效力高,并且不会造成内存碎片,然则它最大年夜的缺点就是会导致空间浪费。因为每个Chunk都分派了特定长度的内存空间,所以变长数据无法充分应用这些空间。如图 所示,将100个字节的数据缓存到128个字节的Chunk中,残剩的28个字节就浪费掉落了。

Redis的内存治理重要经由过程源码中zmalloc.h和zmalloc.c两个文件来实现的。Redis为了便利内存的治理,在分派一块内存之后,会将这块内存的大年夜小存入内存块的头晨。如图所示,real_ptr是redis调用malloc后返回的指针。redis将内存块的大年夜小size存入头部,size所占据的内存大年夜小是已知的,为size_t类型的长度,然后返回ret_ptr。当须要释放内存的时刻,ret_ptr被传给内存治理法度榜样。经由过程ret_ptr,法度榜样可以很轻易的算出real_ptr的值,然后将real_ptr传给free释放内存。

Redis 和 Memcached 的差别大年夜吗?只选一个做缓存我们钙揭捉?哪个?

Redis经由过程定义一个数组来记录所有的内存分派情况,这个数组的长度为ZMALLOC_MAX_ALLOC_STAT。数组的每一个元素代表当前法度榜样所分派的内存块的个数,且内存块的大年夜小为该元素的下标。在源铝闼楝这个数组为zmalloc_allocations。zmalloc_allocations[16]代表已经分派的长度为16bytes的内存块的个数。zmalloc.c中有一个静态变量used_memory用来记录当前分派的内存总大年夜小。所以,总的来看,Redis采取的是包装的mallc/free,相较于Memcached的内存治理办法来说,要简单很多。

在Redis中,并不是所有的数据都一向存储在内存中的。这是和Memcached比拟一个最大年夜的差别。当物理内存用完时,Redis可以将一些良久没用到的value交换稻磁逄。Redis只会缓存所有的key的信息,如不雅Redis发明内存的应用量跨越了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计算出哪些key对应的value须要swap稻磁逄。然后再将这些key对应的value持久化稻磁逄中,同时在内存中清除。这种特点使得Redis可以保持跨越其机械本身内存大年夜小的数据。当然,机械本身的内存必须要可以或许保持所有的key,毕竟这些数据是不会进行swap操作的。同时因为Redis将内存中的数据swap稻磁逄中的时刻,供给办事的主线程和进行swap操作的子线程会共享这部分内存,所以如不雅更新须要swap的数据,Redis将壅塞这个操作,直到子线程完成swap操作后才可以进行修改。昔时夜Redis中攫取数据的时刻,如不雅攫取的key对应的value不在内存中,那么Redis就须要大年夜swap文件中加载响应数据,然后再返回给请求方。 这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现壅塞,即完成所有的swap文件加载后才会响应。这种策略在客户端的数量较小,进行批量操作的时刻比较合适。然则如不雅将Redis应用在一个大年夜型的网站应用法度榜样中,这显然是无法知足大年夜并发的情况的。所以Redis运行我们设置I/O线程池的大年夜小,对须要大年夜swap文件中加载响应数据的攫取请求进行并发操作,削减壅塞的时光。


  推荐阅读

  超实用Chrome使用技巧,你看了绝对不会失望的

Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 Chrome浏览器今朝应当是绝大年夜多半法度榜样员最爱好的浏览器了吧,至少我是如许的O(∩_∩)O。简洁>>>详细阅读


本文标题:Redis 和 Memcached 的区别大吗?只选一个做缓存我们该选哪个?

地址:http://www.17bianji.com/lsqh/38816.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)