一、NoSQL概述
- NoSQL,指的是非关系型数据库。NoSQL有时也称为Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
1、为什么要用NoSQL
1、单机mysql的年代
- 在早期90年代,一个网站的访问量一般都不大,用单个数据库完全够用。
- 在那个时代,网站更多使用的都是静态网页,动态交互型界面使用不多。
DAL:Data Access Layer(数据访问层-Hibernate,Mybatis)
但使用该架构的情况下,也随之存在不少问题,网站存在对应的瓶颈
- 数据量的总大小一个机器放不下时
- 数据的索引(B+Tree)一个机器的内存放不下时
- 访问量(读写混合)一个实例Mysql不能接受
只要出现上述三种情况之一,可能就会导致网站的无法正常使用,只能对数据库的整体架构进行重构
2、memcached(缓存)+mysql+垂直拆分(读写分离)
- 随着网站访问量的不断上升,几乎大部分使用单机mysql架构的网站在数据库上都出现了性能问题
- 随之而来的实际,使用缓存技术来环节数据库的压力,优化数据库结构和索引。。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。
- 在这个时候,Memcached就自然的成为一个非常时尚的技术产品。
- 网站80%的情况都是在读,每次都要去查询数据库的话就十分的麻烦!所以说我们希望减轻数据的压力,我们可以使用缓存来保证效率!
- Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端。
- 由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。
3、分库分表+水平拆分+mysql集群
- 本质:数据库的读写
- 早些年的MyISAM:表锁,十分影响效率,高并发情况下就会出现严重的锁问题
- 当下的转战Innodb:行锁
- 技术和业务在发展的同时,对人的要求也越来越高!
- 慢慢的就开始使用分库分表来解决写的压力!MySQL在某个年代推出了表分区,但并没有什么公司用!
- 为满足需求,随之诞生的则是MySQL的集群,很好满足那个时代的所有需求!
4、如今最近的年代
- 2010-2020十年之间,世界已经发生了翻天覆地的变化;(定位,音乐。热榜也是一种数据)
- MySQL等关系型数据库就不够用了!当下数据量很多(大数据时代),变化很快!
- MySQL用它存储一些比较大的文件,效率就低了,比如博客,图片等!如果有一种数据库去专门处理这种数据。
最前面的是企业级防火墙,后面通过负载均衡主机(软负载:Nginx,硬负载:F5)在 web 服务器集群之间进行调度,再由具体的 web 服务器(Tomcat)去访问缓存,访问数据库。
为什么要nosql
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。
2、什么是NoSQL
NoSQL
NoSQL = Not Only SQL(不仅仅是SQL)
关系型数据库:表格 (行 ,列)
泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发的社区! 暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!
很多的数据类型用户的个人信息,社交网络,地理位置。这些数据类型的存储不需要一个固定的格式!不需要多余的操作就可以横向扩展的 ! Map<String,Object> 使用键值对来控制!
NoSQL特点
解耦!!
-
方便拓展(数据之间没有关系,很好扩展!)
-
大数据量高性能(Redis一秒写8万次,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高)
-
数据类型是多样型的!(不需要事先设计数据库!随取随用!如果数据量非常大的表,很多人就无法设计了)
-
传统RDBMS(关系型数据库)和NoSQL的对比
传统的 RDBMS - 高度组织化结构化数据 - 结构化查询语言(SQL) - 数据和关系都存储在单独的表中。 - 数据操纵语言,数据定义语言 - 严格的一致性 - 基础事务 - .....Nosql - 代表着不仅仅是SQL - 没有声明性查询语言 - 没有预定义的模式 - 键值对存储,列存储,文档存储,图形数据库 - 最终一致性,而非ACID属性 - 非结构化和不可预知的数据 - CAP定理(C:强一致性 A:高可用性 P:分布式容忍性) - 高性能,高可用性和可伸缩性
理解:3V+3高
大数据时代的3V:主要是描述问题的
- 海量Volume
- 多样Variety
- 实时Velocity
大数据时代的3高:主要是对程序的要求
- 高并发
- 高可扩
- 高性能
真正在公司中的实践:NoSQL + RDBMS 一起使用才是最强的,阿里巴巴的架构演进!
3、阿里巴巴演进分析
思考问题:这么多东西难道都是在一个数据库中的吗?
技术急不得,越是慢慢学,才能越扎实!
开源才是技术的王道!
任何一家互联网的公司,都不可能只是简简单单让用户能用就好了
大量公司做的都是相同的业务(竞品协议)
随着这样的竞争,业务是越来越完善,然后对于开发者的要求也是越来越高
如果你未来相当一个架构师: 没有什么是加一层解决不了的
# 1、商品的基本信息
名称、价格、商家信息
关系型数据库就可以解决了! MySQL / Oracle (淘宝早年就去IOE了!- 王坚:推荐文章:阿里云的这群疯子)
淘宝内部的 MySQL 不是大家用的 MySQL
# 2、商品的描述、评论(文字比较多)
文档型数据库中,MongoDB
# 3、图片
- 分布式文件系统 FastDFS
- 淘宝自己的 TFS
- Google的 GFS
- Hadoop HDFS
- 阿里云的 oss
# 4、商品的关键字 (搜索)
- 搜索引擎 solr elasticsearch
- ISearch:多隆(多去了解一下这些技术大佬!)
- 所有牛逼的人都有一段苦逼的岁月!但是你只要像SB一样的去坚持,终将牛逼!
# 5、商品热门信息
- 内存数据库
- Redis、 Tair、Memache...
# 6、商品的交易,外部的支付接口
- 三方应用
.....
要知道,一个简单地网页背后的技术一定不是大家所想的那么简单
大型互联网应用问题
- 数据类型太多了
- 数据源繁多,经常重构
- 数据要改造,大面积改造
解决问题:
这里以上都是NoSQL入门概述,不仅能够提高大家的知识,还可以帮助大家了解大厂的工作内容
4、NoSQL的四大分类
-
键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA(数据库管理员)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB
-
列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
-
文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,目前已经开源
-
图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。 如:Neo4J, InfoGrid, Infinite Graph
对比
二、redis入门
1、概述
redis是什么??
Redis(Remote Dictionary Server ),即远程字典服务 !
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
免费和开源!是当下最热门的 NoSQL 技术之一!也被人们称之为结构化数据库!
redis能干嘛?
- 内存存储、持久化,内存中是断电即失、所以说持久化很重要(rdb,aof)
- 效率高,可以用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器、计数器(浏览量!)
- ...
特性
- 多样的数据类型
- 持久化
- 集群
- 事务
- ...
学习中用到的东西
-
官网:redis.io/
-
中文网:www.redis.cn/
-
下载地址:redis.io/download/
注意:Wdinow在 Github上下载(停更很久了!)
Redis推荐都是在Linux服务器上搭建的,我们是基于Linux学习!
2、WIndows下Redis的安装
1、下载压缩包直接使用即可。下载地址:github.com/tporadowski…
2、打开server服务,再使用client去连接,即可直接命令行使用。
记住一句话,Window下使用确实简单,但是Redis 推荐我们使用Linux去开发使用!
3、Linux安装
- 直接找到官网链接对应的下载安装方法 链接:redis.io/docs/latest…
- 使用snap再Ubuntu上安装
sudo apt update
sudo apt install redis-tools # for redis-cli
sudo snap install redis
- 一些常见的snap操作redis的命令
sudo snap start redis
sudo snap stop redis
sudo snap restart redis
sudo snap services redis
- 但这里我们就不使用这种方式了,我们可以去自己下载对应的源码编译
wget https://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
make
make install
- 然后就是可以进入我们默认的安装路径
/usr/local/bin/,可以发现已经成功安装上了
- 然后我们就可以去创建一个文件夹专门去存放我们的配置文件,方便我们之后的使用
mkdir myconfig
cp /home/ubuntu/tools/redis/redis-stable/redis.conf myconfig/
- 修改配置文件,开启守护进程,使redis能够在后台运行
- 使用我们自己的配置文件去启动redis服务
root@VM-16-10-ubuntu:/usr/local/bin# redis-server myconfig/redis.conf
- 成功完成启动和连接
- 关闭redis并退出
127.0.0.1:6379> shutdown
not connected> exit
root@VM-16-10-ubuntu:/usr/local/bin#
4、压力测试
- redis-benchmark是一个压力测试工具
- 官方自带的性能测试工具
我们来简单测试一下
测试100个并发,100个请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100
中间的部分就是不同毫秒时处理总数据的百分比以及延迟;最后的部分就是算出的平均吞吐量了。总体来说,吞吐速度还是很不错的。
5、基础知识
- redis默认有16个数据库,这可以在redis.conf配置文件中可以看到
- 可以在配置文件中修改databases的值去修改默认的数据库的数量
- 数据库默认使用的是第0个数据库
- redis使用时可以使用select去切换数据库
127.0.0.1:6379> dbsize # 查看db大小
(integer) 9
127.0.0.1:6379> keys * # 查看当前数据库所有的key
1) "key:__rand_int__"
2) "c"
3) "b"
4) "mystream"
5) "myhash"
6) "counter:__rand_int__"
7) "a"
8) "d"
9) "mylist"
127.0.0.1:6379> select 3 # 切换至3号数据库
OK
127.0.0.1:6379[3]> # 切换成功
- 清空当前数据库
flushdb - 清除所有数据库
flushall
Redis 是单线程的!
明白Redis是很快的,官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所以就使用了单线程了!
Redis 是C 语言写的,官方提供的数据为 10W+ 的QPS,完全不比同样是使用 key-vale的Memecache差!
Redis为什么单线程还这么快?
1、误区1:高性能的服务器一定是多线程的?
2、误区2:多线程(CPU上下文会切换!)一定比单线程效率高!
速度:CPU>内存>硬盘
核心:redis 是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,
多线程(CPU上下文会切换:耗时的操作!!!),对于内存系统来说,如果没有上下文切换效率就是最高的!
多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!