0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

redis、memcache原理对比

lhl545545 来源:电子发烧友网 2018-02-09 15:31 次阅读

memcache、redis原理对比

一、问题:

数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求。

二、解决方案:

1.通过高速服务器Cache缓存数据库数据

2.内存数据库

(这里仅从数据缓存方面考虑,当然,后期可以采用Hadoop+HBase+Hive等分布式存储分析平台)

三、主流解Cache和数据库对比:

redis、memcache原理对比

上述技术基本上代表了当今在数据存储方面所有的实现方案,其中主要涉及到了普通关系型数据库(MySQL/PostgreSQL),NoSQL数据库(MongoDB),内存数据库(Redis),内存Cache(Memcached),我们现在需要的是对大数据表仍保持高效的查询速度,普通关系型数据库是无法满足的。而MongoDB其实只是一种非关系型数据库,其优势在于可以存储海量数据,具备强大的查询功能,因此不宜用于缓存数据的场景。

从以上各数据可知,对于我们产品最可行的技术方案有两种:

1.Memcached 内存Key-Value Cache

2.Redis 内存数据库

四、下面重点分析Memcached和Redis两种方案:

4.1 Memcached介绍

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度,现在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。

4.2 Memcached工作方式分析

许多Web应用都将数据保存到 RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、 提高可扩展性。下图展示了memcache与数据库端协同工作情况:

redis、memcache原理对比

其中的过程是这样的:

1.检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,无需查询数据库。

2.如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。

3.保持缓存的“新鲜性”,每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。

Memcached作为高速运行的分布式缓存服务器,具有以下的特点:

协议简单

基于libevent的事件处理

内置内存存储方式

memcached不互相通信的分布式

4.3 如何实现分布式可拓展性?

Memcached的分布式不是在服务器端实现的,而是在客户端应用中实现的,即通过内置算法制定目标数据的节点,如下图所示:

redis、memcache原理对比

4.4 Redis 介绍

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,当前 Redis的应用已经非常广泛,国内像新浪、淘宝,国外像 Flickr、Github等均在使用Redis的缓存服务。

4.5 Redis 工作方式分析

Redis作为一个高性能的key-value数据库具有以下特征:

多样的数据模型

持久化

主从同步

Redis支持丰富的数据类型,最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。Redis通常将数据存储于内存中,或被配置为使用虚拟内存。Redis有一个很重要的特点就是它可以实现持久化数据,通过两种方式可以实现数据持久化:使用RDB快照的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的AOF日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。 Redis支持将数据同步到多台从数据库上,这种特性对提高读取性能非常有益。

4.6 Redis如何实现分布式可拓展性?

2.8以前的版本:与Memcached一致,可以在客户端实现,也可以使用代理,twitter已开发出用于Redis和Memcached的代理Twemproxy 。

3.0 以后的版本:相较于Memcached只能采用客户端实现分布式存储,Redis则在服务器端构建分布式存储。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,各个节点地位一致,具有线性可伸缩的功能。如图给出Redis Cluster的分布式存储架构,其中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信。在数据的放置策略上,Redis Cluster将整个 key的数值域分成16384个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点数就是16384

redis、memcache原理对比

五、综合结论

应该说Memcached和Redis都能很好的满足解决我们的问题,它们性能都很高,总的来说,可以把Redis理解为是对Memcached的拓展,是更加重量级的实现,提供了更多更强大的功能。具体来说:

1.性能上:

性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比

Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。

2.内存空间和数据量大小:

MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。

3.操作便利上:

MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。

4.可靠性上:

MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。

5.应用场景:

Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。

Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。

六、需要慎重考虑的部分

1.Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB

2.Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高

3.从本质上讲,Memcached只是一个单一key-value内存Cache;而Redis则是一个数据结构内存数据库,支持五种数据类型,因此Redis除单纯缓存作用外,还可以处理一些简单的逻辑运算,Redis不仅可以缓存,而且还可以作为数据库用

4.新版本(3.0)的Redis是指集群分布式,也就是说集群本身均衡客户端请求,各个节点可以交流,可拓展行、可维护性更强大。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Redis
    +关注

    关注

    0

    文章

    371

    浏览量

    10846
  • memcache
    +关注

    关注

    0

    文章

    5

    浏览量

    2456
