01、Nosql数据库简介

一、Nosql数据库

概念

NoSQL,泛指非关系型的数据库。NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。

随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。

简史

NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。

2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论[2],来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。

2009年在亚特兰大举行的"no:sql(east)“讨论会是一个里程碑,其口号是"select fun, profit from real_world where relational=false;”。因此,对NoSQL最普遍的解释是"非关联型的",强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。

常见Nosql数据库

键值(Key-Value)存储数据库

这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果数据库管理员(DBA)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。

Memcache

很早出现的NoSql数据库,数据都在内存中,一般不持久化,支持简单的key-value模式,支持类型单一,一般是作为缓存数据库辅助持久化的数据库。
 

Redis

几乎覆盖了Memcached的绝大部分功能,数据都在内存中,支持持久化,主要用作备份恢复,除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等,一般是作为缓存数据库辅助持久化的数据库。
 

列存储数据库

这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。

Hbase

HBase是Hadoop项目中的数据库。它用于需要对大量的数据进行随机、实时的读写操作的场景中。
HBase的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过10亿行数据,还可处理有数百万列元素的数据表。
 

文档型数据库

文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高

MongoDB

高性能、开源、模式自由(schema free)的文档型数据库。数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘。虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能。支持二进制数据及大型对象,可以根据数据的特点替代RDBMS ,成为独立的数据库,或者配合RDBMS,存储特定的数据。
 

图形(Graph)数据库

图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。

Neo4j

neo4j是基于Java语言编写图形数据库。图是一组节点和连接这些节点的关系。
 

优势

  • 易扩展
    NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间,在架构的层面上带来了可扩展的能力。
  • 大数据量,高性能
    NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache。NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多。
  • 灵活的数据模型
    NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是——个噩梦。这点在大数据量的Web 2.0时代尤其明显。
  • 高可用
    NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构,通过复制模型也能实现高可用。

劣势

  • 大多数nosql都不支持事务(redis支持,MongoDB不支持)
  • 不遵循SQL标准,无法处理复杂的关系
  • nosql只能保证数据相对一致性,尤其是在数据同步的时候,主从服务器的状态是不一致的

二、Redis

官网介绍

官方网站
Redis是开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。Redis提供数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,地理空间索引和流。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。

使用场景

1、 配合关系型数据库做高速缓存,缓存高频次,热门访问的数据,降低数据库IO;
2、 多样的数据结构存储持久化数据;
3、 分布式Session存储;
4、 分布式锁;
5、 实际业务场景:短信验证码过期、查找附近人、高并发秒杀等等;