Memcached、Redis以及Memcached与Redis的区别

一、Memcached
1.Memcached:是一个高性能的分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种数据结构。简单的说就是将数据调到内存中,然后从内存中读取,从而大大提高读取速度。
2.Memcached的工作流程:
先检查客户端的请求是否在Memcached中,如有,直接把请求返回,不再对数据库进行任何的操作;
如果请求不再Memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到Memcached中。
每次更新数据库时的同时要更新Memcached中的数据,保证一致性;
3.Memcached的回收机制:
当分配给Memcached的内存空间用完后会使用LRU(最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据(懒汉式删除)。
4.Memcached的内存管理机制:
        如果有个新的缓存数据要被存放,Memcached首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有直接存放进去;如果没有则要进行申请。slab申请内存以page(一个page 1M=1024*1024)为单位,多以在放第一个数据,无论大下,都会有1M大小的page被分配给slab。申请到page后,slab会将这个的内存按照chunk的大小进行切分,这样就变成了一个chunk的数组,在从这个chunk数组中选择一个用于存储数据。
5.Memcached淘汰机制:

如果此时又来了一个新的元素123B,那么就会触发memcached的淘汰机制了。memcached首先会查看180Bslab是否存在过期的元素,如果存在,则先清理部分,预留空位。如果180B这个slab的数据都比较热(没有过期),则按LRU进行淘汰。需要注意的是,淘汰是在slab内部进行的,也即在上面的场景中只有180Bslab内部进行淘汰剔除,对于其他的slab,是没有受到影响的。memcached也不会回收比较空余的其他slabpage。也即一个page被分配给某个slab后,他将一直被这个slab所占用,永远无法被mc回收,直到memcached重启。

这个特性被称为Memcached的钙化问题:Memcached在线上跑了一段时间后,内存按原始访问模式分配内存。当访问模式变更后,原有的分配模式可能导致缓存频繁出现数据剔除问题。最典型的场景即为内存尚有空余,但一直有数据被剔除,命中率一直上不去。对于这种情况,解决方法为重启缓存。


二、Redis
1.读写速度快:速写速度分别为110000次/s、81000次/s;
2.可持久化:将内存的数据保存到磁盘中,持久化的方式为:
  a.RDB(定时快照):将内存中的数据以快照的方式写入到二进制文件中,默认的文件名为dump,rdb。可以通过配置设置自动做快照持久化的方式。
RDB的缺点是:定时快照只是代表一段时间内的内存映像,所以系统重启会丢失上次快照与重启之间所有的数据。
  b.AOF(基于语句追加方):Redis将收到的命令都通过write函数追加到文件中,当Redis重启的时候会通过重新执行文件中保存的写的命令,在内存中重建整个数据库内容。
缺点是:AOF方式持久化还是可能会丢失部分修改;log文件体积过大时系统重启恢复数据非常慢,几十G的数据可能要几小时才能加载完;每条命令都要写log,读写性能会有所下降。
       持久化文件会越来越大,例如我们调用incrtest命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。
AOF重写:创建一个新的AOF文件来代替原有的AOF文件,新AOF文件和原有的AOF文件保存的数据库状态完全一样,但是新的AOF文件体积小于等于原有AOF文件的体积。
AOF后台重写:
1).子进程进行AOF重写期间,主进程继续处理命令请求;
2).子进程带有主进程的数据副本,使用了进程而不是线程,可以在避免死锁的情况下,保证数据的安全性;
子进程在进行AOF重写的期间,主进程还要继续处理命令,而新的命令可能对现有的数据进行更改,这会让当前数据库的数据和重写后的AOF文件中的数据不一致。
a.处理命令请求;
b.将写命令追加到AOF文件中;
c.将写命令追加到AOF重写缓存中;
将AOF重写缓存中的内容全部写入到新的AOF文件中,对新的AOF文件进行改名,覆盖原有的AOF文件;
3.支持五种数据结构 :String,List,Set,zSet,Hash;
4.原子操作 :Redis对不同数据类型的操作都是原子性的;
5.Redis支持多种语言 :Python,PHP;
6.主-从复制
主-从复制的特点
1).一个master可以有多个slave;
2).除了多个slave连到相同的master外,slave也可以连接到其他的slave上;
3).主从复制不会阻塞master,当一个或多个slave与master初次同步数据时,master可以处理客户端发来的请求。相反slave在初次同步数据时则会阻塞不能处理客户端的请求;
4).主从复制可以用来提高体统的可伸缩性;
5).可以在master禁用数据持久化,只需要注解掉master配置文件中的所有save配置,然后只在slave上配置持久化;
主-从复制的过程
1).当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。
2).无论是第一次同步建立的连接还是连接断开后的重新连 接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。
   3).后台进程完成写文件后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上。 
      4).接着master就会把缓存的命 令转发给slave。而且后续master收到的写命令都会通过开始建立的连接发送给slave。如果master同时收到多个slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave;
    7.Redis的内存管理机制
             Redis会缓存所有的key信息,如果Redis发现内存的使用量超过了某一个阀值,将会触发swap操作,计算出哪些key对应的value需要swap到磁盘上,然后将这些key对应的value持久化到磁盘上,同时在内存中清除;
    当从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就从swap文件中加载相应的数据,然后返回;
    8.Redis过期策略—懒汉式删除+定期删除
    1).定期删除:
    每隔一段时间执行一次删除过期的key;
    2).懒汉式删除:
    key过期的时候不删除,每次通过key获取值得时候,而且只删除当前key,所以对cpu占用比较少
   缺点是:大量的过期的key一直没有被获取则会造成内存泄漏;

    三、Memcached与Redis的区别:
     1).持久性:Redis支持数据持久化,Memcached不支持;
    2).数据类型:Redis支持String,List,Set,zSet,hash,Memcached之间简单的数据类型;
    3).主-从复制:Redis支持,Memcached不支持;
    4).内存管理机制:Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item会根据大小选合适的chunk存储,Redis使用现场申请内存的方式来存储数据;

猜你喜欢

转载自blog.csdn.net/jiangxiaoyi_07/article/details/77098051
今日推荐