一、 Nosql概述
1.1 为什么要用Nosql
- 现在是大数据时代,一般的数据库无法进行分析与处理了
单机MySQL的时代
90年代,一个网站访问量不会很大,单机版的数据库完全够用。
在这种情况下 ,整个网址的瓶颈是什么?
- 数据量如果太大,一个机器放不下。
- 数据的索引(B+Tree),一个机器的内存也放不下。
- 访问量(读写混合),一个数据库承受不了
就有了如下解决方案。
memcached(缓存)+mysql+垂直拆分
网站80%的情况是读,每次都要去查询数据库,导致效率较低。为了减轻数据库的压力,使用缓存保证效率。缓存是用来解决读的问题。
数据库的发展过程:
优化数据结构和索引->文件缓存(I/O)->memcached
Nosql特点
解耦
- 方便扩展。数据之间没有关系,很好扩展。
- 大数据量高性能。redis一秒写8万次,读11万次。Nosql的缓存是记录级别的,是细粒度的缓存,性能较高。
- 数据类型是多样的 。不需要事先设计数据库,随取随用。如果是数据量十分大的表,很多人就无法设计了
- 没有固定的查询语言
- 键值对存储,列存储,文档存储,图形数据库
- 高性能,高可用,高可扩
大数据的3V+3高
大数据的3V:主要是描述问题的
1.海量Volume
2.多样Variety
3.实时Velocity
大数据的3高:主要是对程序的要求
1.高并发
2.高可扩
3.高性能
真正公司项目中一定是:Nosql+RDBMS联合使用
二、 阿里巴巴演进分析
- mongodb是文档型数据库
- 内存数据库有redis,memcache
三、 Nosql四大分类
KV键值对
- redis
文档型数据库,bson格式和json格式
- mongodb数据库,是基于分布式文件存储的数据库,主要用来处理大量文档。mongodb是介于关系型数据库和非关系型数据库中间的产品,mongodb是非关系型数据库中功能最丰富,最像关系型数据库的。
列存储数据库
- HBase
- 分布式文件系统
图关系数据库
四、 redis概述
4.1 redis是什么
Redis(Remote Dictionary Server ),即远程字典服务,是nosql的技术之一。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
4.2 redis能干嘛?
- 内存存储,持久化,内存中是断电即失的。所以说,持久化很重要(rdb,aof)
- 效率高,可以用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器,计数器
4.3 redis特性
- 多样的数据类型
- 持久化
- 集群
- 事务
redis官网:https://redis.io/
五、 redis安装
5.1 官网下载redis安装包
redis官网:https://redis.io/
redis版本是redis-6.2.6.tar.gz
/etc/profile文件
- /etc/profile文件是系统的环境变量文件,在这里修改环境变量是对所有的用户起作用
- 在profile文件中修改的内容,需要注销系统后,才能生效
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do #遍历/etc/profile.d/目录下的所有文件
if [ -r "$i" ]; then #判断文件是否可读
if [ "${-#*i}" != "$-" ]; then #如果是交互式的shell,具有-i参数
. "$i" #执行脚本
else
. "$i" >/dev/null #丢弃脚本输出
fi
fi
done
标准输出与标准错误输出
0——标准输入(stdin)
1——标准输出(stdout)
2——标准错误(stderr)
2>/dev/null
意思就是把错误输出到“黑洞”。
1>/dev/null 2>&1
意思就是把标准输出重定向到“黑洞”,还把错误输出2重定向到标准输出1,也就是标准输出和错误输出都进了“黑洞”。
2>&1 >/dev/null
意思就是把错误输出2重定向到标准出书1,也就是屏幕,标准输出进了“黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕。
5.2 解压redis安装包
上传redis安装包
将redis安装包上传到/opt目录下,并解压。
5.3 环境安装
安装gcc编译器
yum install gcc-c++
编译
make
安装
make install
编译后的redis可执行文件在/usr/local/bin目录下。
将redis.conf文件拷贝到当前目录
redis的配置文件路径:/usr/local/bin/zconfig/redis.conf
cp /opt/redis-6.2.6/redis.conf zconfig/
redis默认不是后台启动,需要改为后台启动,否则程序一启动就关闭
将daemonize参数改为yes
启动redis
进入到/usr/local/bin目录。
执行
redis-server zconfig/redis.conf
检验是否可以连接redis
[root@zhouhao bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
输入ping之后,可以返回PONG,代表redis启动、连接成功。
redis的一些语法
- set
- get
- keys *:查看所有的key
查看redis的进程是否开启
[root@zhouhao ~]# ps -ef | grep redis
root 15466 1 0 11:36 ? 00:00:00 redis-server 127.0.0.1:6379
root 15481 15446 0 11:40 pts/0 00:00:00 redis-cli -p 6379
root 15503 15485 0 11:46 pts/1 00:00:00 grep --color=auto redis
关闭redis
127.0.0.1:6379> shutdown #关闭redis
not connected> exit #退出redis连接
[root@zhouhao bin]#
再次查看redis的进程是否存在
[root@zhouhao ~]# ps -ef | grep redis
root 15510 15485 0 11:51 pts/1 00:00:00 grep --color=auto redis
六、 redis性能测试
redis-benchmark是官方自带的压力测试工具
6.1 测试100个并发,每个并发100000个请求
redis-benchmark -p 6379 -c 100 -n 100000
七、 redis基础知识
7.1 redis的16个数据库
redis有16个数据库,默认使用第0个数据库,可以使用select进行数据库的切换。
127.0.0.1:6379> select 3 #切换数据库
OK
127.0.0.1:6379[3]> dbsize #查看数据库的大小
(integer) 0
127.0.0.1:6379[3]>
查看数据库中所有的key,keys *
127.0.0.1:6379[3]> keys *
1) "name"
127.0.0.1:6379[3]>
清空当前的数据库,flushdb
127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]>
清空所有的16个数据库,flushall
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>
7.2 redis是单线程的
redis是基于内存操作的,CPU不是redis的性能瓶颈,机器的内存和网络带宽会影响redis的速度。
redis是单线程的,为什么这么快?
- 误区1:多线程一定比单线程效率高。
- 误区2:高性能的服务器不一定是多线程的。
- 核心:redis中的数据是存储在内存中的,所以使用单线程操作,效率就是最高的。
- 在多线程中,CPU的上下文切换会影响数据处理速度。对于内存系统,如果没有上下文的切换,效率就是最高的。
CPU速度快于内存的速度,快于硬盘的速度。