技术是一条很长的路,走到最后除了热爱还需要坚持!
时代背景
基于冯诺依曼体系所述,计算机系统由运算器,控制器,存储器,输入设备,输出设备五个部分组成(考研真题)。但有的资料更细分为七大组成部分,添加了内存和总线。这里规范是五大组成部分,后面的应该是随着时代发展,在Cache出现之后的"新·冯诺依曼体系"。我们在冯诺依曼体系的基础上建立计算机信息时代,走过了光盘(DVD)时代与磁盘时代,再穿过内存时代,最后来到了大数据时代。时代经历了一系列的变迁,技术也随之发展。因为CPU处理器的速度远大于硬盘,因此冯诺依曼系统中设计的计算机存储结构是多级缓存的结构,越靠近计算机的模块,要求处理的速度越快。因此,在磁盘时代中,数据库技术的性能瓶颈就是磁盘的I/O瓶颈。
最初的解决方案是在中间加一层高速cache(一般自带在cpu模块中,为三级缓存),这样可以对cpu的处理速度进行一级降级,不至于让cpu资源闲置。
但是高速缓存cache还是太快了,并且不可能全部将数据都放在电路中,需要在外置层级也放置一部分;因此就出现了下一级缓存——内存,对于处理的资源再次来了一次速度的降级。但是每次切换任务时磁盘还是会阻塞并且内存的速度还是远大于硬盘,这样IO还是会经常处于阻塞的状态。
为了解决这个问题,解决方案是在内存与硬盘中设置一层速度降级的缓存区buffer。处理的单个数据先不提交给内存,而是放到buffer中后面一起提交。当填满标准 I/O 缓存后才进行实际 I/O 操作,称之为全缓冲,比如文件的读写;当在输入和输出中遇到换行符时,执行真正的 I/O 操作,称之为行缓冲,比如键盘的输入输出;不进行缓冲,标准出错情况 stderr 是典型代表,称之为无缓冲,这使得出错信息可以直接尽快地显示出来。
但是缓冲区(buffer)也是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据。buffer解决的是数据"写"的速度问题,cache解决的是“读”的问题;具体参考非阻塞IO与DMA相关知识。
磁盘也有cache,硬盘的cache作用就类似于CPU的cache,它解决了总线接口的高速需求和读写硬盘的矛盾以及对某些扇区的反复读取,可以通过硬盘cache解决常驻内存访问问题。同时,由于机器的内存大小有限(费用与机器配置的原因内存小,但内存具有较为重要的战略地位),出现了一种叫做虚拟内存的技术作为内存的互补,使用虚拟内存地址、页表、地址翻译与内存映射技术将某一部分硬盘做成内存的映射区,也就是逻辑内存。屏蔽了内存与硬盘之间的差异性,具体技术参考Linux的mmap() 函数实现。在Windows上是虚拟内存,在Linux上是Swap分区,VM=RM(Real Memory)+Swap。
上面的多级缓存结构屏蔽了计算机系统之间的处理速度之间大部分差异,但是对于主要负责存储功能的硬盘,存储空间还是大到读取数据缓慢,因此解决办法就是加索引。
我们将磁盘扇区分为4K的一个个小的分区,构成索引。有了这些索引值,我们能通过索引,进行更加便捷的查找。为了我们能够更快的查找,我们将索引使用B+树进行存储。
后面又有某公司发表了某论文,BigTable中首次提到了日志结构树的概念,一般简称为LSM树。后面,也就诞生了各种各种基于LSM引擎的非结构化分布式存储数据。然后,大数据时代就此揭开了序幕。
做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困在原地无法成长。当理解了一些底层原理之后,会发现现在很多热门技术、原理、常见的设计都是在底层基础上发展而来的。
作为大数据时代的前一个时代——NoSQL数据库时代,作为SQL到NoSQL时代的切换,Redis无疑是NoSQL时代的内存型NoSQL数据库中最为耀眼的存在了。它的实现借鉴了上面各个时代发展的多个先进技术,例如:Redis的VM机制原理(当然Redis的VM机制是自己实现的),实现了冷热数据隔离;利用Linux的epoll机制,实现的IO多路复用;利用Linux的Fork函数,实现COW(Copy On Write)等。
个人背景
Redis由出生于西西里岛的意大利人(antirez)发明的,据说当时antirez作者为了追求一个女星,把Redis的默认端口命名为她的名字merz(九格宫键盘)。
antirez早年是系统管理员,2004到2006年做嵌入式工作,之后接触web,2007年和朋友共同创建一个网站LLOOGG.com,并为了解决这个网站的负载问题,而在2009年开发了Redis数据库。
Redis是什么
1、Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
2、官网:redis.io/
3、中文网:www.redis.cn
1、单机Mysql年代(应用 => 数据访问层 => 数据库)
90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!
那个时候,更多的去使用静态网页Html~服务器根本没有太大的压力!
思考一下,这种情况下:整个网站的瓶颈是什么?
1.数据量如果太大,一个机器放不下了!
2.数据的索引(B+ Tree),一个机器内存也放不下
3.访问量(读写混合),一个服务器承受不了~
只要你开始出现以上的三种情况之一,那么你就必须要晋级!
2、Memcached(缓存)+Mysql+垂直拆分(Mycat中间件集群代理)
网站80%都是在读,每次都要去查询数据库额话就十分的麻烦!所以说我们希望减轻数据的压力,我们可以使用缓存来保证效率!
发展过程:优化数据结构索引-->文件缓存(IO)-->Memcached(当时最热门的技术!)
3、分库分表+水平拆分+MySQL集群
技术和业务在发展的同时,对人的要求也越来越高了!
本质:数据库(读和写)
早些年Mysql数据库引擎为MyISAM:表锁,十分影响效率。高并发下就会出现严重的锁问题
现在数据库引擎是InnoDB:行锁
慢慢地就开始使用分库分表来解决写的压力。Mysql在那个年代推出了表分区,但是并没有多少公司使用。
Mysql的集群,很好地解决了那个年代所有的需求!
4、最近的年代——技术爆炸
2010—2020十年之间,世界发生了翻天覆地的变化(定位数据,音乐,热榜)
Mysql等传统关系型数据库就不够用了!数据量大,变化很快~
Mysql有的人使用它来存储一些比较大的文件,比如博客的图片。数据库表大,查询速度慢,效率相对较低!
Mysql的压力就变得十分小(研究如何处理这些问题!)大数据的IO压力,表几乎无法扩张。
5、目前一个基本的互联网项目
为什么要用NoSQL
用户的个人信息,社交网络,地理位置,用户自己产生的数据,用户日志发生爆发式增长!
这时候我们就需要使用NoSQL数据库,NoSQL可以很好地处理以上的情况!
NoSQL = Not Only SQL(不仅仅是SQL)
关系型数据库:表格,行,列(POI)
泛指非关系型数据库,随着web2.0互联网的诞生!传统的关系型数据库很难对付,尤其是超大规模的高并发的社区(站长),暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!
很多的数据类型用户的个人信息,社交网络,地理位置,这些数据类型的存储不需要一个固定的格式!不需要多月的操作就可以横向扩展的!Map
NoSQL特点
1.方便扩展(数据之前没有,很好扩展)
2.大数据量、高性能(Redis官方测评:一秒写8万次,读取11万次。NoSQL缓存记录级,是一种细粒度的缓存,性能会比较高)
3.数据类型是多样型的(不需要事先设计数据库,随取随用,如果是数据量十分大的表,很多人就无法设计了)
4.传统RDBMS和NoSQL
传统的 RDBMS — 结构化数据 — SQL — 数据和关系都存在单独的表中 — 数据操作,数据定义语言 — 严格的一致性 — 基础的事务 — ......
NoSQL — 不仅仅是数据 — 没有固定的查询语言 — 键值对存储,列存储,文档存储,图形数据看(社交关系) — 最终一致性 — CAP定理和BASE理论(异地多活) — 高性能,高可用,高可扩展 — ......
了解:3V+3高
大数据时代的3V:主要是描述问题的
大数据的3高:主要是对程序的要求
真正在公司中的实践:NoSQL+RDBMS一起使用
技术没有高低之分,就看你怎么去使用!(提升内功,思维的提高!)
KV键值对:
新浪 :Redis
美团:Redis + Tair(淘宝开源的Redis企业版)
阿里、百度:Redis + Memcached
应用场景:为内容缓存(第一次访问后的查询源),主要用于处理大数据的高访问负载,也用于一些日志系统等。
文档型数据库(bson和json一样) :
MongoDB(一般必须要掌握)
MongoDB是一个基于分布式文件存储的数据库,C++编写的,主要用来处理大量的文档!
MongDB是一个介于关系型数据库和非关系型数据库中间的产品,MongoDB是NoSQL中功能最丰富,最像关系型数据库的。
ConchDB
CouchDB是分布式的文档型NoSQL数据库,提供数据存储和索引,可在多台机器之间共享与同步数据。
列存储数据库
HBase
Cassandra
分布式文件系统
应用场景: 以列簇式存键,查找速度快,可扩展性强;用于分布式扩展,但功能相对局限。
图关系数据库
它不是存图形的,放的是关系,比如:朋友圈社交网络,广告推荐!
Neo4j,InfoGrid;
应用场景:社交网络,推荐系统等,专注于构建关系图谱。利用图论中相关算法,例如Prim、Dijkstra算法(普里姆算法、迪杰斯特拉算法,也叫最短路径算法与最小生成树算法,统称为广度优先算法)。广度优先算法(BFS,Breadth First Search)是基于队列实现的,深度优先算法DFS(Depth First Search),是基于栈实现的,可以与递归(算法的实现形式,一般只有一个解,得到解的过程中会判断条件是否成立,慢慢收敛状态(剪枝))联合在一起。经典DFS算法应用:N皇后问题、黑白N皇后问题、木棍拼三角形问题、引爆炸弹问题以及数独问题,经典BFS算法应用:A星算法等。图形数据库常用于图结构算法构建的数据存储,最短路径寻址、N度查找,一般需要对整个图做计算才能得出需要的信息,一般这种结构不太好做分布式集群方案。