`
mixer_b
  • 浏览: 115476 次
社区版块
存档分类
最新评论

NoSQL数据库:Redis适用场景及产品定位

 
阅读更多

传统MySQL+ Memcached架构遇到的问题

  实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:

  1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。

  2.Memcached与MySQL数据库数据一致性问题。

  3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。

  4.跨机房cache同步问题。

  众多NoSQL百花齐放,如何选择

  最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解决以下几种问题

  1.少量数据存储,高速读写访问。此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。

  2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。

  3.这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。

  4.Schema free,auto-sharding等。比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。

  面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。

  Redis适用场景,如何正确的使用

  前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

  Redis与Memcached的比较

  1.网络IO模型

  Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。

NoSQL数据库:Redis适用场景及产品定位

(Memcached网络IO模型)

  Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。

  2.内存管理方面

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

  Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。

  3.数据一致性问题

  Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。

  4.存储方式及其它方面

  Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能

  Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS

  进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举出所有数据,Redis还同时提供了持久化和复制等功能。

  5.关于不同语言的客户端支持

  在不同语言的客户端方面,Memcached和Redis都有丰富的第三方客户端可供选择,不过因为Memcached发展的时间更久一些,目前看在客户端支持方面,Memcached的很多客户端更加成熟稳定,而Redis由于其协议本身就比Memcached复杂,加上作者不断增加新的功能等,对应第三方客户端跟进速度可能会赶不上,有时可能需要自己在第三方客户端基础上做些修改才能更好的使用。

  根据以上比较不难看出,当我们不希望数据被踢出,或者需要除key/value之外的更多数据类型时,或者需要落地功能时,使用Redis比使用Memcached更合适。

  关于Redis的一些周边功能

  Redis除了作为存储之外还提供了一些其它方面的功能,比如聚合计算、pubsub、scripting等,对于此类功能需要了解其实现原理,清楚地了解到它的局限性后,才能正确的使用,比如pubsub功能,这个实际是没有任何持久化支持的,消费方连接闪断或重连之间过来的消息是会全部丢失的,又比如聚合计算和scripting等功能受Redis单线程模型所限,是不可能达到很高的吞吐量的,需要谨慎使用。

  总的来说Redis作者是一位非常勤奋的开发者,可以经常看到作者在尝试着各种不同的新鲜想法和思路,针对这些方面的功能就要求我们需要深入了解后再使用。

  总结:

  1.Redis使用最佳方式是全部数据in-memory。

  2.Redis更多场景是作为Memcached的替代者来使用。

  3.当需要除key/value之外的更多数据类型支持时,使用Redis更合适。

  4.当存储的数据不能被剔除时,使用Redis更合适

转自:http://hb.qq.com/a/20110819/000035.htm

分享到:
评论

相关推荐

    NoSQL数据库之Redis数据库管理视频教程

    - 使用场景:MySQL适用于需要强一致性事务处理的场景,而Redis更适合用作高速缓存或者实时数据分析。 #### Redis数据库在Linux系统下的安装与部署 1. **下载安装包**:首先从官方网站下载适合Linux系统的Redis...

    NoSql数据库之Redis笔记

    ### NoSQL数据库之Redis知识点详解 ...通过以上介绍,我们可以看到Redis不仅是一种高性能的NoSQL数据库,而且具备丰富的功能特性和应用场景。无论是作为缓存层还是用于实现复杂的业务逻辑,Redis都能发挥出色的表现。

    NoSQL数据库之Redis.zip

    标题 "NoSQL数据库之Redis.zip" 提到的核心知识点是NoSQL数据库中的Redis,这是一个非常重要的分布式数据存储系统,尤其在处理大数据场景时被广泛应用。现在,让我们深入探讨一下Redis及其在大数据环境中的作用。 ...

    NOSQL数据库-redis快速入门

    此外,NOSQL数据库通常具有特定的API和语法,适应不同的业务场景,如MongoDB适合内容管理系统,Redis则是一款多功能的数据结构服务器,而Hbase和Cassandra则常用于海量数据处理。 Redis是一款高性能的键值对数据库...

    NoSQL数据库之Redis数据库管理二(string类型和hash类型)

    适用场景:** 哈希类型适合存储具有多个相关属性的对象,例如用户信息、商品详情等。由于内部结构优化,哈希类型在进行字段操作时效率较高。 **4. 特性:** - 哈希表的字段数量不受限制,但单个哈希对象内存占用不...

    高性能NoSQL数据库Redis(盛大在线)

    标题和描述中的知识点聚焦于高性能NoSQL数据库Redis的特性与应用,以下将深入解析这些关键概念,以便更好地理解和掌握Redis的使用。 ### Redis的核心概念 #### Redis是什么? Redis,全称为Remote Dictionary ...

    NoSQL数据库之Redis数据库管理一(string类型和hash类型)

    Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,属于NoSQL数据库的一种。它以其内存存储、数据持久化、丰富的数据结构以及强大的订阅发布功能等特性,被广泛应用于缓存、消息队列、实时统计等多...

    NoSQL数据库的特点与应用场景.docx

    应用场景: 1.MongoDB:适用于实时的插入、更新与查询的需求,并具备应用程序实时数据存储所需的复制及高度伸缩性。 2.HBase:适合大规模数据存储和处理,具有高性能和高可用性。 3.Redis:适合实时数据处理和缓存...

    NoSQL数据库-MongoDB和Redis

    通过对MongoDB和Redis这两种NoSQL数据库的详细介绍,我们可以看出它们各自的优势和适用场景。MongoDB适合于需要灵活性和高扩展性的应用,而Redis则更适合于需要高性能和低延迟的应用场景。在实际应用中,根据具体的...

    NoSQL数据库入门 高清PDF

    #### 三、常见的NoSQL数据库类型及代表 - **键值存储数据库**:例如Redis,适用于高速缓存场景。 - **文档数据库**:例如MongoDB,适合存储结构复杂的文档数据。 - **列族数据库**:例如Cassandra,适合处理大规模...

    全面解读NoSQL数据库Redis的核心技术与应用实践1

    NoSQL数据库Redis是一种高性能的键值存储系统,它在互联网和Web领域中广泛应用于处理海量数据和高并发问题。作为NoSQL数据库的一员,Redis以其出色的性能、丰富的数据结构、持久化、高可用性、分布式支持和复制特性...

    NoSQL数据库之Redis数据库管理三(string类型和hash类型)

    作为NoSQL数据库家族的一员,Redis以其高效、易用和丰富的数据结构闻名,尤其在处理高并发读写场景时表现出色。本篇文章将主要聚焦于Redis中的两种基础数据类型——String和Hash,以及它们在数据库管理中的应用。 ...

    nosql数据库简介.pptx

    NoSQL数据库,全称为"Not Only SQL",是一种非关系型的数据库系统,旨在解决传统关系型数据库在处理大规模数据和高并发场景下遇到的问题。在90年代,由于网站访问量较小,静态网页为主,单一数据库可以满足需求。但...

    redis数据库(NOSQL)

    总结一下,Redis作为NoSQL数据库的代表,凭借其内存存储、丰富的数据结构、高效的持久化机制和丰富的功能,广泛应用于各种场景。理解和熟练掌握Redis的配置和使用,对于提升系统的性能和可靠性至关重要。

    NoSQL数据库入门思维导图

    通过“基础知识.mmap”可以深入学习NoSQL的原理和操作,而“常见的NoSQL数据库.mmap”则可能涵盖了各种NoSQL数据库的特性、应用场景和使用案例。对于想要踏入NoSQL领域的学习者来说,这些资源无疑是非常宝贵的。

    实验四:NoSQL和关系数据库的操作比较

    对于NoSQL数据库HBase、Redis和MongoDB,虽然没有提供具体的操作步骤,但通常它们的使用包括安装相应的客户端工具,学习其特定的命令行语法或者Java API,例如HBase的HBase Shell、Redis的`redis-cli`和MongoDB的...

Global site tag (gtag.js) - Google Analytics