一,关系型数据库与非关系型数据库
1.关系型数据库
一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录
SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。主流的关系型数据库包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
2.非关系型数据库
NoSQL(Not Only SQL ),意思是"不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型。
非关系型数据库属于一种数据结构化存储方式的集合,可以是文档类型、图形类型、列存储类型,键值对等,
主流的NoSQL 数据库有Redis、MongBD、Hbase、CouhDB等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
3.区别
1、数据存储方式不同:
关系数据库为表格形式;
非关系数据库为文档或图结构。
2、扩展方式不同:
关系数据库可纵向扩展,可提高处理能力;
非关系数据库为天然分布式,通过更多的数据服务器来分担负载。
3、事务处理支持不同:
关系数据库善于处理事务原子性细粒度控制,方便事务回滚;
非关系数据库着重于处理大数据。
4.成本:
关系型数据库成本高;
Nosql数据库简单易部署,基本都是开源软。
5.数据一致性:
关系型数据库一样强调数据的一致
Nosql不提供对事务的处理。
二,redis
1.redis概述
redis是一个完全开源免费的key-value内存数据库。支持存储的value类型更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。同时,为了保证效率,数据都是缓存在内存中。并且redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
2.redis优缺点
优点:
具有极高的数据读写速度:数据读取的速度最高可达到110000次ls,数据写入速度最高可达到81000次/s;
支持丰富的数据类型:支持key-value、Strings、Lists、Hashes、Sets 及 Ordered Sets等数据类型操作;
支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
原子性: Redis所有操作都是原子性的;
支持数据备份:master-salve模式的数据备份。
缺点:
1、redis是内存数据库,所以单台机器存储的数据量跟机器本身的内存大小有关。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据,定时删除和定期删除为主动删除,Redis会定期主动淘汰一批已过期的key。
2、如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网络带宽。
3、修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,redis不能提供服务。
3.redis使用场景
Redis作为基于内存运行的数据库,缓存是其最常应用的场景之一。
Redis常见应用场景还包括获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。
三,redis安装部署
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.编译安装redis
cd /opt/
yum install -y gcc gcc-c++ make
tar zxvf redis-5.0.7.tar.gz
cd /opt/redis-5.0.7/
make && make PREFIX=/usr/local/redis install
2.执行脚本文件并输入路径
cd /opt/redis-5.0.7/utils
./install_server.sh
回车
Please select the redis executable path []
手动输入
/usr/local/redis/bin/redis-server
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224557325-701133054.png)
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224608815-1169415435.png)
3.优化路径
ln -s /usr/local/redis/bin/* /usr/local/bin/
/etc/init.d/redis_6379 stop
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224636158-2025392399.png)
Redis 命令工具:
redis-server 用于启动 Redis 的工具
redis-benchmark 用于检测 Redis 在本机的运行效率
redis-check-aof 修复 AOF 持久化文件
redis-check-rdb 修复 RDB 持久化文件
redis-cli Redis命令行工具
redis-cli 命令行工具
语法:redis-cli -h host -p port -a password
-h 指定远程主机
-p 指定 Redis 服务的端口号
-a 指定密码,未设置数据库密码可以省略-a 选项
若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库
例:
redis-cli -h 192.168.118.13 -p 6379
#此时无密码,不需要-a直接登陆
redis-benchmark 测试工具:
redis-benchmark [选项] [选项值]。
-h 指定服务器主机名。
-p 指定服务器端口。
-s 指定服务器 socket
-c 指定并发连接数。
-n 指定请求数。
-d 以字节的形式指定 SET/GET 值的数据大小。
-k 1=keep alive 0=reconnect 。
-r SET/GET/INCR 使用随机 key, SADD 使用随机值。
-P 通过管道传输请求。
-q 强制退出 redis。仅显示 query/sec 值。
–csv 以 CSV 格式输出。
-l 生成循环,永久执行测试。
-t 仅运行以逗号分隔的测试命令列表。
-I Idle 模式。仅打开 N 个 idle 连接并等待。
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224710003-1621182938.png)
测试存取大小为 100 字节的数据包的性能
redis-benchmark -h 192.168.118.13 -p 6379 -q -d 100
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224726216-1817348764.png)
四,redis命令
1.set/get 存放/获取数据
set 存放数据,命令格式为 set key value
get 获取数据,命令格式为 get key
例:
redis-cli -p 6379
set id 66
get id
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224741749-1160951457.png)
2.keys 取值
keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。
set a1 1
set a2 2
set a33 3
keys *
keys a*
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224757397-1632154993.png)
3.exists 判断值是否存在
exists 命令可以判断键值是否存在。
exists sex 结果显示:1存在,0不存在
exists bh
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224812849-1215702445.png)
4.del 删除key
del 命令可以删除当前数据库的指定 key。
keys *
del a33
keys *
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224829005-1289177920.png)
5.type 获取值的类型
type 命令可以获取 key 对应的 value 值类型
type a1
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224842035-942240439.png)
6.rename 重命名(覆盖)
rename 命令是对已有 key 进行重命名。(覆盖)
命令格式:rename 源key 目标key
使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值。在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据。
例:
keys a*
rename a2 a22
get a22
renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名。(不覆盖)
命令格式:renamenx 源key 目标key
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224859304-1676575509.png)
7.dbsize 查看库中key的数量
dbsize 命令的作用是查看当前数据库中 key 的数目。
例:
keys *
dbsize
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224918479-1219411738.png)
8.设置密码
使用config set requirepass password命令设置密码
使用config get requirepass命令查看密码(一旦设置密码,必须先验证通过密码,否则所有操作不可用)
例:
config set requirepass 123456
auth 123456
config get requirepass
quit
redis-cli -p 6379
keys *
auth 123456
keys *
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224933831-1853656396.png)
9.多数据库间切换
Redis 默认情况下包含 16 个数据库,数据库名称是用数字 0-15 来依次命名的。多数据库相互独立,互不干扰。
可以通过修改 Redis 配置文件 redis.conf 中的 databases 一值进行变更。
命令格式:select 序号
select 3
select 5
select 0 #索引为0的数据库,不显示索引号
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418224952931-890828904.png)
10.多数据库间移动数据
格式:move 键值 序号
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418225007495-758832690.png)
11.清除数据库数据
FLUSHDB :清空当前数据库数据
FLUSHALL :清空所有数据库的数据
五,redis高可用
在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.989%等等)。
但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。
在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和集群:
1.持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
2.主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。
缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
3.哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。
缺陷:写操作无法负载均衡;存储能力受到单机的限制。
4.集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
六,redis持久化
Redis 是运行在内存中,内存中的数据断电就会丢失
Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,为了能重用 Redis 数据,或者防止系统故障,需要将 Redis 中的数据写入到磁盘空间中,即持久化。
RDB:周期性的把内存中的数据保存在磁盘中
AOF:从redis的操作日志记录中将执行的过程同步到磁盘中
1.RDB持久化
RDB持久化:指在指定的时间间隔内将内存中当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),用二进制压缩存储,保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
1)处理流程
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418225030965-2069745866.png)
1.Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof的子进程,如果在执行则bgsave命令直接返回。
2.父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令
3.父进程fork后,bgsave命令返回"Background saving started"信息并不再阻塞父进程,并可以响应其他命令;
4.子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换
5.子进程发送信号给父进程表示完成,父进程更新统计信息
2)触发条件
1.手动触发:
save命令和bgsave命令都可以生成RDB文件。
save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间,服务器不能处理任何命令请求。而bgsave命令会创建一个子进程,由子进程来负责创建RDB文件,父进程(即Redis主进程)则继续处理请求。
bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此save已基本被废弃,线上环境要杜绝save的使用。
2.自动触发:
在自动触发RDB持久化时,Redis也会选择bgsave而不是save来进行持久化。
自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave。
vim /etc/redis/6379.conf
2.AOF持久化
AOF持久化,将Redis执行的每次写、删除命令记录到单独的日志文件中,查询操作不会记录; 当Redis重启时再次执行AOF文件中的命令来恢复数据。
与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案。
1)执行流程
AOF的执行流程包括:
命令追加(append):将Redis的写命令追加到缓冲区aof_buf;
文件写入(write)和文件同步(sync):根据不同的同步策略将aof_buf中的内容同步到硬盘;
文件重写(rewrite):定期重写AOF文件,达到压缩的目的。
【文件重写之所以能够压缩AOF文件,原因在于:
过期的数据和无效的命令不再写入文件】
2)文件重写
AOF的重写机制:
AOF的工作原理是将写的操作追加到文件中,这会导致文件中的冗余会越来越多
当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩;
AOF的重写原理:
Redis 会fork 出一条新进程,读取内存中的数据(并没有读取旧文件),并重写到一个临时文件中,最后替换旧的aof文件;
AOF的重写配置:
bgrewriteaof命令:异步执行一个 AOF(AppendOnly File) 文件重写操作
即使 Bgrewriteaof 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 Bgrewriteaof 成功之前不会被修改
![](https://img2022.cnblogs.com/blog/2640664/202204/2640664-20220418225052371-1011251853.png)
1.触发重写,执行bgrewriteaof命令
2.父进程fork子进程进行重写,fork子进程的同时父进程阻塞,fork完毕父进程继续接受指令(子进程只是父进程的快照(相当于复制了某时刻的父进程))
3.子进程在创建新的aof文件的同时,父进程继续接收write指令,存储到继续存到aof_buf缓存中和aof_rewirte_buf缓存中,所以父进程继续往旧的aof文件中备份,同时也要往新的AOf文件中备份。
4.新的aof备份完成;
5.1:同时父进程,备份的新文件创建完成
5.2:将aof_rewrite_buf缓存中的备份到新的aof文件中
5.3:新的文件替换旧aof文件
3)触发方式
可以在redis.config中进行配置,appendonly no改换为yes,再通过注释或解注释appendfsync配置需要的方案:
always:每次发生数据修改就会立即记录到磁盘文件中,这种方案的完整性好但是IO开销很大,性能较差;
everysec:在每一秒中进行同步,速度有所提升。但是如果在一秒内宕机的话可能失去这一秒内的数据;
no:默认配置,即不使用 AOF 持久化方案。
总结
redis优点:
具有极高的数据读写速度;支持丰富的数据类型;支持数据的持久化;原子性;支持数据备份。
缺点:Redis会定期主动淘汰一批已过期的key;占用主机的CPU,并会消耗现网络带宽;修改配置文件,进行重启,将硬盘中的数据加载进内存,占用时间比较久,且无法重启。
redis持久化:
RDB:周期性的把内存中的数据保存在磁盘中
AOF:从redis的操作日志记录中将执行的过程同步到磁盘中