NoSQL架构实践(三)——以NoSQL为缓存

      在《NoSQL架构实践》系列的前面两篇文章中,介绍了《以NoSQL为主》和《以NoSQL为辅》的架构。由于NoSQL数据库天生具有高性能、易扩展的特点,所以我们常常结合关系数据库,存储一些高性能的、海量的数据。从另外一个角度看,根据NoSQL的高性能特点,它同样适合用于缓存数据。用NoSQL缓存数据可以分为内存模式和磁盘持久化模式。

内存模式

    说起内存模式缓存,我们自然就会想起大名鼎鼎的Memcached。在互联网发展过程中,Memcached曾经解救了数据库的大部分压力,做出了巨大的贡献,直到今天,它依然是缓存服务器的首选。Memcached的常见使用方式类似下面的代码:

     Memcached提供了相当高的读写性能,一般情况下,都足够应付应用的性能要求。但是基于内存的Memcached缓存的总数据大小受限于内存的大小。

     当前如日中天、讨论得异常火热的NoSQL数据库Redis又为我们提供了功能更加强大的内存存储功能。跟Memcached比,Redis的一个key的可以存储多种数据结构Strings、Hashes、Lists、Sets、Sorted sets。Redis不但功能强大,而且它的性能完全超越大名鼎鼎的Memcached。Redis支持List、hashes等多种数据结构的功能,提供了更加易于使用的api和操作性能,比如对缓存的list数据的修改。

      同样,其他一些NoSQL数据库也提供了内存存储的功能,所以也适合用来做内存缓存。比如Tokyo Tyrant就提供了内存hash数据库、内存tree数据库功能,内存tree数据可根据key的顺序进行遍历。你可以通过使用其提供的兼容Memcached协议或自定义的协议来使用。

持久化模式

     虽然基于内存的缓存服务器具有高性能,低延迟的特点,但是内存成本高、内存数据易失却不容忽视。几十GB内存的服务器,在很多公司看来,还比较奢侈。所以,我们应该根据应用的特点,尽量的提高内存的利用率,降低成本。

     大部分互联网应用的特点都是数据访问有热点,也就是说,只有一部分数据是被频繁访问的。如果全部都cache到内存中,无疑是对内存的浪费。

      这时,我们可以利用NoSQL来做数据的缓存。其实NoSQL数据库内部也是通过内存缓存来提高性能的,通过一些比较好的算法,把热点数据进行内存cache,非热点数据存储到磁盘以节省内存占用。由于其数据库结构的简单,从磁盘获取一次数 据也比从数据库一次耗时的查询划算很多。用NoSQL数据库做缓存服务器不但具有不错的性能。而且还能够Cache比内存大的数据。

     使用NoSQL来做缓存,由于其不受内存大小的限制,我们可以把一些不常访问、不怎么更新的数据也缓存起来。比如论坛、新闻的老数据、数据列表的靠后的页面,虽然用户访问不多,但是搜索引擎爬虫会访问,也可能导致系统负载上升。

     如果NoSQL持久化缓存也使用类似基于内存的memcached设置过期时间的方式,那么持久化缓存就失去了意义。所以用NoSQL做缓存的过期策略最好不使用时间过期,而是数据是否被更新过,如果数据没有更新,那么就永久不过期。下面我们用代码(php)演示一种实现这种策略的方法:

     场景:新闻站点的评论系统。用户对新闻页面的url进行评论,然后根据url进行查询展示。

     我把上面代码演示的缓存使用方式称为基于版本的缓存。这种方式同样适用于基于内存的Memcached。它能实现缓存数据的实时性,让用户感觉不到延迟。只要用户一发表评论,该新闻的评论缓存就会失效。用户很少去评论一些过时的新闻,那么缓存就一直存在于NoSQL中,避免了爬虫访问过时新闻的评论数据而冲击数据库。