收藏 人收藏

    评论

    相关推荐

    Redis为什么这么快?

    Redis 是基于内存的数据库,那不可避免的就要与磁盘数据库做对比。对于磁盘数据库来说,是需要将数据读取到内存里的,这个过程会受到磁盘 I/O 的限制。而对于内存数据库来说,本身数据就存在于内存里,也就没有了这方面的开销。
    发表于 04-12 10:32 200次阅读
    <b class='flag-5'>Redis</b>为什么这么快?

    Redis开源版与Redis企业版,怎么选用?

    点击“蓝字”关注我们数以千计的企业和数以百万计的开发人员Redis开源版来构建应用程序。但随着用户数量、数据量和地区性的增加,成本、可扩展性、运营和可用性等问题也随之而来。Redis企业版
    的头像 发表于 04-04 08:04 969次阅读
    <b class='flag-5'>Redis</b>开源版与<b class='flag-5'>Redis</b>企业版,怎么选用?

    新版 Redis 不再“开源”,对使用者都有哪些影响?

    2024 年 3 月 20 日,Redis Labs 宣布从 Redis 7.4 开始,将原先比较宽松的 BSD 源码使用协议修改为 RSAv2和 SSPLv1协议。该变化意味着 Redis
    的头像 发表于 03-27 22:30 446次阅读
    新版 <b class='flag-5'>Redis</b> 不再“开源”,对使用者都有哪些影响?

    linux下Redis常用命令使用

    redis重启,缓存数据还在,redis清缓存数据
    的头像 发表于 12-27 09:56 5953次阅读
    linux下<b class='flag-5'>Redis</b>常用命令使用

    聊聊Redis的使用案例

    今天我们来聊聊 Redis 的使用案例。
    的头像 发表于 12-13 14:13 489次阅读

    【爱芯派 Pro 开发板试用体验】Redis源码编译和基准测试

    -n 100000 输出结果为: 3.6 基准测试结果和树莓派4B对比 在树莓派4B开发板上,使用同样的操作,运行同样版本的redis-server和redis-benchmark,得到的测试结果
    发表于 12-10 22:18

    【昉·星光 2 高性能RISC-V单板计算机体验】Redis源码编译和性能测试以及与树莓派4B对比

    令: redis-benchmark -t set -n 100000 输出结果为: 3.6 基准测试结果和树莓派4B对比 在树莓派4B开发板上,使用同样的操作,运行同样版本的redis
    发表于 12-10 21:27

    redis容器内怎么查看redis日志

    redis是一款流行的开源内存数据库,常用于缓存、消息队列、任务管理等场景。在使用redis时,了解如何查看redis日志对于排查问题、监控性能和分析应用程序行为非常重要。在本文中,我们将介绍在
    的头像 发表于 12-05 10:10 3502次阅读

    redis的lru原理

    Redis是一种基于内存的键值数据库,它使用了LRU(Least Recently Used)算法来进行缓存的数据淘汰。LRU算法的核心思想是最近最少使用的数据将会在未来也不常用,因此应该优先
    的头像 发表于 12-05 09:56 606次阅读

    redis的原理和使用场景

    Redis(Remote Dictionary Server)是一个开源的、高性能的非关系型(NoSQL)的键值对数据库管理系统。它以其快速读写能力和多种数据结构支持而闻名,并被广泛应用于缓存
    的头像 发表于 12-04 16:29 567次阅读

    redis hash底层实现原理

    Redis是一个开源的内存数据库,使用键值对存储数据。其中,Redis中的数据结构之一就是哈希(Hash),它提供了一种将多个字段(Field)存储在一个键(Key)中的方法。那么Redis的哈希
    的头像 发表于 12-04 16:27 562次阅读

    redis的持久化方式RDB和AOF的区别

    Redis 是一个高性能的键值对数据库,提供了两种持久化方式:RDB 和 AOF。RDB 是将 Redis 的数据快照保存到磁盘上,而 AOF 则是将 Redis 的操作命令追加到文件的末尾
    的头像 发表于 12-04 16:25 745次阅读

    redis的淘汰策略

    Redis是一种基于内存的键值存储系统,为了充分利用内存,Redis采用了一些淘汰策略来管理内存空间。淘汰策略的作用是当内存空间不足时,选择合适的数据对象进行淘汰,释放出更多的内存空间,以供后续
    的头像 发表于 12-04 16:23 522次阅读

    redis查看集群状态命令

    Redis 是一个开源的、内存中的数据结构存储系统,提供了一系列命令来管理和操作数据。在 Redis 中,集群是一个由多个 Redis 实例组成的分布式系统,用于提高数据的可用性和性能。在进行
    的头像 发表于 12-04 11:39 1023次阅读

    Java redis锁怎么实现

    在Java中实现Redis锁涉及到以下几个方面:Redis的安装配置、Redis连接池的使用、Redis数据结构的选择、实现分布式锁的几种方式等。 一、
    的头像 发表于 12-04 10:47 1125次阅读