Redis之NoSql概述

Nosql概述

为什么要用Nosql

1.单机MySQL的年代!

image-20210818010822285

90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!

那个时候,更多的去使用静态网页Html,服务器根本没有太大的压力!

思考一下这种情况下: 整个网站的瓶颈是什么?

1.数据量如果太大,一个机器放不下了!

2.数据超过300万条就需要建立数据的索引(mysql用的B+ Tree)来优化查询,一个机器内存也放不下很大的索引

3.访问量(读写混合),一个服务器承受不了!

只要出现以上三种情况之一,那么就必须要晋级!

2.Memcached(缓存) + Mysql + 垂直拆分(读写分离)

这个我个人理解是解决访问并发量过高的情况

比如下面图中的2号mysql负责写数据,并同步到1号和3号mysql,1号和3号负责读数据,

虽然这样做了,但是网站80%的情况都是在读,每次都要去查询数据库的话就十分的麻烦:比如张三先去查1号商品,李四后来又去查1号商品,同一个sql执行了两次,这样并不高效,我们何不中间做一个缓存层,只要查询的商品不变,第二次就直接从缓存里面取。所以说我们希望减轻数据库的压力,我们可以使用缓存来保证效率!

发展过程:首先肯定想优化MySQL数据结构和索引--> 然后 文件缓存(IO) --> Memcached(当时最热门的技术!)

image-20210818012253478

3.分库分表 + 水平拆分 + MySQL集群

这个我个人理解是解决数据量太大并附带解决访问并发量的问题

就如下图:由于数据量太大我们需要分库分表,做了3个MySQL集群,每个集群里边是主从复制(master-slave),读写分离的结构.

由于分库分表每个集群商品信息表最大量都是整的3分之一,3个集群就分摊了数据量

现在比如我们想查一个商品的信息,先去cache查,没有再去3个集群中查并汇总可得到商品信息!

image-20210818051648936

本质:数据库 (读,写)

早些年MyISAM: 表锁(比如说一张表有100万条数据,我去查张三的密码信息,他会把整个表锁了,其他进程就只能阻塞,就十分影响效率),高并发下就会出现严重的锁问题!

转战Innodb: 行锁,每次查数据只锁这一行而,已这是解决读的压力!

后面慢慢的就开始使用分库分表来解决写的压力! Mysql在那个年代推出了表分区! 这个并没有多少公司使用!

MySQL也推出了MySQL的集群,有了集群之后很好的满足了那个年代的所有需求!

4.如今最近的年代

2010--2020十年之间,世界已经发生了翻天覆地的变化;

MySQL等关系型数据库就不够用了,因为数据量很大,而且变化很快(比如说定位,还有音乐热榜,排行榜等)!

比如说: 浏览量(一下子到10w+)做法肯定不会是直接来一个用户mysql就存一次吧,肯定是先把浏览量放到缓存里面,然后固定的时间(一个小时两个小时)再把它持久化一下,来保证效率跟安全!

还有比如MySQL来存储一些比较大的文件,比如博客,图片等, 会导致数据库表很大,那效率就会很低了!如果有一种数据库专门来处理这种数据,那MySQL的压力就会变得小很多了。

那我们如何来处理这些问题呢?

目前一个基本的互联网项目如下图:

image-20210818062634023

为什么要用NoSQL?

用户的个人信息,社交网络,地理位置,用户自己产生的数据,用户的日志等等爆发式增长,这些我们就没有办法使用关系型数据库去做

这时候我们就需要使用NoSQL数据库了,nosql数据库可以很好的处理以上情况!

什么是NoSQL

NoSQL

NoSQL = Not Only SQL (不仅仅是SQL)

关系型数据库:表格,行,列

泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0时代! 尤其是超大规模的高并发的社区!

使用关系型数据库就暴露出来很多难以克服的问题,Nosql在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!

很多的数据类型比如用户的个人信息,社交网络,地理位置。这些数据类的存储不需要一个固定的格式(就像关系型数据库的行跟列),不需要多余的操作就可以横向扩展的! Map<String,Object> 使用键值对来控制!

