声明:原文摘自http://weibo.com/u/2446082491,谢谢他的分享!

  在当前大型互联网应用以及提供云计算服务的时候,怎样保证系统在海量数据环境下的高性 能、高可靠性、高扩展性、高可用性、低成本成为迫切需要。

  按照分布式CAP理论(Consistency、 Availability、Tolerance to network Partitions【一致性、可用性、分区可溶性】这三 部分在任何系统架构实现时只可能同时满足其中二点,没法三者兼顾)来衡量,传统的关系数据库的 ACID(原子性、一致性、隔离性、持久性)只满足了 Consistency、Availability,因此在 Partition tolerance 上就很难做得好。 另外传统的关系数据库处理海量数据、分布式架构时候在 Performance、Scalability、 Availability 等方面也存在很大的局限性。而Key-Value Store更加注重对海量数据存取的性能、分布式、扩展性支持上,并不需要传统关系数据库的一些特征,例如:Schema、事务、完整 SQL 查询支持等等,因此在分布式环境下的性能相对于传统的关系数据库有较大的提升。

  Key-Value Store更加符合互联网特别是大型应用的潮流,原因有二:

  大规模的互联网应用

  对于 google,ebay 这样的互联网企业,每时每刻都有无数的用户在使用它们提供的互联网 服务,这些服务带来的就是大量的数据吞吐量,在同一时间,会并发的有成千上万的连接对 数据库进行操作。在这种情况下,单台服务器或者几台服务器远远不能满足这些数据处理的 需求,简单的升级服务器性能这样的 scale up 的方式也不行,所以唯一可以采用的办法就是 scale out 了。scale out 的方法有很多种,但大致分为两类:一类仍然采用 RDBMS,然后通过 对数据库的垂直和水平切割将整个数据库部署到一个集群上,这种方法的优点在于可以采用 RDBMS 这种熟悉的技术,但缺点在于它是针对特定应用的,就是说,由于应用的不同,切割的方法是不一样的。还有一类就是 google 所采用的方法,抛弃 RDBMS,采用key-value形式的存储,这样可以极大的增强系统的可扩展性(scalability),如果要处理的数据持续增大,多加机器就可以了。

  云存储

  如果说上一个问题还有可以替代的解决方案(切割数据库)的话,那么对于云存储来说,也 许 key-value 的 store 就是唯一的解决方案了。云存储简单点说就是构建一个大型的存储平台 给别人用,这也就意味着在这上面运行的应用其实是不可控的。如果其中某个客户的应用随 着用户的增长而不断增长时,云存储供应商是没有办法通过数据库的切割来达到 scale 的, 因为这个数据是客户的,供应商不了解这个数据自然就没法作出切割。在这种情况下, key-value 的 store 就是唯一的选择了,因为这种条件下的 scalability 必须是自动完成的,不 能有人工干预。这也是为什么几乎所有的现有的云存储都是 key-value 形式的,例如 Amazon 的 smipleDB,底层实现就是 key-value,还有 google 的 GoogleAppEngine,采用的是 BigTable 的存储形式。

  Key-Value Store 最大的特点就是它的可扩展性,这也就是它最大的优势。所谓的可扩展性。一方面,是指 Key-Value Store 可以支持极大的数据的存储, 它的分布式的架构决定了只要有更多的机器,就能够保证存储更多的数据。另一方面,是指 它可以支持数量很多的并发的查询。对于 RDBMS,一般几百个并发的查询就可以让它很吃 力了,而一个 Key-Value Store,可以很轻松的支持上千的并发查询。

  Key-Value Store有以下几大特征:

  1、Key-value store:一个 key-value 数据存储系统,只支持一些基本操作,如:SET(key, value) 和 GET(key) 等;

  2、分布式:多台机器(nodes)同时存储数据和状态,彼此交换消息来保持数据一致,可 视为一个完整的存储系统;

  3、数据一致:所有机器上的数据都是同步更新的、不用担心得到不一致的结果;

  4、冗余:所有机器(nodes)保存相同的数据,整个系统的存储能力取决于单台机器(node) 的能力;

  5、容错:如果有少数 nodes 出错,比如重启、当机、断网、网络丢包等各种 fault/fail 都 不影响整个系统的运行;

  6、高可靠性:容错、冗余等保证了数据库系统的可靠性。

  Redis

  Redis是一个key-value存储系统。和memcached类似,它支持存储的value类型更多,包括字符串、链表、集合和有序集合,这些数据类型都支持pop/push,add/remove及取交集并集差集及更丰富操作,而且这些操作都是原子性的。在此基础上,redis支持不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别是redis会周期性把更新的数据写入磁盘或者把修改操作写入到追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value数据库,并提供多种语言的API。

  数据类型

  作为 Key-value 型数据库,Redis 也提供了键(Key)和键值(Value)的映射关系。但是,除 了常规的数值或字符串,Redis 的键值还可以是以下形式之一:  Lists (列表)  Sets (集合)  Sorted sets (有序集合)  Hashes(哈希表)键值的数据类型决定了该键值支持的操作。Redis 支持诸如列表、集合或有序集合的交集、 并集、查集等高级原子操作;同时,如果键值的类型是普通数字,Redis 则提供自增等原子 操作。

  持久化

  通常,Redis 将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据 持久化:使用截图的方式,将内存中的数据不断写入磁盘;或使用类似 MySQL 的日志方式, 记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。

  主从同步

  Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。

