Memcached 和 Redis 区别

Memcached

https://tech.meituan.com/cache_about.html

客户端采用一致性hash算法作为路由策略。

一致性hash算法除了计算key的hash值外,还会计算每个server对应的hash值,然后将这些hash值映射到一个有限的值域上(比如0~2^32)。通过寻找hash值大于hash(key)的最小server作为存储该key数据的目标server。如果找不到,则直接把具有最小hash值的server作为目标server。同时,一定程度上,解决了扩容问题,增加或删除单个节点,对于整个集群来说,不会有大的影响。

slab是一个内存块,它是memcached一次申请内存的最小单位。在启动memcached的时候一般会使用参数-m指定其可用内存,但是并不是在启动的那一刻所有的内存就全部分配出去了,只有在需要的时候才会去申请,而且每次申请一定是一个slab。Slab的大小固定为1M(1048576Byte),一个slab由若干个大小相等的chunk组成。每个chunk中都保存了一个item结构体、一对key和value。

虽然在同一个slab中chunk的大小相等的,但是在不同的slab中chunk的大小并不一定相等,在memcached中按照chunk的大小不同,可以把slab分为很多种类,默认情况下memcached把slab分为40类(class1~class40),在class 1中,chunk的大小为80字节,由于一个slab的大小是固定的1M,因此在class1 中最多可以有13107个chunk。

memcached内存管理采取预分配、分组管理的方式,分组管理就是让我们上面提到的slab class,按照chunk的大小slab 被分为很多种类。内存预分配过程是怎样的呢?向memcached添加一个item时候,memcached 首先会根据item的大小,来选择最合适的slab class:例如item 的大小为190字节,默认情况下class4的chunk 大小为160字节显然不合适,class5的chunk大小为200字节,大于190字节,因此该item将放在class5中,计算好所要放入的chunk之后,memcached会去检查该类大小的chunk还有没有空闲的,如果没有,将会申请1M的空间并划分为该种类chunk。

memcached内存管理需要注意:

1、chunk是在page里面划分的,而page固定为1m,所以chunk最大不超过1m。

2、chunk实际占用内存要加48B,因此chunk数据结构本身需要占用48B。

3、如果用户数据大于1m,则memcached会将其切割,放到多个chunk内。

4、已分配出去的page不能回收。

1、可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS

2、只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型

3、无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失

4、无法进行数据同步,不能讲MC中的数据迁移到其他MC实例中

5、Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降级,并引发低利用率时依然出现踢出等问题

Redis

1、支持多种数据结构,如String、list、hash、set、zset等

2、支持持久化操作,可以进行RDB和AOF数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段

3、支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制来实现HA

4、单线程请求,所以命令串行执行,并发情况下不需要考虑数据一致性问题,但性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒

5、支持pub/sub消息订阅机制,可以用来进行消息订阅与通知

6、Redis在string类型上会消耗较多内存,可以使用hash表压缩存储以降低内存耗用,最多可以容纳的数据长度是512M

区别:

1、Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcache相比一个最大的区别;

2、Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcache只是简单的K/V缓存;

3、它们的扩展都需要做集群,实现方式:master-slave、Hash

4、在100k以上的数据中,Memcache性能高于Redis;

5、如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcache。

6、如果你对数据持久化和数据同步有所要求,推荐选择Redis;

7、Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache更强

缓存清空策略

FIFO(first in first out)

先进先出策略,最先进入缓存的数据在缓存空间不够的情况下(超出最大元素限制)会被优先清除掉,以腾出新的空间接受新的数据。策略算法主要比较缓存元素的创建时间。在数据实时性要求场景下可选择该类策略,优先保障最新数据可用。

LFU(less frequently used)

最少使用策略,无论是否过期,根据元素的被使用次数判断,清除使用次数较少的元素释放空间,策略算法主要比较元素的hitCount(命中次数)。在保证高频数据有效性场景下,可选择这类策略。

LRU(leaset recently used)

最近最少使用策略,无论是否过期,根据元素最后一次被使用的时间戳,清除最远使用时间戳的元素释放空间。策略算法主要比较元素最近一次被get使用时间,在热点数据场景下较适用,优先保证热点数据的有效性。

缓存介质

虽然从硬件介质上来看,无非就是内存和硬盘两种,但从技术上,可以分为内存、硬盘文件、数据库。

内存:将缓存存储于内存中是最快的选择,无需额外的I/O开销,但是内存的缺点是没有持久化落地物理磁盘,一旦应用异常break down而重新启动,数据很难或者无法复原。

硬盘:一般来说,很多缓存框架会结合使用内存和硬盘,在内存分配空间满了或是在异常的情况下,可以被动或主动的将内存空间数据持久化奥硬盘中,达到释放空间或备份数据的目的。

数据库:使用简单的key-value存储结构的特殊数据库,响应速度和吞吐量远远高于我们常用的关系型数据库。

    原文作者:tdwmarlboro
    原文地址: https://www.jianshu.com/p/6b59c6759875
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