Nosql概述
为什么要用Nosql
1.单机mysql的年代!
APP ---->DAL---->Mysql
90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!
那个时候,更多的去使用静态网页Html~服务器根本没有太大的压力
网站的瓶颈是什么?
1.数据量太大,一个机器放不下
2数据的索引(B+Tree),一个机器内存也放不下
3.访问量(读写混合),一个服务器承受不了~
2 Memcached(缓存)+MySQL+垂直拆分
发展过程:优化数据结构和索引-->文件缓存(io)-->Memcached(当时最热门的技术!)
中国人,竞争对手并不是人才,而是那些图安稳的人
3.分库分表+水平拆分+mysql集群
技术和业务的发展的同时,对人的要求也越来越高了!
本质:数据库(读,写)
早些年MyISAM:表锁,十分影响效率!高并发下会出现严重的锁问题
转战Innodb :行锁
慢慢的就开始使用分表来解决写的压力!MYSQL在哪个年代推出了表分区!这个并没有多少公司使用!
mysql的集群,很好满足那个年代的所有需求
4.如今最近的年代
2010--2020十年之间,世界已经发生了翻天覆地的变化.(定位,也是一种数据,音乐,热榜!)
Mysql等关系型数据库就不够用了!数据量很多,变化很快~!
mysql有的使用它来村粗一些比较大的文件,博客,图片!数据库表很大,效率就低了!如果有一种数据来专门处理这种数据,Mysql压力就变得十分小(研究如何处理这些问题!)大数据的IO压力下,表几乎没法更大!
目前一个基本的互联网项目!
为什么要用NoSQL !
用户的个人信息,社交网络,地理位置.用户自己产生的数据,用户日志等等爆发式增长!
这时候我们就需要使用NoSQL数据库的,Nosql可以很好的处理以上的情况!
什么是NOSQL
NOSQL=Not Only SQl
关系型数据库:表格,行,列
泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付Web2.0时代!尤其是超大规模的高并发的社区!暴露出来很多难以克服的问题,NOSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!
很多的数据类型用户的个人信息,社交网络,地理位置.这些数据类型的存储不需要一个固定的格式!不需要多月的操作就可以横向扩展的!Map<String,Object>使用键值对来控制!
NoSQl特点
1.方便扩展(数据之间没有关系,很好扩展!)
2.大数据提高性能(Redis 一秒写8万次,读取11万,NOSQL的缓存记录级,是一种细粒度的缓存,性能会比较高!)
3.数据类型是多样型的!(不需要事先设计数据库!随取随用!如果是数据量十分大的表,很多人就无法设计了!)
4.传统RDBMS和NOSQL(安装数据)
传统的RDBMS
--结构化组织
--SQL
--数据和关系都存在单独的表中
--操作操作,数据定义语言
--严格的一至性
--基础的事务
--...
NOSQL1
--不仅仅是数据
--没有固定的查询语言
--键值对存储,列存储,文档存储,图形数据库(社交关系)
--最终一致性,
--CAP定理和BASE(异地多活)
--高性能,高可用,高可扩
--....
了解:3V+3高
大数据时代的3v:主要是描述问题的
1.海量Volume
2.多样Variety
3.实时Velocity
大数据时代的3高:主要对程序的要求
1.高并发
2.高可扩(随时水平拆分,搭建集群)
3.高性能(保证用户体验和性能!)
真正在公司的实践中:NoSQL+RDBMS一起使用才是最强的,阿里巴巴的架构演进!
大型互联网应用问题:
数据类型太多了!
数据源繁多,经常重构!
数据要改造,大面积改造?
NoSQL的四大分类
KV键值对:
新浪:Redis
美团:Redis+Tair
阿里.百度:Redis+memecache
文档型数据库(bson格式和json一样):
MongoDB(一般必须要掌握)
MongoDB 是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档!
MongoDB 是一个介于关系型数据库和非关系型数据中中间的产品!MongoDB 是非关系型数据库中功能最丰富,最像关系型数据库的!
ConthDB
列存储数据库
1.HBase
2.分布式文件系统
图关系数据库
1.他不是存图片的,是存储关系的()
Redis入门
概念:
redis(Remote Dictionary Server),即远程字典服务
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis能干嘛?
1.内存存储.持久化,内存中是断电即失,所以说持久化很重要(rdb,aof)
2.效率高,可以用于高速缓存
3.发布订阅系统
4.地图信息分析
5.计时器.计数器(游览量!)
6.........
特性
1.多样的数据类型
2.持久化
3.集群
4.事务
......
Redis推荐都是在Linux上搭建的.
windows安装
5.使用redis客户单位来接连redis
window下使用确实简单,但是redis推荐在linux下使用.
Linux安装
下载安装包!
2.解压redis安装包
tar -zxvf redis-6.2.2.tar.gz
进入解压后的文件
安装gcc-c++
yum install gcc-c++
make
查看gcc版本
再次使用make install
redis的默认安装路径 /usr/local/bin
7.redis默认不是后台启动的,修改配置文件!
vim redis.conf
改为后台启动
8.启动redis服务
redis-server config/redis.conf
查看连接
10.查看redis的命令是否开启
11.如何关闭redis服务? shutdown
12,再次查看进程
测试性能
redis-benchmark 是一个压力测试工具
官方自带的性能测试工具
redis-benchmark 命令参数!
#测试:100个并发连接 100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 1000000
基础的知识
redis有16个数据库 默认使用的是0个 可以使用select进行切换数据库!
Redis是单线程的!
明白Redis是很快的,官方表示,Redis是基于内存操作的,cpu不是Redis性能的瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所以就使用单线程了!
Redis 是C语言写的,官方提供的数据为 100000+ 的QPS,完全不比同样是使用key-vale的Memecache差!
Redis 为什么单线程还这么快?
1.误区1:高性能的服务器一定是多线程的?
2.误区2:多线程(CPU上下文会切换!)一定比单线程效率高!
先去CPU>内存>硬盘的速度要有所了解!
核心:redis是将所有的数据全部放在内存中,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!!!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
String(字符串)
90%的java程序员只会redis的一个string类型
替换:
setex (set with expire) # 设置过期时间
setnx(set if not exist) # 不存在在设置(在分布式锁中常常使用)
mset
mget
对象
set user:1{name:zhangsan,age:3} # 设置一个user:1 对象 值为 json字符来保存一个对象!
getset #先get然后在set
String 类似的使用场景:value除了是我们的字符串还可以是我们的数字!
1.计数器
2.统计多单位的数量
3.粉丝数
4.对象缓存存储
List
基本的数据类型,列表
移除
Lpop
Rpop
最后:大家想要速成的话,可以选择去B站看---狂神说java的视频,个人感觉还是讲的不错的