B站视频
1、Nosql概述
1.1 为什么要用Nosql
在大数据时代,大数据库无法分析和处理 ! 06年出现hadoop
-
单机MySQL的年代
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-ynQwYATd-1649557816798)(C:\Users\acer\Desktop\微信截图_20220328162201.png)]
90年代,一个基本的网站访问量一般不会太大,单个数据库就足够了!
当时使用静态网页比较多Html 服务器压力不大
思考: 整个网站的瓶颈是什么?
- 数据量如果太大,一个机器放不下
- 数据的索引 (B tree),机器内存也放不下
- 服务器无法承受访问量(读写混合)
只要出现上述三种情况之一,就必须晋升
- Memcached(缓存) MySQL 垂直拆分(读写分离)
80%的网站都在阅读,每次查询数据库都很麻烦!所以我们想减轻数据的压力,我们可以使用缓存来确保效率!
发展过程: 优化数据结构和索引–》文件缓存(IO)----->Memcached
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-tZALtXci-1649557816800)(C:\Users\acer\Desktop\微信截图_20220328163723.png)]
-
分库分表 水平拆分 MySQL集群
随着技术和业务的发展,对人的要求越来越高
本质: 数据库(读 写)
1/3数据分别放在集群1、2、3中
早些年MyISAM:表锁(在100万条数据下 记录查询 锁表)对效率影响很大!高并发会出现严重的锁问题
转战Innodb: 行锁(每次查询,只锁这条线)
订单、支付、用户(分库表)
慢慢开始用分库分表来解决写作压力!
MySQL集群满足了当时的需求
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-bockiaTq-1649557816801)(C:\Users\acer\Desktop\微信截图_20220328164855.png)]
-
最近的年代
MySQL关系数据库不够!数据量多,变化快!
MySQL用于存储较大的文件和图片!数据库表很大,效率很低!如果有一个数据库来处理这些数据,MySQL的
压力变小(研究如何处理) 大数据的IO在压力下,表几乎无法更改
-
目前,一个基本的互联网项目
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-s6jenyNe-1649557816802)(C:\Users\acer\Desktop\微信截图_20220328172454.png)]
为什么要用NoSQL!
用户个人信息、社交网络、地理位置。用户自己的数据、用户日志等爆炸性增长!
在这个时候,我们需要使用它NoSQL数据库的,NoSQL可以很好的处理以上的情况!
1.2 什么是NoSQL
NoSQL = not only SQL
关系数据库: 表格,行,列
随着非关系数据库的泛指web2.互联网的诞生!传统的关系数据库很难处理web2.0时代!尤其是超大规模高并发社区!
暴露出许多难以克服的问题,NoSQL在当今大数据环境下发展迅速,Redis发展最快,热。
许多数据用户的个人信息、社交网络和地理位置。这些数据类型的存储不需要一个固定的格式!水平扩展不需要额外的操作! Map<String,Object>
1.3 NoSQL特点
-
扩展方便(数据无关,扩展好)
-
高性能的大数据量(Redis 1s可写8万次,读11万次,NoSQL缓存记录级为细粒度缓存,性能较高)
-
数据类型多样(不需要提前设计数据库 随取随用 若是数据量很大的表,很多人都无法设计)
-
传统RDBMS和NoSQL
传统的 RDBMS 结构化组织 SQL 数据和关系的数据和关系 数据操作,数据定义语言 严格的一致性 基础的事务 ...
NoSQL 不仅仅是数据 没有固定的查询语言 存储方法很多 键值对,列存储,文档存储 最终一致性 CAP定理 和 BASE (异地多活! 高性能 高可用 高可扩展性 ...
公司实践: NoSQL RDBMS一起使用是最强的
1.4 阿里巴巴进化分析
思考: 这么多数据都在一个数据库里吗?
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-X4yr88m5-1649557816803)(C:\Users\acer\Desktop\微信截图_20220328190141.png)]
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-lSLZwonu-1649557816804)(C:\Users\acer\Desktop\微信截图_20220328185800.png)]
to be 架构师: 加一层解决不了什么!
# 1.商品基本信息 名称、价格、商业信息 关系数据库可以解决 mysql/oracle (淘宝去IOE) 淘宝内部的MySQL不是每个人都用的MySQL #2、商品描述、评论(文字较多) 在文档数据库中 MongDB #3、图片 分布式文件系统 FastDFS 淘宝自己的 TFS Hadoop HDFS 阿里云 oss #4.商品关键词(搜索) - 搜索引擎 solr elasticsearch - ISearch : 多隆 # 5.商品流行的波段信息 - 内存数据库 - Redis Tair Memcached # 6.商品交易、外部支付界面 - 三方应用
一个简单的网页背后的技术不能像你想象的那么简单
大型互联网应用问题:
- 数据类型太多了
- 数据源多,重构频繁
- 数据改造,大面积改造
解决问题:
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-BHDfDjeH-1649557816806)(C:\Users\acer\Desktop\微信截图_20220328191920.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tlcxAZwo-1649557816807)(C:\Users\acer\Desktop\微信截图_20220328192702.png)]
1.5 NoSQL的四大分类
-
新浪: redis
-
美团: redis tair
-
阿里,百度: redis memcache
-
MongoDB (一般必须要掌握)
-
MongoDB基于分布式文件存储的数据库,c 编写主要用于处理大量文档
-
MongoDB是介于关系数据库和非关系数据之间的产品!MongoDB在非关系数据库中,功能最丰富,关系最相似
数据库
-
ConthDB
- HBase
- 分布式文件系统
- 它不是存图形,用来存储关系的 比如: 朋友圈,社交网络,广告推荐!
- Neo4j,infoGrid
- 内存存储,持久化,内存中是断电即失,所以说持久化很重要(rdb,aof)
- 效率高,可以用于高速缓存‘
- 发布订阅系统
- 地图信息分析
- 计时器、计数器(浏览量)
- …
- 多样的数据类型
- 持久化
- 集群
- 事务
- …
-
下载安装包:https://github.com/microsoftarchive/redis/releases
-
下载完毕得到压缩包:
-
解压到自己电脑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ioqGf1B-1649557816809)(C:\Users\acer\Desktop\微信截图_20220328212716.png)]
-
开启redis ,双击运行服务即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYC1ds8Q-1649557816810)(C:\Users\acer\Desktop\微信截图_20220328213033.png)]
-
使用redis客户端来连接redis
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bFRBn6O1-1649557816811)(C:\Users\acer\Desktop\微信截图_20220328213112.png)]
-
下载安装包 redis-stable.tar.gz(官网)
-
解压Redis的安装包! 程序一般放到/opt目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xa1qbhvM-1649557816813)(C:\Users\acer\Desktop\微信截图_20220331092748.png)]
-
进入解压后的文件,可以看到redis 的配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCY6xQSA-1649557816814)(C:\Users\acer\Desktop\微信截图_20220331092853.png)]
-
基本的环境安装
# 进入这个目录后 yum install gcc-c++ gcc -v make #自动安装所需配置 make install
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-noMNqsb3-1649557816815)(C:\Users\acer\Desktop\微信截图_20220331093640.png)]
-
redis的默认安装路径 usr/local/bin
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-khW3JP6V-1649557816817)(C:\Users\acer\Desktop\微信截图_20220331094020.png)]
-
将redis配置文件,复制到我们当前目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5vhaalxO-1649557816818)(C:\Users\acer\Desktop\微信截图_20220331094258.png)]
-
redis 默认不是后台启动,修改配置文件
- 启动redis服务
-
测试连接(使用redis-cli)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fAQMwW0k-1649557816820)(C:\Users\acer\Desktop\微信截图_20220331095638.png)]
-
查看redis的进程是否开启
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFIs122N-1649557816821)(C:\Users\acer\Desktop\微信截图_20220331095839.png)]
-
如何关闭Redis服务 shutdown
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0YKHDcf-1649557816822)(C:\Users\acer\Desktop\微信截图_20220331100004.png)]
-
再次查看进程是否存在
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-co5aAQ5U-1649557816823)(C:\Users\acer\Desktop\微信截图_20220331100104.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udNhPsik-1649557816808)(C:\Users\acer\Desktop\微信截图_20220328195129.png)]
2、Redis
2.1 什么是Redis?
Redis(Remote Dictionary Server ),即远程字典服务
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
免费和开源 ! 当下热门的NoSQL技术之一!也被人们称之为结构化数据库
2.2 Redis能干嘛
2.3 特性
学习渠道 狂神公众号 官网:https://redis.io/ 中文网: http://redis.cn/ 下载:github
注意:Window在github上下载(已经停更很久)
2.4 Windows安装
Window下使用确实简单,但是Redis推荐我们使用Linux去开发使用!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTA9MWai-1649557816812)(C:\Users\acer\Desktop\微信截图_20220328213511.png)]
2.5 Linux安装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sf8v1Cz2-1649557816816)(C:\Users\acer\Desktop\微信截图_20220331093804.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7yzWIzMs-1649557816818)(C:\Users\acer\Desktop\微信截图_20220331095056.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hq3XUUug-1649557816819)(C:\Users\acer\Desktop\微信截图_20220331095431.png)]
2.6 测试性能
redis-benchmark是一个压力测试工具!
redis-benchmark 命令参数
图片来源菜鸟教程:
序号 选项 描述 默认值 1 指定服务器主机名 127.0.0.1 2 指定服务器端口 6379 3 指定服务器 socket 4 指定并发连接数 50 5 指定请求数 10000 6 以字节的形式指定 SET/GET 值的数据大小 2 7 1=keep alive 0=reconnect 1 8 SET/GET/INCR 使用随机 key, SADD 使用随机值 9 通过管道传输 请求 1 10 强制退出 redis。仅显示 query/sec 值 11 以 CSV 格式输出 12 * 生成循环,永久执行测试 13 仅运行以逗号分隔的测试命令列表。 14 * Idle 模式。仅打开 N 个 idle 连接并等待。 简单测试:
# 测试 100个并发连接 100000个请求 命令 redis-benchmark -h localhost -p 6379 -c 100 -n 100000
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pOwliKAQ-1649557816824)(C:\Users\acer\Desktop\微信截图_20220331102130.png)]
2.7 基本知识
redis默认有16个数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dPYOYSq0-1649557816825)(C:\Users\acer\Desktop\微信截图_20220331103447.png)]
默认使用的是第0个
可以使用select进行切换
select 编号(0-15) 127.0.0.1:6379> select 3 OK 127.0.0.1:6379[3]> DBSIZE (integer) 0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yyUwSAnj-1649557816825)(C:\Users\acer\Desktop\微信截图_20220331103908.png)]
127.0.0.1:6379[3]> keys * #查看数据库所有的key 1) "name" >flushdb #清除当前数据库 >FLUSHALL #清除全部数据库内容
思考: 为什么redis的端口号是6379?女明星名字
明白Redis是很快的,官方表示,Redis是基于内存操作的,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所以就使用了单线程
Redis是c语言写的,官方提供的数据为100000+的QP5,这个完全不比使用key-value的Memecache差!
Redis为什么单线程还这么快?
1、误区1: 高性能的服务器一定是多线程的
2、误区2:多线程(CPU上下文切换)一定比单线程效率高
CPU>内存>硬盘的速度
核心: redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文切换:耗时操作)
对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
3、五大数据类型
概述
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
讲解的所有命令记住,后面使用SpringBoot。jedis,所有的方法就是这些命令!
单点登录
3.1 Redis-key
127.0.0.1:6379> keys * # 查看所有key (empty array) 127.0.0.1:6379> set name ppj # set key OK 127.0.0.1:6379> set age 1 OK 127.0.0.1:6379> keys * 1) "name" 2) "age" 127.0.0.1:6379> EXISTS age # 查看当前key是否存在 (integer) 1 127.0.0.1:6379> EXISTS age1 (integer) 0 127.0.0.1:6379> move name 1 # 移除当前的key (integer) 1 127.0.0.1:6379> EXPIRE name 10 #设置key的过期时间 单位秒 (integer) 1 127.0.0.1:6379> ttl name #查看当前key的剩余时间 (integer) 2 127.0.0.1:6379> ttl name (integer) -2 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> type name #查看当前key的类型 string 127.0.0.1:6379> type age string
后面遇到不会的命令,查看官网(http://www.redis.cn/)
3.2 String(字符串)
=============================================================== 127.0.0.1:6379> set key1 v1 #设置值 OK 127.0.0.1:6379> APPEND key1 "hello" # 追加字符串,如果当前key不存在,相当于set key (integer) 7 127.0.0.1:6379> get key1 # 获得key "v1hello" 127.0.0.1:6379> STRLEN key1 # 获得字符串的长度 (integer) 7 ============================== 127.0.0.1:6379> set views 0 OK 127.0.0.1:6379> get views "0" 127.0.0.1:6379> INCR views # 自增1 (integer) 1 127.0.0.1:6379> INCR views (integer) 2 127.0.0.1:6379> INCR views (integer) 3 127.0.0.1:6379> get views "3" 127.0.0.1:6379> DECR views # 自减1 (integer) 2 127.0.0.1:6379> INCRBY views 2 # 自增2 设置步长 (integer) 4 127.0.0.1:6379> INCRBY views 2 (integer) 6 127.0.0.1:6379> DECRBY views 2 # 自减2 (integer) 4 127.0.0.1:6379> 127.0.0.1:6379> DECRBY views 2 (integer) 2 ================================================= 字符串范围 127.0.0.1:6379> set key1 "hello" OK 127.0.0.1:6379> GETRANGE key1 0 3 # 截取字符串[0,3] "hell" 127.0.0.1:6379> GETRANGE key1 0 -1 # 获取全部字符串 "hello" 127.0.0.1:6379> set key2 abcdef OK 127.0.0.1:6379> SETRANGE key2 1 ** # 替换指定位置开始的字符串 (integer) 6 127.0.0.1:6379> get key2 "a**def" ==================================================== # setex(set with expire) # 设置过期时间 # setnx(set if not exist) # 不存在设置 (在分布式锁中会常常使用!) 127.0.0.1:6379> setex key3 20 "hello" # 设置key3的值 20s过期 OK 127.0.0.1:6379> ttl key3 (integer) 13 127.0.0.1:6379> setnx mykey "redis" # 如果mykey不存在,创建mykey (integer) 1 127.0.0.1:6379> keys * 1) "key1" 2) "key2" 3) "mykey" 127.0.0.1:6379> ttl key3 (integer) -2 127.0.0.1:6379> setnx mykey "MongoDB" # 如果mykey存在,创建失败 (integer) 0 127.0.0.1:6379> get mykey "redis" ==================================================== mset mget 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 同时设置多个值 OK 127.0.0.1:6379> keys * 1) "k1" 2) "k2" 3) "k3" 127.0.0.1:6379> mget k1 k2 k3 # 同时获取多个值 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> msetnx k1 v1 k4 v4 # 原子性操作 (integer) 0 127.0.0.1:6379> keys * 1) "k1" 2) "k2" 3) "k3" # 对象 set user:1 { name:zhangsan,age:3} # 设置一个user:1对象 值为JSON字符来保存一个对象 # key的巧妙设计 user:{id}:{field} ,如此设计在Redis中是完全ok 127.0.0.1:6379> mset user:1:name zhangsan user:1:age 18 OK 127.0.0.1:6379> mget user:1:name user:1:age 1) "zhangsan" 2) "18" ==================================================== getset # 先get再set 127.0.0.1:6379> getset db redis # 如果不存在值,则返回nil (nil) 127.0.0.1:6379> get db # 不存在,创建 "redis" 127.0.0.1:6379> getset db mongodb # 如果存在值,获得原来的值,并设置新的值 "redis" 127.0.0.1:6379> get db "mongodb" ============================================================
字符串还可以是数字
- 计数器
- 统计(多个)数量 uid:688878:follow 0
- 粉丝数
- 对象缓存存储
3.3 List
基本的数据类型 列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qgLUwN5H-1649557816827)(C:\Users\acer\Desktop\微信截图_20220331145145.png)]
在redis里面,可以把list玩成队列,栈,阻塞队列
所有的list命令都是以l开头
==================================================== 127.0.0.1:6379> LPUSH list one # 将一个值或者多个值,插入到列表头部(左) (integer) 1 127.0.0.1:6379> LPUSH list two # (integer) 2 127.0.0.1:6379> LPUSH list threee (integer) 3 127.0.0.1:6379> LRANGE list 0 -1 # 获取list集合所有元素 1) "threee" 2) "two" 3) "one" 127.0.0.1:6379> LRANGE list 0 1 # 获取list的 [0,1]元素 类似栈 1) "threee" 2) "two" 127.0.0.1:6379> RPUSH list four 将一个值或者多个值,插入到列表头部(右) (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 1) "threee" 2) "two" 3) "one" 4) "four" ===================================================== POP LPOP RPOP 127.0.0.1:6379> LPOP list # 移除list的第一个元素 "threee" 127.0.0.1:6379> RPOP list # 移除list的最后一个元素 "four" 127.0.0.1:6379> LPOP list 2 # 移除多个元素 1) "two" 2) "one" ====================================================== lindex 127.0.0.1:6379> LINDEX list 1 # 通过下标获得list的某个值 "two" 127.0.0.1:6379> LRANGE list 0 -1 1) "three" 2) "two" 3) "one" ======================================================== llen 127.0.0.1:6379> LLEN list # 返回列表的长度 (integer) 3 ======================================================== 移除指定的值 lrem 127.0.0.1:6379> lpush list three (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 # 允许有重复的元素 1) "three" 2) "three" 3) "two" 4) "one" 127.0.0.1:6379> LREM list 1 one # 移除一个指定的元素 (integer) 1 127.0.0.1:6379> LREM list 2 three # 移除2个指定的元素 (integer) 2 127.0.0.1:6379> LRANGE list 0 -1 1) "two" ===================================================== trim 修剪 list 截断 127.0.0.1:6379> LPUSH list "h" (integer) 1 127.0.0.1:6379> LPUSH list "e" (integer) 2 127.0.0.1:6379> LPUSH list "l" (integer) 3 127.0.0.1:6379> LPUSH list "l" (integer) 4 127.0.0.1:6379> LPUSH list "o" (integer) 5 127.0.0.1:6379> LTRIM list 2 -1 # 截取某个区间的list OK 127.0.0.1:6379> LRANGE list 0 -1 1) "l" 2) "e" 3) "h" ======== 标签:
hf520变送器特点hf520变送器隔离变送器ws1521
-