1.关系型数据库和非关系型数据库
1.1关系型数据库
关系型数据库是一个结构化的数据库,采用了关系模型来组织数据的数据库。关系模型指的就是二维表 格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
什么是结构化数据?
结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行 数据,特点为:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的
关系型数据库完美契合结构化数据的特点,关系型数据库也是结构化数据最主要的存储与管理引擎。
关系型数据库的优点:
1. 便于理解:二维表构造非常贴近逻辑,关系模型相对网状、层次等其他模型来说更容易理解
2. 使用方便:通用的SQL语言使得操作关系型数据库非常方便
3. 易于维护:全部由表结构组成,文件格式一致
4. 数据稳定:数据持久化到磁盘,没有丢失数据风险
关系型数据库的缺点:
1. 对于海量信息的查询效率较低,读写能力较差
2. 网站高并发读写需求对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
3. 灵活度欠佳:为了保证数据库的ACID特性,必须尽量按照其要求的范式进行设计,关系型数据库中 的表都是存储一个格式化的数据结构。
1.2非关系型数据库
所谓非关系型数据库,其实是相对于关系型数据库而言的,通常用于存储那些类型不固定的,也没有什 么规律的数据。它严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键 值对等。企业每天都产生大量的数据,非关系型数据库的应用非常广泛,应用场景也非常多,例如:文 档、文本、HTML、各类报表等。
非关系型数据库的优点:
1. 格式灵活:存储数据的格式可以是key,value形式、文档形式等等,文档形式、图片形式等等,使 用灵活,应用场景广泛
2. 性能优:nosql是根据键值对的,不用历经sql层的分析,因此 性能非常高。
3. 扩展性高:基于键值对,数据之间耦合度极低,因此容易水平扩展。
4. 成本低:nosql数据库部署简单,基本都是开源软件
非关系型数据库的缺点:
1. 不提供sql支持,学习和使用成本较高
2. 事务处理机制较弱或无
3. 数据结构相对复杂,复杂查询不容易实现
1.3区别
1. 数据一致性不同;
2. 数据存储方式不同;
3. 扩展方式不同;
4. 对事务性的支持不同。
2.redis简介
Redis是一个完全开源免费的高性能(NOSQL)的key-value数据库。它遵守BSD协议,使用ANSI C语言编写,并支持网络和持久化。Redis拥有极高的性能,每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数据类型,包括String、Hash、List、Set和Ordered Set,并且所有的操作都是原子性的。此外,Redis还提供了多种特性,如发布/订阅、通知、key过期等。Redis采用自己实现的分离器来实现高速的读写操作,效率非常高。Redis是一个简单、高效、分布式、基于内存的缓存工具,通过网络连接提供Key-Value式的缓存服务。
2.1redis优点
1. 具有极高的数据读写速度:数据读取的速度最高可达到 110000 次/s,数据写入速度最高可达到 81000 次/s。
2. 支持丰富的数据类型:支持 String(字符串)、List(列表)、Hashe(哈希集)、Set(无序集合) 及 ZSet(Sorted Sets有序集合) 等数据类型操作。
3. 支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
4. 原子性:Redis 所有操作都是原子性的。
5. 支持数据备份:即 master-salve 模式的数据备份。
Redis作为基于内存运行的数据库,缓存是其最常应用的场景之一。除此之外,Redis常见应用场景还包 括获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。
2.2redis的缺点:
1、由于是内存数据库,所以单台机器存储的数据量跟机器本身的内存大小有关。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
1.1、定时删除和定期删除为主动删除,Redis会定期主动淘汰一批已过去的key。
1.2、惰性删除为被动删除,用到的时候才会去检验key是不是已过期,过期就删除过期的key
1.3、惰性删除是redis服务器内置策略
(过期的key对aof文件没有任何影响,删除过期的key时系统会向aof文件追加一条del;如果key过期了但是没有删除,此时进行持久化操作这个key不会进入aof文件,因为没有发生修改指令)
2、如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网的带宽。不过redis2.8版本以后,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的从库。
3、修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,redis不能提供服务。
2.3redis为什么速度快
1. Redis是一款纯内存结构,避免了磁盘I/o等耗时操作。
2. Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少 了线程上下文切换的消耗。
3. 采用了 I/O 多路复用机制,大大提升了并发效率。
注:在 Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令, 仍然是单线程处理的。
3.Redis安装部署
3.1yum方式
1.安装 redis-rpm源
yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
2.安装 Redis
yum --enablerepo=remi install redis
3.开机 Redis
systemctl start redis
4.连接
3.2编译安装
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum install -y gcc gcc-c++ make wget
wget https://download.redis.io/releases/redis-5.0.7.tar.gz
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
# 编译
make
# PREFIX大写
make install PREFIX=/usr/local/redis
3.3手动方式
1.直接启动(不建议)
# 进入redis安装目录
cd /usr/local/redis/bin/
# 启动服务 前台
./redis-server
#默认情况下,Redis 会尝试加载以下配置文件(按照顺序):
/etc/redis/redis.conf
./redis.conf
#如果以上两个文件都不存在,则 Redis 会使用默认配置,端口号为 6379,并监听所有可用地址。
#因此,当你在命令行中直接运行 redis-server 而不指定配置文件时,Redis 将会按照上述顺序尝试加载配置文件。
#如果不存在配置文件,则会使用默认配置。
2.守护进程方式启动
# 第一步:从 redis 的源码目录中复制 redis.conf 到 redis 的安装目录
cp /opt/redis-5.0.7/redis.conf /usr/local/redis/bin/
# 第二步:修改redis.conf配置文件
cd /usr/local/redis/bin/
vi redis.conf
# 修改内容如下:
#daemonize 的值从 no 修改成 yes
# 第三步:启动服务
./redis-server redis.conf
# 第四步:查看进程来确定redis是否启动成功,非必须
ps -ef |grep redis
备注:如果想要设置指定IP连接redis,只需要修改redis.conf文件中bind配置项即可。如果不限IP,将 127.0.0.1修改成0.0.0.0即可。
为了安全:加入requirepass yourpassword,使得访问需要密码认证。
另外,还可以修改端口为6380,避免端口扫描后被攻击
3.设置开机自动启动
切换到/lib/systemd/system/目录,创建redis.service文件。命令如下:
cd /lib/systemd/system/
vim redis.service
为了安全:加入特定的redis用户,但是需要授权
useradd -M -s /sbin/nologin redis
文件内容如下:
[Unit]
Description=redis-server
After=network.target
#[Service]
#User=redis
#Group=redis
Type=forking
# ExecStart需要按照实际情况修改成自己的地址
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置开启自动启动
# 开机自动启动
systemctl enable redis.service
# 启动redis服务
systemctl start redis.service
# 查看服务状态
systemctl status redis.service
# 停止服务
systemctl stop redis.service
# 取消开机自动启动
systemctl disabled redis.service