一、非关系型数据库产生背景
High performance————对数据库高并发读写需求
Huge Storage———对海量数据高效存储与访问需求
High Scalability && High Availability——对数据库高可扩展性与高可用性需求
关系型数据库 | NoSQL 数据库 | |
---|---|---|
特点 | 数据关系模型基于关系模型,结构化存储,完整性约束 | 非结构化的存储 |
基于二维表及其之间的联系心需要连接、并、交、差、除等数据操作 | 基于多维关系模型 | |
采用结构化的查询语言(SQL)做数据读写 | 具有特有的使用场景 | |
操作需要数据的—致性,需要事务甚至是强—致性 | ||
优点 | 保持数据的—致性(事务处理) | 高并发,大数据下读写能力较强 |
可以进行join等复杂查询 | 基本支持分布式,易于扩展,可伸缩 | |
通用化,技术成熟 | 简单,弱结构化存储 | |
缺点 | 数据读写必须经过sql解析,大量数据、高并发下读写性能不足 | join等复杂操作能力较弱 |
对数据做读写,或修改数据结构时需要加锁,影响并发操作 | 事务支持较弱 | |
无法适应非结构化存储 | 通用性差 | |
扩展困难 | 无完整约束复杂业务场景支持较差 | |
昂贵、复杂 |
1、关系型数据库和非关系型数据库区别
1.1、数据存储方式不同
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
关系型:依赖于关系模型E-R图,同时以二维表格式的方式存储数据
非关系型:除了以表格形式存储之外,通常会以大块的形式组合在一起进行存储数据
1.2、扩展方式不同
sQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
要支持更多并发量,sQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来克服。虽然sgL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
而NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
关系:纵向(天然表格式)
非关:横向(天然分布式)
1.3、对事务性的支持不同
如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQI数据库从性能和稳定性方面考虑是最佳选择。scL数据库支持对事务(ACID)原子性细粒度控制,并且易于回滚事务。
虽然MoSL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。
关系型:特别适合高事务性要求和需要控制执行计划的任务
非关系:此处会稍显弱势,其价值点在于高扩展性和大数据量处理方面
关系型数据库:
实例–>数据库–>表(table)–>记录行(row)、数据字段(column)——》存储数据
非关系型数据库:
实例–>数据库–>集合(collection) -->键值对(key-value)
二、Redis简介
基于内存运行并支持持久化
采用key-value(键值对)的存储形式
1、优点
- 速度快: 10W QPS,基于内存,C语言实现
- 单线程 使用epoll (默认)+I/O多路复用机制
- 持久化 可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- 支持多种数据结构 支持key-value、strings、Lists、Hashes(散列值)、Sets 及ordered Sets等数据类型操作
- 支持多种编程语言
- 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
- 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
- 主从复制
- 支持高可用和分布式
- 原子性: Redis所有操作都是原子性的,不可分割是一个整体
2、典型应用场景
- Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
- 缓存:数据查询、电商网站商品信息、新闻内容
- 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
- 微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
- 消息队列:ELK的日志缓存、部分业务的订阅发布系统
- 地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能
三、缓存
1、概念
缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid 卡有也缓存,都是为了起到加速CPU 访问硬盘数据的目的,因为CPU的速度太快了,CPU需要的数据由于硬盘往往不能在短时间内满足CPU的需求,因此CPU缓存、内存、Raid 卡缓存以及硬盘缓存就在一定程度上满足了CPU的数据需求,即CPU 从缓存读取数据可以大幅提高CPU的工作效率。
2、系统缓存buffer与cache:
buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存再写入磁盘,buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU会把数据先写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时间在写入磁盘,所以服务器突然断电会丢失内存中的部分数据。
cache:缓存也叫读缓存,一般用于读操作,CPU读文件从内存读,如果内存没有就先从硬盘读到内存再读到CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。
3、缓存保存位置及分层结构
- 用户层: 浏览器DNS缓存,应用程序DNS缓存,操作系统DNS缓存客户端
- 代理层: CDN,反向代理缓存
- Web层: Web服务器缓存
- 应用层: 页面静态化
- 数据层: 分布式缓存,数据库
- 系统层: 操作系统cache
- 物理层: 磁盘cache, Raid Cache
3.1、DNS缓存
浏览器的DNS缓存默认为60秒,即60秒之内在访问同一个域名就不在进行DNS解析
3.2、应用层缓存
Nginx、PHP等web服务可以设置应用缓存以加速响应用户请求,另外有些解释性语言,比如:
PHP/Python/Java不能直接运行,需要先编译成字节码,但字节码需要解释器解释为机器码之后才能执
行,因此字节码也是一种缓存,有时候还会出现程序代码上线后字节码没有更新的现象。所以一般上线
新版前,需要先将应用缓存清理,再上线新版。
另外可以利用动态页面静态化技术,加速访问,比如:将访问数据库的数据的动态页面,提前用程序生成静态
页面文件html 电商网站的商品介绍,评论信息非实时数据等皆可利用此技术实现。
3.3、数据层缓存
- 分布式缓存服务
Redis
Memcached - 数据库
MySQL 查询缓存
innodb缓存、MYISAM缓存
3.4、硬件缓存
- CPU缓存(L1的数据缓存和L1的指令缓存)、二级缓存、三级缓存
- 磁盘缓存:Disk Cache
- 磁盘阵列缓存: Raid Cache,可使用电池防止断电丢失数据
四、安装Redis
[root@localhost ~]# systemctl disable --now firewalld 关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y gcc gcc-c++ make 安装环境
[root@localhost ~]# cd /opt
[root@localhost opt]# rz -E 导入安装包
rz waiting to receive.
[root@localhost opt]# ls
redis-5.0.7.tar.gz rh
[root@localhost opt]# tar zxvf redis-5.0.7.tar.gz -C /opt/ 解压到/opt
[root@localhost opt]# cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]# make
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis install
[root@localhost redis-5.0.7]# cd /opt/redis-5.0.7/utils/
[root@localhost utils]# ./install_server.sh
。。。一路回车
到这一行需要输入
回车后
[root@localhost utils]# ss -natp |grep redis
[root@localhost ~]# vim /etc/redis/6379.conf
改
[root@localhost ~]# /etc/init.d/redis_6379 restart
[root@localhost ~]# ss -natp |grep redis
[root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/<