redis整理の走进redis世界的更多相关文章

  1. 走进 Redis 的世界

    NoSQL(Not Only SQL) 在现今已经应用非常普遍了,尤其是 Redis 和 MongoDB.我们现在来说说 Redis. 前世 Redis 是一个意大利人 Salvatore Sanfi ...

  2. 面试简单整理之Redis

    179.redis 是什么?都有哪些使用场景? Redis是一个key-value存储系统. 缓存,消息队列,排行榜/计数器,分布式架构,做session共享 180.redis 有哪些功能? 181 ...

  3. 《吐血整理》Redis 性能优化的 13 条军规!史上最全

    Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1) ...

  4. Redis(3) 配置文件 redis.conf

    Redis.conf 配置详解: # Redis configuration file example. # # Note that in order to read the configuratio ...

  5. Redis性能解析--Redis为什么那么快?

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...

  6. Redis集群--Redis集群之哨兵模式

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 搭建R ...

  7. [转帖]Redis性能解析--Redis为什么那么快?

    Redis性能解析--Redis为什么那么快? https://www.cnblogs.com/xlecho/p/11832118.html echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加e ...

  8. redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化

    简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMwa ...

  9. 《【面试突击】— Redis篇》--Redis都有哪些数据类型?分别在哪些场景下使用比较合适?

    能坚持别人不能坚持的,才能拥有别人不能拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>--Redis都有哪些数据类型?分别在哪些场景下使用 ...

随机推荐

  1. 10_java之继承和抽象类

    01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在Java中,类的继承是指在一个现有类的基础上去构建一个新的类, 构建出来的新 ...

  2. excel之工作表工作簿保护暴力撤销

    excal之工作表工作簿保护暴力撤销 excel可以在审阅中设置工作表.工作簿的密码保护,但是当密码忘记或一些特殊情况下需要进行操作. 1.工作簿保护撤销 步骤一:将需要破解的excal文件后缀名改为 ...

  3. C# 泛型编程之泛型类、泛型方法、泛型约束

    来自Hauk的文章 C# 泛型编程之泛型类.泛型方法.泛型约束 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型. 泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为 ...

  4. Android Studio 2.3.3 添加ksoap2的引用(拒绝网上其他的忽悠),也适用于添加其他Jar的引用

  5. python算法之快速排序

    快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...

  6. AngularJS1.6版本中ui-router路由中/#!/的解决方法 - zhuan

    本地编译出的文件可以正常运行,但是服务器编译后到了测试那里路由上就莫名的出现了/#!/,这导致了很多问题. 后来查了下是服务器编译器把AngularJS升级到了1.6版本,而我本地的依旧是1.5. 但 ...

  7. Culling & Depth Testing

    [Culling & Depth Testing] Culling is an optimization that does not render polygons facing away f ...

  8. 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景

    一.应用场景1 最近在一个项目中,用到了Nginx的Memcached模块,所以就在这个系列教程中提前把Memcached模块拿出来写了.另外发现最近我的 博客文章频频被很多用采集器的网站拿走,帮我发 ...

  9. 第十一条理解objc_masgSend的作用

    Objetive-C最基本的的东西就是它的消息机制.Objective-C运行时的最基本的东西就是 objc_msgSend, 它就是负责发送一个消息给对象的C函数.   当你写下面这样的代码时:   ...

  10. Java-集合条件筛选

    import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; impor ...