天天看点

程序员不得不学的大型网站架构技术细节:后端架构非关系型数据库

作者:程序员高级码农II

非关系型数据库

前面曾提到,非关系型数据库可以为关系型数据库减轻压力,也可作为关系型数据库的补充。而非关系型数据库并没有明确的范围和定义,

是一类数据库的总称。非关系型数据库一般包括以下几类:

·键值存储非关系型数据库,如Redis、Memcached等;

·列存储非关系型数据库,如HBase、Cassandra等;

·文档型非关系型数据库,如MongoDB、CouchDB等;

·图形非关系型数据库,如Neo4J、InfoGrid等。

以上非关系型数据库的分类是按存储的数据结构区分的,但即使是相同类型的非关系型数据库,其使用规则和工作原理都是大相径庭的,所以在选用具体的非关系型数据库时,需要根据实际问题和团队习惯而定。本节将介绍各类非关系型数据库及其应用场景。

键值存储非关系型数据库

键值(Key-Value)存储非关系型数据库的数据按照“键值对”的形式进行组织、索引和存储,其存储的数据结构类似于哈希表。由于数据结构相当简单,所以此类非关系型数据库一般被用作记录一些零碎或简单的数据,如会话信息、配置参数、暂存信息等。

说明:“键值对”的具体形式在不同的键值存储非关系型数据库中有所不同,以Redis为例,Redis的“键值对中的值”支持字符串、哈希表、列表、集合、有序集合等数据类型。

仅从数据结构类型看的话,此类数据库存在的意义不大,因为关系型数据库也能兼容这种数据结构。键值存储非关系型数据库的优势不是它的数据结构特性,而是它的性能。因为大部分的键值存储非关系型数据库都是内存型数据库,也就是说数据是直接被存储在内存上的,所以数据的存取性能会非常高。

由于键值存储非关系型数据库的性能特性,所以它常常被用作网站系统的缓存容器,以减轻关系型数据库的并发压力。目前比较流行的键值存储非关系型数据库有Redis、Memcached等。

说明:Redis一般用于缓存简单的数据,Memcached除了可以缓存数据外,还可以缓存图片等文件。一般来说,网站系统中使用Redis作为缓存容器就足够了,因为图片等文件一般交由CDN进行缓存。

一般来说,使用键值存储非关系型数据库作为缓存容器的目的有两个,一是降低数据的读频率,二是降低数据的更新频率。

1.降低数据的读频率

引用Redis等键值存储非关系型数据库可以对预期访问量大并且更新概率较少的数据进行缓存,这样可以大大减小关系型数据库的查询压力。针对后端应用程序而言,使用键值存储非关系型数据库减轻数据读频率的工作流程如图4.81所示。

程序员不得不学的大型网站架构技术细节:后端架构非关系型数据库

图4.81 使用键值存储非关系型数据库降低数据读频率的工作流程

说明:缓存的具体实现可以直接使用Redis等键值存储非关系型数据库,也可以使用一些缓存框架(如Spring Boot中可以使用ehcache实现缓存)。

2.降低数据的更新频率

针对某些需要频繁更新的数据(如点击量、分享量等数据),可以引用Redis等键值存储非关系型数据库作为数据中转站,更新数据时不直接更新数据库中的数据,只更新Redis等键值存储非关系型数据库中的数据,一段时间后,再把数据更新到数据库中,如图4.82所示。

程序员不得不学的大型网站架构技术细节:后端架构非关系型数据库

图4.82 使用键值存储非关系型数据库降低数据更新频率的工作流程

说明:图4.82中的定时程序可以是后端应用程序中的定时任务,但是后端应用程序可能被部署在多个服务器上,如果是这样的话,则需要使用Quartz等分布式定时器框架以避免发生定时任务被多次执行的情况。

列存储非关系型数据库

列存储非关系型数据库是以列相关进行存储的数据库,主要适用于海量数据的存储。目前比较流行的列存储非关系型数据库有HBase、Cassandra等。相对于关系型数据库的按行存储方式,列存储非关系型数据库是按列来存储数据的,如图4.83所示。

相对于行式存储的关系型数据库,列存储非关系型数据库有以下两个特点,这两个特点只有在处理海量数据时才能体现出来。

·高效的存储空间利用率,由于一列内的数据类型是一致的,所以列存储非关系型数据库可以更高效地压缩数据。

程序员不得不学的大型网站架构技术细节:后端架构非关系型数据库

图4.83 按行存储与按列存储

·当搜索条件较少时,查询效率高,因为数据是按列存储的,可以通过指定列数据快速获取数据所在的位置。如“获取李四的身高”这个查询,查询过程不需要遍历所有的数据,在“姓名”列中找到“李四”处在第二行,然后在“身高”列直接获取第二行数据即为“李四的身高”。

但是,列存储非关系型数据库不适合随机更新(更新的消耗较大),不支持事务回滚。因此,列存储非关系型数据库适合存储一些存储量大、几乎不更新、查询时条件较少的数据,如日志、消息记录等。

文档型非关系型数据库

文档型非关系型数据库是指将半结构化数据存储为文档的一种数据库。

文档数据库通常以XML、JSON等格式存储数据。简单地说,文档型非关系型数据库允许存储XML、JSON等格式的数据。目前比较流行的文档型非关系型数据库有MongoDB、CouchDB等。

说明:半结构化数据是结构化数据的一种形式,但它并不符合关系型数据库等以“表形式”关联起来的数据模型结构,常见的半结构化数据有XML数据、JSON数据等。

由于文档型非关系型数据库支持存储JSON等格式的数据,所以在数据结构上非常灵活,增减字段都变得简单。但是,大多数文档型非关系型数据库都不支持事务,而且不支持复杂查询。

因此,文档型非关系型数据库适合存储量很大(或以后会变得很大)、结构不明确(字段需要不断调整)的数据。

图形非关系型数据库

图形非关系型数据库是应用图形理论存储实体之间关系的数据库。关系型数据库不适合存储“关系复杂”的数据,随着数据量增加,其查询复杂性会逐渐超出控制。最常见的例子为社交网络中的人际关系,如图4.84所示,其中,连线的为好友关系。在面对这些“关系复杂”的数据,且其数据量很大(或以后会变得很大)时,基本上只能用图形非关系型数据库。目前比较流行的图形非关系型数据库有Neo4J、InfoGrid等。

程序员不得不学的大型网站架构技术细节:后端架构非关系型数据库

图4.84 社交网络中的人际关系

小结

后端应用程序在整个网站系统中处于“司令塔”的位置,网站系统的质量很大程度上取决于后端应用程序。由于后端应用程序的重要性和复杂性,出现了很多技术框架,很多人都沉迷于学习各种各样的技术框架,甚至认为后端应用程序就是在使用现成框架的基础上,用代码整合数据库、Redis、第三方应用等的胶水程序。而事实上,任何技术框架都只是解决问题的手段,使用某个技术也不能成为后端应用程序的目的,所以使用什么技术框架不重要,其是否能解决所需要解决的问题才是最重要的。

本章介绍了后端架构需要关注的细节及对应的解决方法,其中包括规整化、数据库和非关系型数据库。本章尽量以问题出发,进而介绍对应的解决方法,希望读者在了解这些问题和解决方法后,对后端架构能有一个清晰的认知。

本章主要介绍的是后端应用程序本身以及在后端应用程序开发过程中需要注意的细节。

本文给大家讲解的内容是大型网站架构的技术细节:后端架构非关系型数据库

  1. 下篇文章给大家讲解的内容是大型网站架构的技术细节:云计算服务架构,云计算服务的工作原理
  2. 感谢大家的支持

继续阅读