NoSQL特点

1.方便扩展(数据之间没有关系,很好扩展!)

2.大数据量高性能(Redis一秒可以写8万次,可以读11万次),而且NOSQL的缓存是记录级别的,是一种细粒度的缓存,性能会比较高!

3.数据类型是多样型的! (不需要事先设计数据库!随取随用!使用MySQL等关系型数据库如果是数据量十分大的表,很多人就无法设计的很好了!)

4.传统的RDBMS和NoSQL的区别如下:

传统的RDBMS
- 结构化组织
- SQL
- 数据和关系都存在单独的表中  row和col
- 数据操作语言,数据定义语言
- 严格的一致性
- 基础的事务
- ......
NoSQL
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储,列存储,文档存储,图形数据库(做社交关系那种系统)
- 最终一致性
- CAP定理  和  BASE理论(异地多活!)
- 保证 高性能,高可用,高可扩
- .......

了解:3V+3高

大数据时代的3V: 主要是来描述问题的

1.海量Volume

2.多样Variety

3.实时Velocity

大数据时代的3高: 主要是来对程序的要求

1.高并发

2.高可扩(随时水平拆分,比如说:机器不够了可以扩展机器来解决这是最简单的一种方式)

3.高性能(保证用户体验和性能!)

真正在公司中的实践:Nosql + RDBMS 一起使用才是最强的,

我们下面来看下阿里巴巴的架构演进!

阿里巴巴演进分析

思考一个问题:阿里巴巴网站上这么多的东西难道都是在一个数据库中的吗?

image-20210818150508335

image-20210818155325055

如果你未来想当一个架构师: 没有什么是加一层解决不了的!

# 1.商品的基本信息
    名称、价格、商家信息;
    关系型数据库就可以解决了! MySQL/oracle (淘宝早年就去IOE了!,王坚:推荐文章:阿里云的这群疯子)
    淘宝内部的MySQL 不是大家用的MySQL
    
# 2.商品的描述信息、评论(文字比较多)
	放在文档型数据库中,MongoDB

# 3.图片
	放在分布式文件系统中,FastDFS
	分布式文件系统很多:
	- 淘宝自己的 TFS
	- Google的 GFS
	- Hadoop的 HDFS
	- 阿里云的  oss云存储
	
# 4.商品的关键字(搜索)
	- 搜索引擎  solr elasticsearch
	- 淘宝用的是 ISearch:  阿里的多隆开发的
	
# 5.商品热门的波段信息(比如:秒杀等)
	- 内存数据库 Redis Tair Memacached...
	
# 6.商品的交易,外部的支付接口
	- 三方应用(支付宝接口)或者说银行的接口	

要知道,一个简单的网页,背后的技术一定不是大家所想的那么简单!

大型互联网应用问题:

  • 数据类型太多了
  • 数据源繁多,经常重构!
  • 数据要改造,大面积改造

解决问题:

image-20210818161852919

image-20210818162108561

这里以上都是Nosql入门概述,不仅能够提高大家的知识,还可以帮助大家了解大厂的工作内容!

NoSql的四大分类

KV键值对:

  • 新浪: Redis
  • 美团:Redis + Tair
  • 阿里、百度: Redis + Memacache

文档型数据库(用的BSON格式,它和json一样):

  • MongoDB (一般必须要掌握)
    • MongoDB是一个基于分布式文件存储的数据库,它是由C++编写的,主要用来处理大量的文档!
    • MongoDB是一个介于关系型数据库和非关系型数据库中中间的产品! MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的!
  • ConthDB

列存储数据库

  • HBase
  • 分布式文件系统

图关系数据库

image-20210818163417774

  • 他不是存图形的,放的是关系,比如: 朋友圈社交网络,广告推荐!
  • 代表的有:Neo4j, infoGrid;

四者对比!

image-20210818163939047

posted @ 2021-08-18 17:29  一万年太久只争朝夕  阅读(243)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css