Nosql概述
单机MySql时代
90年代,访问量不会太大,单个数据库够用!
更多是Html静态网页,服务器没有太大压力
但是:这种情况下,网站的瓶颈是什么?
- 数据量如果太大,单个数据库无法满足
- 数据库的索引(B+Tree)一个机器内存也放不下
- 访问量(读写混合)一个服务器承受不了
只要出现以上情况之一,网站系统就需要升级!
2、Memcached(缓存)+ MySQL + 垂直拆分(读写分离)
网站的80%都是在读,如果每次读取操作都去查询数据库的话,访问量大会对底层数据造成很大的压力,所以可以使用缓存来减轻,并提升效率。
发展过程:优化数据库结构和索引–>文件缓存(IO)–>Memcached(缓存)
3、分库分表 + 水平拆分 + MySQL集群
随着技术和业务的发展,技术要求也越来越高
本质:数据库(读、写)
早些年:MylSAM:表锁,十分影响效率,高并发当中由于会出现十分严重的锁问题
转换成innodb:行锁,有效解决MylSAM的锁问题
------->使用分库分表来解决写的压力
------->MySQL集群的出现,很好满足了当时年代的所有需求
4、当今状况
随着数据量的快速增加,MySQL等关系型数据库已经不够用了!
MySQL使用来存储一些比较大的文件,博客,图片!数据库表很大,就会影响效率!
这时候就需要有一种数据库专门来处理这种大数据,减轻MySQL等关系型数据库的压力!
目前一个基本的互联网项目的构成
为什么要使用NoSQL?
- 由于个人信息,社交网络所等等产生的数据呈爆发式增长!关系型数据库无法满足存储需求
- 这时候使用NoSQL数据库,就能很好处理以上的情况!
什么是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 - 不仅仅是数据 - 没有固定的查询语言 - 键值对存储,列存储,文档存储,图形数据库(社交关系) - 最终一致性 - CAP定理和BASE --异地多活 - 高性能,高可用,高可扩 ...
了解:3V+3高
大数据时代的3V:主要是对问题的描述
- 海量Volume
- 多样Variety
- 实时Velocity
大数据时代的3高:对程序的要求
- 高并发
- 高可扩(随时水平拆分,机器不够用,可以随时增加机器解决)
- 高性能
公司中真正的实践:NoSQL + RDBMS结合使用
NoSQL的四大分类
KV键值对:
- 新浪:Redis
- 美团:Redis + Tair
- 阿里、百度:Redis + memcached
文档型数据库(bson格式和json格式一样)
- MongoDB
- MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档!
- MongoDB是一个介于关系型数据库和非关系型数据库中中间的产品,MongoDB是非关系型数据库中功能最丰富,最像关系型数据库!
- ConthDB
列存储数据库
- HBase
- 分布式文件系统
图关系数据库
- 不是存放图形的数据库,放的是对象之间的关系:比如:朋友圈社交网络,广告推荐
- Noe4j,infoGrid
四者之间关系的对比
Redis入门
概述
Redis是什么?
-
Redis(Remote Dictionary Server ),即远程字典服务;
-
个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,也称之为结构化数据库;
- redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis能干什么?
- 内存存储、持久化、内存中是断电即失的,为了保证数据的安全性,持久化是十分重要的
- 效率高,用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器、计数器(浏览量)
- …
特性:
-
多样的数据类型
-
持久化
-
集群
-
事务
-
…
官方网站
- 英文:https://redis.io/
- 中文:http://www.redis.cn/
Redis安装
Windows环境
- 下载安装包
- 解压后得到一个文件夹
- 文件内容
- 启动服务端
- 启动客户端,连接服务端
但是Redis官方推荐使用Linux环境进行使用
Linux环境
-
下载安装包:
redis-6.2.6.tar.gz
-
Redis的安装包:程序都放置在
/opt
这个目录下
[root@xiaoxiaobin mdb]# mv redis-6.2.6.tar.gz /opt
[root@xiaoxiaobin opt]# ls
containerd redis-6.2.6.tar.gz
- Redis安装包解压缩:
[root@xiaoxiaobin opt]# tar -zxvf redis-6.2.6.tar.gz
- Redis的默认安装路径:
/usr/local/bin
- 基本的环境安装:
#yun -y install gcc 在线安装gcc,这里需要注意的是,Redis6.0版本以上需要gcc5.3版本及以上
#make #环境的安装(如果报错Error,需要查看gcc是否是5.3及以上版本)
#make install #环境安装的确认
- 如果不是5.3及以上版本,则需要升级gcc 9.3
#第一步
yum -y install centos-release-scl
#第二步
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
#第三步
scl enable devtoolset-9 bash
#查看gcc版本
gcc -v
需要注意的是,使用以上指令升级gcc只是暂时的,exit之后或者退出shell之后就会回到之前的版本;
- 如果需要永久升级,则需要改配置文件:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
- 将redis的配置文件
redis.conf
复制一份到usr/local/bin/文件名
下,以后就使用当前目录下的配置文件进行启动和修改。
- redis默认不是后台启动的,所以需要将配置文件修改成后台启动
- 启动redis服务
[root@xiaoxiaobin bin]# redis-server bconfig/redis.conf #后面指的是以哪个配置文件启动redis服务
- 启动redis-cli客户端连接服务端
[root@xiaoxiaobin bin]# redis-cli -p 6379 #因为默认是本地连接,所以-h(host)不需要
- 查看redis进程
[root@xiaoxiaobin /]# ps -ef|grep redis
- 如何关闭redis服务?
127.0.0.1:6379> shutdown
not connected> exit
- 关闭后再次查看redis服务进程:
性能测试
redis-benchmark:官方自带的性能测试工具
- 参数说明:
实例说明
#测试:本地地址,端口6379,100个用户并发,每个用户10万个请求
[root@xiaoxiaobin bin]# redis-benchmark -p 6379 -h localhost -c 100 -n 100000
测试数据说明:
基础知识
redis默认有16个数据库:查看配置文件
-
默认使用的第0个
-
数据库之间可以使用
select
命令来进行切换127.0.0.1:6379> select 2 #切换到第2个数据库 OK 127.0.0.1:6379[2]>
-
可以使用
DBSIZE
来查看当前数据库的大小127.0.0.1:6379[2]> dbsize #查看当前数据库的大小 (integer) 1 127.0.0.1:6379[2]>
-
通过
keys *
查看当前数据库所有的key127.0.0.1:6379> keys * 1) "key:__rand_int__" 2) "counter:__rand_int__" 3) "myhash" 4) "mylist" 5) "name" 127.0.0.1:6379>
-
通过
flushdb
命令可以清空当前数据库里面的所有数据127.0.0.1:6379> FLUSHDB #将第0个数据库清空 OK 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379>
-
通过
flushall
命令可以清空所有数据库里面的所有数据127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> keys * 1) "name" 127.0.0.1:6379[2]> select 0 OK 127.0.0.1:6379> FLUSHALL #在第0个数据库当中使用flushall指令,将第2个数据库中的值也清空了 OK 127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> keys * (empty array) 127.0.0.1:6379[2]>
-
默认端口号为什么是6379
因为redis作者的偶像的英文名字对应键盘上数字是6379
-
redis是单线程的
- Redis是很快的
- 因为Redis是基于内存操作的,CPU就不会是Redis的性能瓶颈。Redis的瓶颈是由机器的内存和网络带宽决定的,所以可以使用单线程去实现。
- Redis是基于C语言编写的,官方提供的数据为10万+的QPS,不比Memecache差
-
Redis为什么单线程还这么快?
- 误区1:高性能的服务器不一定是多线程的
- 误区2:多线程(CPU会上下文切换)不一定比单线程效率高
- CPU>内存>硬盘的速度
- Redis是将所有的数据都存放在内存当中的,所以使用单线程去操作效率是最高的,多线程的话会使得CPU上下文的进行切换,这也会消耗系统是性能;对于内存系统来说,没有上下文切换效率就是最高的,多次读写都是在同一个CPU上,对于内存系统来说这就是最佳的方案