您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    同为散布式缓存,为何Redis更胜一筹?
    时间:2018-03-26 21:46 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    如今,市面上的缓存处置方案曾经逐渐成熟了,明天我将选取其中一些代表性的方案包括Redis、Memcached和Tair停止比照,协助大家在消费实际中更好地停止技术选型。

    一、常用的散布式缓存的比照

    常用的散布式缓存包括Redis、Memcached和阿里巴巴的Tair(见下表),由于Redis提供的数据结构比较丰厚且复杂易用,所以Redis的运用普遍。

    同为散布式缓存,为何Redis更胜一筹?

    下面我们从9个小气面来比照最常用的Redis和Memcached。

    1.数据类型

    Redis一共支持5种数据类型,每种数据类型对应不同的数据结构,有复杂的String类型、紧缩串、字典、腾跃表等。腾跃表是比较新型的数据结构,常用于高功用的查找,可以到达log2N的查询速度,而且腾跃表相关于红黑树,在更新时变更的节点较少,更易于完成并发操作。

    Memcache只支持对键值对的存储,并不支持其它数据结构。

    2.线程模型

    Redis运用单线程完成,Memcache等运用多线程完成,因此我们不引荐在Redis中存储太大的内容,否则会阻塞其它央求。

    由于缓存操作都是内存操作,只要很少的计算操作,所以在单线程下功用很好。Redis完成的单线程的非阻塞网络I/O模型,适宜快速地操作逻辑,有复杂的长逻辑时会影响功用。关于长逻辑应该配置多个实例来提高多核CPU的应用率,也就是说,可以运用单机器多端口来配置多个实例,官方的引荐是一台机器运用8个实例。

    它完成的非阻塞I/O模型基于Libevent库中关于Epoll的两个文件加上本人复杂完成的事情通知模型,复杂小巧,作者的思想就是保持完成复杂、增加依赖。由于在效劳器中只要一个线程,因此提供了管道来兼并央求和批量执行,延长了通讯消耗的时间。

    Memcache也运用了非阻塞I/O模型,但是运用了多线程,可以运用于多种场景,央求的逻辑可大可小、可长可短,不会出现一个逻辑复杂的央求阻塞对其它央求的照应的场景。它直接依赖Libevent库完成,依赖比较复杂,损失了在一些特定环境下的高功用。

    3.耐久机制

    Redis提供了两种耐久机制,包括RDB和AOF,前者是定时的耐久机制,但在出现宕机时能够会出现数据丧失,后者是基于操作日志的耐久机制。

    Memcahe并不提供耐久机制,由于Memache的设计理念就是设计一个单纯的缓存,缓存的数据都是暂时的,不应该是耐久的,也不应该是一个大数据的数据库,缓存未命中时回源查询数据库是天经地义的,但可以经过第三方库MemcacheDB来支持它的耐久性。

    4.客户端

    常见的Redis Java客户端Jedis运用阻塞I/O,但可以配置衔接池,并提供了分歧性哈希分片的逻辑,也可以运用开源的客户端分片框架Redic。

    Memecache的客户端包括Memcache Java Client、Spy Client、XMemcache等,Memcache Java Client运用阻塞I/O,而Spy Client/XMemcache运用非阻塞I/O。

    我们知道,阻塞I/O不需求额外的线程,非阻塞I/O会开启额外的央求线程(在Boss线程池里)监听端口,一个央求在处置后就释听任务者线程(在Worker线程池中),央求线程在监听到有前往结果时,一旦有I/O前往结果就被唤醒,然后末尾处置照应数据并写回网络Socket衔接,所以从实际下去讲,非阻塞I/O的吞吐量和照应才能会更高。

    5.高可用

    Redis支持主从节点复制配置,从节点可运用RDB缓和存的AOF命令停止同步和恢复。Redis还支持Sentinel和Cluster(从3.0版本末尾)等高可用集群方案。

    Memecache不支持高可用模型,可运用第三方Megagent代理,当一个实例宕机时,可以衔接另外一个实例来完成。

    6.对队列的支持

    Redis本身支持lpush/brpop、publish/subscribe/psubscribe等队列和订阅形式。

    Memcache不支持队列,可经过第三方MemcachQ来完成。

    7.事务

    Redis提供了一些在一定水平上支持线程安全和事务的命令,例如:multi/exec、watch、inc等。由于Redis效劳器是单线程的,任何单一央求的效劳器操作命令都是原子的,但跨客户端的操作并不保证原子性,所以关于同一个衔接的多个操作序列也不保证事务。

    Memcached的单个命令也是线程安全的,单个衔接的多个命令序列不是线程安全的,它也提供了inc等线程安全的自加命令,并提供了gets/cas保证线程安全。

    8.数据淘汰策略

    Redis提供了丰厚的淘汰策略,包括maxmemory、maxmemory-policy、volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl、noeviction(return error)等。

    Memecache在容量到达指定值后,就基于LRU(Least Recently Used)算法自动删除不运用的缓存。在某些状况下LRU机制反倒会带来费事,会将不等候的数据从内存中肃清,在这种状况下启动Memcache时,可以经过“M”参数制止LRU算法。

    9.内存分配

    Redis为了屏蔽不同平台之间的差异及统计内存占用量等,对内存分配函数停止了一层封装,在顺序中一致运用zmalloc、zfree系列函数,这些函数位于zmalloc.h/zmalloc.c文件中。封装就是为了屏蔽底层平台的差异,同时方便本人完成相关的统计函数。详细的完成方式如下:

    若系统中存在Google的TC_MALLOC库,则运用tc_malloc一族的函数替代本来的malloc一族的函数。

    若以后系统是Mac系统,则运用系统的内存分配函数。

    关于其它状况,在每一段分配好的空间前面同时多分配一个定长的字段,用来记载分配的空间大小,经过这种方式来完成复杂有效的内存分配。

    Memcache采用slab table的方式分配内存,首先把可得的内存按照不同的大小来分类,在运用时依据需求找到最接近于需求大小的块分配,来增加内存碎片,但是这需求停止合理配置才能到达效果。

    从下面的比照可以看到,Redis在完成和运用上更复杂,但是功用更弱小,效率更高,运用也更普遍。下面将对Redis停止初步引见,给初学者一个初体验式的学习引导。

    二、Redis初体验

    Redis是一个可以存储多种数据对象的开源Key-Value存储系统,运用ANSI C言语编写,可以仅仅当作内存数据库运用,也可以作为以日志为存储方式的数据库系统,并提供多种言语的API。

    1.运用场景

    (责任编辑:admin)