3.3日学习打卡
目录:
- 3.3日学习打卡
- NoSQL
- 为什么要用NoSQL
- 什么是NoSQL?
- NoSQL的四大分类
- 关系型数据库和非关系型数据及其区别
- NoSQL经典应用
- Redis
- Redis是什么?
- Linux下安装Redis
- Docker下安装Redis
- 基本知识
NoSQL
为什么要用NoSQL
单机Mysql的美好年代
在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。
遇到问题:
随着用户数的增长,Tomcat和数据库之间竞争资源,单机性能不足以支撑业务。
Tomcat与数据库分开部署
Tomcat和数据库分别独占服务器资源,显著提高两者各自性能。
新的问题:
随着用户数的增长,并发读写数据库成为瓶颈。
引入本地缓存和分布式缓存
通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用memcached作为本地缓存,使用Redis作为分布式缓存。
注意:
缓存抗住了大部分的访问请求,随着用户数的增长,并发压力主要落在单机的Tomcat上,响应逐渐变慢。
引入反向代理实现负载均衡
在多台服务器上分别部署Tomcat,使用反向代理软件(Nginx)把请求均匀分发到每个Tomcat中。
新的挑战:
反向代理使应用服务器可支持的并发量大大增加,但并发量的增长也意味着更多请求穿透到数据库,单机的数据库最终成为瓶颈。
数据库读写分离
由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了
新的挑战:
业务逐渐变多,不同业务之间的访问量差距较大,不同业务直接竞争数据库,相互影响性能。
数据库按业务分库
把不同业务的数据保存到不同的数据库中,使业务之间的资源竞争降低,对于访问量大的业务,可以部署更多的服务器来支撑。
为什么用NoSQL
用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。
什么是NoSQL?
NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付特别是超大规模和高并发类型纯动态网站已经显得力不从心,暴露了很多难以克服的问题。
结构化数据和非结构化数据
- 结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行数据。
- 非结构化数据,指的是数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二维逻辑表来表现的数据,例如办公文档(Word)、文本、图片、HTML、各类报表、视频音频等。
NoSQL的四大分类
KV型NoSql(代表----Redis)
KV型NoSql顾名思义就是以键值对形式存储的非关系型数据库,是最简单、最容易理解也是大家最熟悉的一种NoSql,因此比较快地带过。
特点:
- 数据基于内存,读写效率高
- KV型数据,时间复杂度为O(1),查询速度快
注意:
KV型NoSql最大的优点就是高性能,利用Redis自带的BenchMark做基准测试,TPS可达到10万的级别,性能非常强劲。
列式NoSql(代表----HBase)
列式NoSql,大数据时代最具代表性的技术之一了,以HBase为代表。
关系行数据库数据
注意:
看到每行有name、phone、address三个字段,这是行式存储的方式,且可以观察id = 2的这条数据,即使phone字段没有,它也是占空间的。
列式数据库数据
注意:
查询时只有指定的列会被读取,不会读取所有列
列数据被组织到一起,一次磁盘IO可以将一列数据一次性读取到内存中
文档型NoSql(代表----MongoDB)
什么是文档型NoSql呢,文档型NoSql指的是将半结构化数据存储为文档的一种NoSql,文档型NoSql通常以JSON或者XML格式存储数据。
注意:
关系型数据库是按部就班地每个字段一列存,在MongDB里面就是一个JSON字符串存储。
搜索型NoSql(代表----ElasticSearch)
传统关系型数据库主要通过索引来达到快速查询的目的,但是在全文搜索的场景下,索引是无能为力的,like查询一来无法满足所有模糊匹配需求,二来使用限制太大且使用不当容易造成慢查询,搜索型NoSql的诞生正是为了解决关系型数据库全文搜索能力较弱的问题,ElasticSearch是搜索型NoSql的代表产品。
关系型数据库和非关系型数据及其区别
关系型数据库
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
- 易于维护:都是使用表结构,格式一致;
- 使用方便:SQL语言通用,可用于复杂查询;
- 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
- 读写性能比较差,尤其是海量数据的高效率读写;
- 固定的表结构,灵活度稍欠;
非关系型数据库
优点:
- 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
- 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
- 高扩展性;
- 成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
-
不提供sql支持,学习和使用成本较高;
-
无事务处理;
-
数据结构相对复杂,复杂查询方面稍欠。
NoSQL经典应用
当下应用是SQL和NoSQL一起使用
淘宝商品信息如何存放
商品基本信息
名称、价格、出厂信息、生产厂商,商家信息等, 关系型数据库就可以解决。
注意:
注意,淘宝内部用的Mysql是里面的大牛自己改造过的。
商品描述、详情、评论
多文件信息描述类,IO读写性能变差不能使用Mysql数据库,使用MongDB。
商品的图片
分布式文件系统:
- 淘宝自己的TFS
- Google的GFS
- Hadoop的HDFS
- 阿里云的OSS
商品热门的波段信息
内存数据库 Redis Tair Memache
遇到的问题:
数据类型太多
数据源繁多
数据要改造
Redis
Redis是什么?
Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。
特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化* 的日志型、Key-Value数据库,并提供多种语言的API
谁在用Redis
-
Github
-
京东
-
微博
-
阿里巴巴
-
百度
-
美团
-
搜狐
Linux下安装Redis
官网地址
Redis官方网址:https://redis.io/
下载Redis
可以直接使用我提供的 Redis
redis-6.2.4.tar.gz上传至CentOS并解压,解压后得到redis-6.2.4目录
解压命令:
tar -zxvf redis-6.2.4.tar.gz
安装GCC
安装C语言编译环境
yum install -y gcc
通过使用gcc --version
命令打印 GCC 版本,来验证 GCC 编译器是否被成功安装:
gcc --version
安装Redis
编译Redis
在redis-6.2.4目录下执行:
make
安装Redis
在redis-6.2.4目录下执行:
make install
安装目录: /usr/local/bin
注意:
redis-benchmark:Redis自带的基准性能测试工具
redis-check-aof:对有问题的 AOF 文件进行修复,AOF和RDB文件后面会说明
redis-check-rdb:对有问题的 RDB文件进行修复
redis-sentinel:Redis集群使用
redis-cli:客户端
redis-server:服务器启动
服务启动
前台启动:/usr/local/bin下执行
./redis-server
后台启动
修改redis.conf文件
daemonize yes #由no改为yes
启动服务
./redis-server ../redis.conf
客户端启动
/usr/local/bin下执行
./redis-cli
ping命令可以检测服务器是否正常(服务器返回PONG)
127.0.0.1:6379> ping
PONG
Docker下安装Redis
下载最新Redis镜像
docker pull redis
注意:
可以用docker pull redis命令下载最新版本的Redis镜像,也可 以用“docker pull redis:标签”命令下载指定版本的Redis。
启动Redis容器
docker run -itd --name myFirstRedis -p 6379:6379
redis:latest
观察Redis启动效果
docker logs myFirstRedis
注意:
如果直接在Linux等环境上启动Redis服务器,就能直接看到启动后的效果。
查看Redis的版本
先确保myFirstRedis容器处于Up状态。进入容器的命令行交互窗口。
docker exec -it myFirstRedis /bin/bash
redis-server --version
Redis服务器和客户端
Redis是基于键值对存储的NoSQL数据库,其中的数据是存储在 Redis服务器里的。和传统的MySQL数据库服务器相似,一个Redis服务器可以同多个客户端创建连接。
docker exec -it myFirstRedis /bin/bash
redis-cli
基本知识
默认16数据库
Redis是一个字典结构的存储服务器,一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。
这与在一个关系数据库实例中可以创建多个数据库类似(如下图所示),所以可以将其中的每个字典都理解成一个独立的数据库。
Redis默认支持16个数据库,可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值,设置完毕后重启Redis便完成配置。
Redis 使用的到底是多线程还是单线程?
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
IO多路复用技术
redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。
大白话解释
假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接乘客。
最简单的做法,就是你去招一大批空管员,然后每人盯一架飞机, 从进港,接客,排位,出港,航线监控,直至交接给下一个空港,全程监控。
遇到的问题:
很快你就发现空管塔里面聚集起来一大票的空管员,交通稍微繁忙一点,新的空管员就已经挤不进来了。
空管员之间需要协调,屋子里面就1, 2个人的时候还好,几十号人以后 ,基本上就成菜市场了。
空管员经常需要更新一些公用的东西,比如起飞显示屏,比如下一个小时后的出港排期,最后你会很惊奇的发现,每个人的时间最后都花在了抢这些资源上。
怎么解决
这个东西叫flight progress strip. 每一个块代表一个航班,不同的槽代表不同的状态,然后一个空管员可以管理一组这样的块(一组航班),而他的工作,就是在航班信息有新的更新的时候,把对应的块放到不同的槽子里面。
结论
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。
切换数据库
语法结构:
select number
示例:
# 默认使用 0 号数据库
redis 127.0.0.1:6379> SET db_number 0
OK
# 使用 1 号数据库
redis 127.0.0.1:6379> SELECT 1
OK
清空当前库
Redis Flushdb 命令用于清空当前数据库中的所有 key。
语法结构:
127.0.0.1:6379> FLUSHDB
示例:
127.0.0.1:6379> FLUSHDB
通杀全部库
Redis Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。
语法结构:
redis 127.0.0.1:6379> FLUSHALL
示例:
# 清空所有数据库的所有 key
redis 127.0.0.1:6379>flushall
OK
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力