1.1 为什么使用NoSql
在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。但是随着用户数的增长,Tomcat和数据库之间竞争资源,单机性能不足以支撑业务。于是将Tomcat与数据库分开部署,Tomcat和数据库分别独占服务器资源,显著提高两者各自性能。
新的问题:随着用户数的增长,并发读写数据库成为瓶颈。
通过引入本地缓存和分布式缓存,通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力,其中设计的技术包括:使用memcached作为本地缓存,使用Redis作为分布式缓存。
注意:缓存抗住了大部分的访问请求,随着用户数的增长,并发压力主要落在单机的Tomcat上,响应逐渐变慢。
在多台服务器上分别部署Tomcat,使用反向代理软件(Nginx)把请求均匀分发到每个TOmcat中。
新的挑战:反向代理使应用服务器课支持的并发量大大增加,但并发量的增长也意味着更多请求穿透到数据库,单机的数据库最终成为瓶颈。
由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可拓展性。Mysql的master-slave模式成为这个时候的网站标配。
1.2 什么是NoSql
NOSQL(Not Only SQL),泛指非关系型的数据库。在互联网web2.0网站的兴起,传统的关系型数据库在应付特别是超大规模和高并发类型网站已经显得力不从心,暴露了很多难以克服的问题。
1.2.1 结构化数据和非结构化数据
结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也被成为行数据。
非结构化数据,指的是数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二位逻辑表来表现的数据,例如办公文档、图片、HTML等。
1.3 NoSQL四大分类
1.3.1 KV型(Redis)
KV型NOSQL顾名思义就是以键值对形式存储的非关系型数据库,是最简单,最容易理解也是大家最熟悉的一种NOSQL。它的特点是:数据基于内存,读写效率高;KV型数据,时间复杂度为O(1),查询速度快。
1.3.2 列式(HBase)
列式NoSql,大数据时代最具代表性的技术之一。查询时只有指定的列会被读取,不会读取所有的列;列数据被组织到一起,一次磁盘IO可以将一列数据一次性读取到内存中。
1.3.3 文档型(MongoDB)
文档型NoSql指的是将半结构化数据存储为文档的一种NoSql,文档型Nosql通常以JSON或者XML格式存储数据。
关系型数据库是按部就班的每个字段一列存,在MongoDB里面就是一个JSON字符串存储。
1.4 什么是Redis
Redis是一个使用ANSIC编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。
特点:
基于内存运行,性能高效;
支持分布式,理论上可以无限拓展;
key-value存储系统;