1.1 Nosql
1.1.1 概述
单机mysql时代:
90年代,一个基本的网站访问量不会太大,单个数据库足够!
更多的使用静态网页html
网站瓶颈:
- 数据量太大,一个机器放不下
- 数据的索引,一个机器的内存也放不下
- 访问量太大,读写混合,性能问题
缓存时代:
memcached(缓存)+mysql+读写分离(垂直拆分)
网站百分之80情况都是在读,每次都要去数据库查询太麻烦,减轻数据库的压力,可以使用缓存来保证效率(Cache)-------解决读的问题
发展过程:优化Mysql底层结构和索引–>文件缓存(IO操作)—>Memcached 当时最热门的技术!
分库分表+水平拆分+mysql集群:
技术和业务发展同时,对技术要求也越来越高
本质: 数据库(读、写)
早些年 MyISAM:表锁,影响效率,高并发下出现严重的锁问题
早些年Innodb:行锁
慢慢地使用分库分表来解决写的压力!并没有多少公司使用
Mysql集群,很好满足了个别需求
最近的年代:
2010-2020 技术发展迅速(定位、音乐、热榜)
Mysql等关系型数据库就不够用了,数据量很多,变化很快
目前一个基本的互联网项目:
为什么要用Nosql
- 用户的个人信息、地理位置、社交网络、用户自己产生的数据、用户日志等等爆发式增长!
这时候可以使用Nosql数据库处理以上的情况!
1.1.2 什么是NoSQL
NoSQL
NoSQL=not only sql
SQL:表格,行,列
泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发的社区!
NoSQL在当今大数据时代发展迅速,REDIS发展是最快的,、
NoSQL特点
-
方便扩展(数据之间没有关系,很好扩展,没有耦合性)
-
大数据量下的高性能(redis一秒可以写8W次,可以读取11w次,NoSQL的缓存级别,是一种细粒度的缓存,性能会比较高!)
-
多类型(不需要事先设计数据库!随取随用!如果是数据量十分大的表,很多人无法设计)
-
传统RDBM和NoSQL:
结构化组织
SQL
数据和关系都存在单独的表中
数据操作语言,数据定义语言,
严格的一致性
基础的事务
…
不仅仅是数据
没有固定的查询语言
键值对存储,列存储,文档存储,图形数据库(社交关系)
最终一致性
CAP定理、 BASE (异地多活)初级架构师!
基本的高性能、高可用、高可扩展
…
扩展:大数据的3v和3高
描述问题:海量、多样、实时
程序要求:高并发、高可用、高性能
1.1.3 NoSQL的分类
KV键值对
- 新浪:redis
- 美团:redis+Tair
- 阿里、百度:redis+memcache
文档型数据库(bson格式json)
-
MongoDB(一般必须掌握)
基于分布式文件存储的数据库,C++编写,处理大量的文档!
是一个介于关系型数据库和非关系型数据库中间的产品,是非关系型数据库中功能最丰富的,最像关系型数据库的!
-
ConthDB
列存储数据库
- HBase
- 分布式文件系统
图形关系数据库
-
不是放图片的,是放关系的:朋友圈社交网络、广告推荐!
-
Ne04j, infoGrid
NoSQL的对比
1.1.4 Redis
redis–Remote Dictionary Server
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。免费且开源,当前最热门的NoSql之一
能干嘛?
-
内存存储、持久化,内存中是断电即失去,所以说持久化很重要(rdb/aof)
-
效率高、可以用于高速缓存
-
发布订阅系统
-
地图信息分析
-
计时器、计数器(浏览量)
-
…
特性
- 多样的数据类型
- 持久化
- 集群
- 事务
- …
学习中需要用到的东西
- 官网
- 中文网
- 下载地址:通过官网(官方不建议用windows开发使用)
1.2 Redis的安装
1.2.1 windows安装
-
下载安装包 https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100
-
解压到特定文件夹
- 开启Redis:双击运行运行服务(秒级启动)
默认端口:6379
- 使用Redis客户端连接
测试连接:
- ping测试 返回PONG
- 设置一个key值 然后get获取
windows下使用确实简单,但是推荐使用linux去开发使用
1.2.2 Linux安装
1.2.2.1 下载安装包
redis-6.0.6.tar.gz
1.2.2.2 解压安装包
并进入
tar -zxvf redis-6.0.6.tar.gz
配置文件:redis.conf
1.2.2.3 基础环境安装
-
yum install gcc-c++
-
gcc -v
make
(需要一点时间)
报错,原因分析:gcc版本过低,升级一下
# 升级gcc版本
$ 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 -v
重新执行make
make install
(也可以不用执行,确认一下安装)
所有东西已安装好了
1.2.2.4 确认安装路径
Redis默认安装路径:/usr/local/bin
1.2.2.5 复制配置文件
复制Redis配置文件到当前目录下
# 创建配置文件文件夹并复制配置文件
$ mkdir hconfig
$ cp /opt/redis-6.0.6/redis.conf hconfig
之后就使用这个配置文件进行启动
1.2.2.6 配置后台启动
Redis默认不是后台启动的,需要修改配置文件
# 修改daemonize为yes
$ vim redis.conf
1.2.2.7 启动Redis服务
启动Redis服务
通过指定的配置文件启动服务
redis-server hconfig/redis.conf
1.2.2.8 测试连接
测试连接
使用Redis客户端进行连接
# 连接
$ redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name yunmx # 设置一个key
OK
127.0.0.1:6379> get name # 读取一个key
"yunmx"
127.0.0.1:6379> keys * # 查询所有的key
1) "name"
127.0.0.1:6379>
1.2.2.9 查看进程
查看Redis的进程是否开启
ps -ef |grep redis
1.2.2.10 关闭Redis服务
关闭redis服务
shutdown
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> shutdown
not connected> exit
1.3 Redis性能测试工具
1.3.1 redis-benchmark
官方自带的性能测试工具—>
redis-benchmark
命令参数:
简单测试:
# 测试100个并发连接,每个并发20个请求
$ redis-benchmark -h localhost -p 6379 -c 100 -n 20
1.3.2 如何分析
查看分析:
====== PING_INLINE ======
100000 requests completed in 1.46 seconds # 100000次ping请求在1.46s内完成
100 parallel clients # 100的并发量
3 bytes payload # 3字节数据写入
keep alive: 1 # 保证一台服务器测试(单机性能)
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no
0.00% <= 0.5 milliseconds # 0.5毫秒内完成百分之0的请求
1.37% <= 0.6 milliseconds
11.42% <= 0.7 milliseconds
23.22% <= 0.8 milliseconds
35.29% <= 0.9 milliseconds
47.60% <= 1.0 milliseconds
60.01% <= 1.1 milliseconds
72.40% <= 1.2 milliseconds
84.82% <= 1.3 milliseconds
94.78% <= 1.4 milliseconds
97.65% <= 1.5 milliseconds
98.50% <= 1.6 milliseconds
98.95% <= 1.7 milliseconds
99.28% <= 1.8 milliseconds
99.51% <= 1.9 milliseconds
99.67% <= 2 milliseconds
99.99% <= 3 milliseconds
100.00% <= 3 milliseconds # 3毫秒内完成100%的请求(100000)
68587.11 requests per second # 平均每秒完成的请求数