Nosql
现在处于大数据时代.
大数据一般的数据库无法进行分析处理的
大数据时代的3V:主要是描述问题的
1.海量Voume
2.多样Variety
3.实时Velocity
大数据时代的3高,主要是对程序的要求
1.高并发
2.高可扩
3.高性能(保证用户体验和性能)
NoSQL的四大分类
KV键值对:
- 新浪:Redis
- 美团:Redis+Tair
- 阿里,百度:Redis+memecache
文档形数据库:
MongoDB(一般必须要掌握)
- MongoDB,是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档
- MongoDB,是一个介于关系型数据库和非关系型数据中中间的产品,MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的
ConthDB
列存储数据库
- HBase
- 分布式文件系统
图关系数据库
- 他不是存图形,放的是关系,比如:朋友圈社交网络,广告推荐!
- Neo4j,infoGrid
Redis
Redis是什么?
Redis(Remote Dictionary Server) ,远超字典服务,开源的,用c语言编写,支持网络,基于内存可持久化的日志型,Key-Value数据库.并提供多种语言的API.
redis会周期性的把更新的数据写入磁盘或者修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步
免费和开源!当下最热门的NoSql技术之一,也被称为结构化数据库.
Redis能干嘛?
1.内存存储,持久化,内存中是断电即失,所以持久化很重要(rdb,aof)
2.效率高,可以用于高速缓存
3.发布订阅系统
4.地图信息分析
5.计时器,计数器(浏览量等)
特性
1.多样的数据类型
2.持久化
3.集群
4.事务
.......
学习中需要用到的东西
redis中文:http://redis.cn/
redis推荐都是再linux服务器上搭建的,基于linux学习
redis官网:https://redis.io/
redis中文官网:http://redis.cn/
linux安装redis,我将redis安装在阿里云服务器的centos7.x系统上,用xshell6连接服务器,xftp6传送数据
先下载redis6.0 用xftp将安装包放入linux系统中(我放在opt目录) 运行安装包
redis6需要gcc5.3以上版本
centos7还是4.8.5
安装scl源
yum install centos-release-scl scl-utils-build
安装gcc9
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
gcc -v查看版本
解压源码包
tar zxvf redis-6.0.5.tar.gz
然后全程 y
配置文件在 /opt/redis-6.0.5
我们备份配置文件 到/home中
然后修改/home中的redis-conf
vim redis-conf
requirepass xxxxxxxxxx # 设置访问密码
注释掉 bind 127.0.0.1 # 设置redis为任何ip都可访问,如需设置指定ip,则添加bind
protected-mode no # 设置为no,否则不能保证全网段进行访问
daemonize yes # 设置为yes,保证以守护进程的方式运行redis
运行文件在/opt/redis-6.0.5/src中
我们复制redis-server,redis-cli到/usr/local/bin中
然后输入redis-server /home/redis.conf启动服务
我这里还没有修改ip,只能本机访问
用redis-cli -p 6379测试连接
如果设置了密码,输入 auth [密码] 来验证密码
shutdown关闭连接
exit退出
redis-benchmark
redis自带的压力测试工具
//测试:100个并发连接 100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
set请求测试
对10w个请求进行测试
100个并发客户端
每次写入3个字节
只有1台服务器来处理这些请求,单机性能
每秒平均处理82236.84次请求
基础知识
redis默认16个数据库
默认使用的是第0个
127.0.0.1:6379> select 3 //切换到第3个数据库
OK
127.0.0.1:6379[3]> DBSIZE //返回当前数据库的 key 的数量
(integer) 0
查看所以的key: keys *
清除当前的数据库: flushdb
清除全部数据库的内容: flushall
Redis是单线程的!
明白Redis是很快的,官方表示,Redis是基于内存操作的,CPU不是Redis性能瓶颈
Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了.
Redis是c语言写的,官方提供的数据为100000+的QPS,完全不必同样是使用key-vale的Memecache查!
Redis为什么单线程还这这么快?
1.误区:高性能的服务器一定是多线程的
2.误区2:多线程(CPU上下文会切换!)一定比单线程效率高!
CPU>内存>硬盘的速度
核心:redis是将所以的数据全部放在内存中的,所以用单线程操作就是效率最高的,多线程(cpu上下切换:耗时的操作!)对于内存系统来说,若干没有上下文切换效率就是最高,多次读写都在一个cpu上的,在内存情况下,就是最佳方案
127.0.0.1:6379> keys * //获得当前数据库的所以key
1) "id"
2) "age"
3) "name"
127.0.0.1:6379> exists name //判断name这个key是否存在
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> exists age
(integer) 1
127.0.0.1:6379> move name 1 //移除name这个key
(integer) 1
127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> keys *
1) "id"
2) "age"
127.0.0.1:6379> set name wangtao //设置name-wangtao 这个key
OK
127.0.0.1:6379> keys *
1) "id"
2) "age"
3) "name"
127.0.0.1:6379> get name //获得name这个key的value
"wangtao"
127.0.0.1:6379> expire name 10 //设置name这个key在10秒后删除
(integer) 1
127.0.0.1:6379> ttl name //获得name这个key还能存活的时间
(integer) 1 //还能存活1秒
127.0.0.1:6379> ttl name
(integer) -2 //已经不在数据库中
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> ttl age
(integer) -1 //一直存在,没有设置key的存活时间
127.0.0.1:6379> ttl ag
(integer) -2
127.0.0.1:6379>
查看key的类型: