简单介绍
Redis是当下最流行的NoSQL数据库。在Redis中,数据的存储格式是以键值对的方式进行存储的。在键值对的存储形式中,值除了是常见的字符串,也可以是类似于Json对象的形式,或者是List,Map等数组格式,或者是其他的复杂类型,所以键值对的存储方式也足够满足我们日常的使用:
像这种的,并不是以标准的表的格式存储的数据库,而是使用自身特定的数据结构进行存储的数据库叫做NoSQL的数据库。当然对于NoSQL的定义要更加的广泛,现在暂时就用存储结构将SQL和NoSQL数据库进行简单的区分即可。
认识NoSQL
SQL:关系型数据库
NoSQL:非关系型数据库,或者说,不仅仅是数据库
两者的区别
首先,SQL的S表示的是(Structured)结构化的意思,也就是说关系型数据库中的数据存储格式都是非常的规整的表的格式,并且我们还会加上一些约束让其中的数据更加的规范标准。
NoSQL的数据类型就相对比较松散,对于数据的存储并没有太强的约束,比如Redis的数据类型就是键值对的类型,其中键值的数据类型可以任意定义。或者对于ES这类的文档型,他们的数据存储格式就是JSON格式的存储方式。
除了数据的不同,当我们在定义SQL的表结构的时候,一般定义好了之后就不会轻易地修改表的结构,容易出现对应的业务无法正常实现的风险,或者数据发生错误,但是对于NoSQL来说,字段的数量可以随时的添加修改,我们只关注对应的字段,至于其他的字段是多了或者少了都对我们没有影响。
其次,SQL的第二个特点就是(Relational)关联,这个特性在之前我们学习MySQL时接触到的外键约束和多表查询,或者在做Java程序的时候学过的多对多关系中都有体验,比如我们用一个用户表,一个订单表,一开始这两张表并没有关系,但是当业务开始实现,一个用户购买了一个商品,这时候就会出现一张中间表去维护某个用户购买了某样商品,这时候表与表之间就开始有了关联,当我们再想去随意的操作关联表中的数据的时候,可能会因为某个表中的关联数据而导致无法正常的更改数据。
而对于NoSQL来说,他不会刻意的去维护表与表之间的关系,甚至对于数据与数据之间的关系都非常的模糊,如果想要将两个数据联系起来,一般的方式会选择嵌套,即在一个JSON对象中再加入一个JSON对象的方式去将多个对象进行联系。
然后就是查询方式的区别,SQL数据库的查询方式是使用SQL语言进行查询,但是对于NoSQL来说,查询语言并不是固定的,而是不同的 NoSQL数据库都有不同的查询方式,并没有一个统一的格式。各有各的好处,比如我们的SQL查询语言比较统一,基本上一套SQL语言可以在各种关系型数据库中使用,而非关系型数据库虽然不统一,但是查询的方式多半都比较符合程序员的编码方式,所以学习起来也并不是非常的困难。
还有就是事务方面的区别,所有的关系型数据库的事务,都满足ACID的特性,而非关系型数据库,并不能完美的实现事务,只能实现基本的事务的一致性。
除了以上这些大方向的差异,还有一个小的差异,比如SQL一般会将数据持久化到硬盘中,而非关系型数据库会将数据暂时存储在内存中,当触发持久化的操作的时候,才会真正的将数据落盘。以及在关系型数据库设计之初,就并没有为分布式做考虑,也就是说,当你需要提升数据库的性能的时候,只能不断地增加本机的性能,这种方式就是垂直扩展。但是NoSQL之所以现在发展的很快,就是因为它搭上了大数据的快车,大数据的对于数据的要求量非常的大,所以大数据的组件一开始的设计就是为了能够水平扩展,也就是由多台设备组成一个集群,从而协同运作提升效率,NoSQL的数据库也满足这一分布式的特性,从而和大数据一拍即合。
当然,根据不同的业务需求去选择不同的数据库也是非常重要的,所以了解了这些两者的不同点之后才能更好地发挥不同组件的作用。