总结

     目前国内的新浪微博已经在大量的使用Redis缓存数据,赶集网也在大量的使用Redis。Redis作为一些List,Hashes等数据结构的缓存,非常适合。

把NoSQL当持久化Cache使用的模式,在很多大数据量、有热点、查询非热点数据比较消耗资源的场景下比较有用。

NoSQL架构实践总结

      到这里,关于NoSQL架构实践的三篇文章就结束了。NoSQL架构并不局限于我介绍的三种模式,他们之间也可以进行组合,应该根据你具体的应用场景灵活使用。不管是什么模式,都是为了解决我们的问题而出现的,所以在系统架构的时候,要问下自己,我为什么要用NoSQL;在对NoSQL架构模式选型的时候,要问下自己,我为什么要这么用NoSQL。

参考链接:

关于作者

      孙立,目前为去哪儿网(qunar.com)高级系统架构师。曾就职于凤凰网、ku6和搜狐。多年互联网从业经验和程序开发,对分布式搜索引擎的开发,高并发,大数据量网站系统架构优化,高可用性,可伸缩性,分布式系统缓存,数据库分表分库(sharding)等有丰富的经验,并且对运维监控和自动化运维控制有经验。是开源项目phplock,phpbuffer的作者。近期开发了一个NOSQL数据库存储INetDB,是NoSQL数据库爱好者。

本文已经首发于InfoQ中文站,版权所有,原文为《NoSQL架构实践(三)——以NoSQL为缓存》,如需转载,请务必附带本声明,谢谢。 

       InfoQ中文站是一个面向中高端技术人员的在线独立社区,为Java、.NET、Ruby、SOA、敏捷、架构等领域提供及时而有深度的资讯、高端技术大会如QCon 、线下技术交流活动QClub、免费迷你书下载如《架构师》等。​

新浪微博:http://t.sina.com.cn/sunli1223
posted @ 2011-03-31 10:59 草屋主人 阅读(4032) 评论(7) 编辑 收藏

 回复 引用 查看   
#1楼2011-03-31 12:49 | 真爱无悔      
多谢分享。受教了
 回复 引用 查看   
#2楼2011-03-31 13:03 | eng308      
很想知道楼主为何选的是Redis?Redis和其他的key/value数据库的优势在哪里呢?对与mongodb楼主有何见解?因为最近也在研究nosql,所以对于他们各自的性能以及优势还有些迷茫,忘楼主给与指点。
 回复 引用 查看   
#3楼[楼主]2011-03-31 13:36 | 草屋主人      
引用eng308:很想知道楼主为何选的是Redis?Redis和其他的key/value数据库的优势在哪里呢?对与mongodb楼主有何见解?因为最近也在研究nosql,所以对于他们各自的性能以及优势还有些迷茫,忘楼主给与指点。

你首先关注下各自存储的数据结构的区别

 回复 引用 查看   
#4楼2011-04-01 17:02 | flashjay      
Hi, 关于新浪大量使用redis的实践,知道他们用在哪些方面吗?详细点的,比如,好友列表;还有相关的运维经验,比如意外宕机可能会导致最后一次save之后的数据全部丢掉;
谢谢!

 回复 引用 查看   
#5楼[楼主]2011-04-01 17:53 | 草屋主人      
引用flashjay:
Hi, 关于新浪大量使用redis的实践,知道他们用在哪些方面吗?详细点的,比如,好友列表;还有相关的运维经验,比如意外宕机可能会导致最后一次save之后的数据全部丢掉;
谢谢!

我不是新浪的员工,所以在没有得到允许的情况下,不方便说太细节了。

 回复 引用 查看   
#6楼2011-05-11 13:53 | 新志      
说实话,我非常排斥在函数内部,去调用全局变量,这是个非常不好的习惯
 回复 引用 查看   
#7楼2011-09-18 17:18 | gotolnc      
最近有些烦恼
Membase
Redis
MongoDB
这三个让我最心动, 主要问一下去哪儿这种对实时性较高的站点使用什么更合适。