目录
一、关系型数据库与非关系型数据库
1.关系型数据库
1.1概述
关系型数据库是基于关系模型(二维表格模型)构建的数据库系统,广泛用于存储和管理结构化数据。它将数据组织成表格(表),表中的行代表记录,列代表属性
1.2特点
- 结构化数据:
数据以表格形式存储,数据表之间可以通过主键和外键建立关系
- 标准查询语言:
使用SQL(结构化查询语言)进行数据的创建、查询、更新和删除操作
- ACID特性:
支持原子性、一致性、隔离性和持久性,确保数据操作的可靠性和稳定性
- 数据完整性:
通过约束(如主键、外键、唯一性约束等)保证数据的完整性和一致性
1.3主要组成部分
表(Table):数据的基本存储单位,由行和列组成
行(Row):表中的一条记录
列(Column):记录的属性
主键(Primary Key):唯一标识表中每条记录的字段
外键(Foreign Key):用于在不同表之间建立关系的字段
1.4主流关系型数据库
Oracle:功能强大,广泛用于大型企业和金融系统
MySQL:开源、易用,适用于中小型网站和应用
SQL Server:微软的数据库管理系统,集成度高,适合Windows环境
PostgreSQL:开源,支持复杂查询和事务,适用于高要求的应用
DB2:IBM的数据库,主要面向企业级解决方案
1.5应用场景
事务性应用: 需要高并发和事务支持的场景,如金融系统、电子商务
数据分析: 结构化数据分析和报表生成
**传统业务系统:**如ERP、CRM等系统,适合使用关系型数据库进行数据管理
2.非关系型数据库
2.1概述
非关系型数据库(NoSQL)是一类不同于传统关系型数据库的数据存储系统,旨在处理海量数据和高并发需求。NoSQL意为"不仅仅是SQL",强调其灵活性和多样性
2.2特点
- 灵活的数据模型:
不要求固定的表结构,数据可以是文档、键值对、列族或图形等形式
- 高可扩展性:
支持横向扩展,可以通过增加更多的服务器来分担负载,适应数据增长
- 高性能:
优化了读写性能,能够高效处理大规模数据和高并发访问
- 最终一致性:
有些非关系型数据库采用最终一致性模型,而非传统的ACID事务,适合需要高可用性的场景
2.3主要类型
- 键值存储:
数据以键值对形式存储,快速查找
例子:Redis、DynamoDB
- 文档存储:
数据以文档形式存储,通常使用JSON或BSON格式,灵活性高
例子:MongoDB、CouchDB
- 列族存储:
数据按列存储,适合大规模数据分析
例子:HBase、Cassandra
- 图数据库:
专为存储和查询图结构数据设计,适合社交网络、推荐系统等
例子:Neo4j、ArangoDB
2.4应用场景
大数据分析: 处理海量数据集,如日志分析和实时数据处理
社交网络: 存储用户信息、关系等复杂数据
内容管理: 灵活的数据结构支持多种内容类型,如图片、视频、文档
**实时应用:**对高并发访问有需求的应用,如在线游戏、即时消息
3.关系型数据库和非关系型数据库区别
3.1数据存储方式
关系型数据库:
①数据以表格形式存储,包含行和列
②数据表之间通过主键和外键建立关系,适合结构化数据管理
非关系型数据库:①数据以文档、键值对、列族或图形等形式存储,灵活性高
②不要求固定的结构,适合多样化和非结构化数据
3.2扩展方式
关系型数据库:
①通常采用纵向扩展,通过提升单一服务器的硬件性能(如增加内存或CPU)来处理更高的负载
②存在性能瓶颈,扩展性有限
非关系型数据库:
①采用横向扩展,通过增加更多的普通服务器(节点)来分担负载,适合大规模数据处理
②天然支持分布式架构
3.3对事物性的支持
关系型数据库:
①支持强事务性,符合ACID特性(原子性、一致性、隔离性、持久性),适合需要高一致性和复杂查询的应用
②具备细粒度的事务控制和回滚能力
非关系型数据库:
①通常不具备完整的ACID支持,支持最终一致性,适合高并发和大数据量场景
②更关注扩展性和可用性,而非严格的事务控制
3.4查询语言
关系型数据库:
①使用SQL(结构化查询语言)进行数据操作,标准化程度高
非关系型数据库:
①使用各种不同的查询方式,通常不依赖于标准化的查询语言,具体实现取决于数据库类型(如MongoDB的查询语言、Redis的命令等)
二、Redis数据库
1.什么是Redis
Redis(Remote Dictionary Server)是一个开源的高性能NoSQL数据库,使用C语言编写。它基于内存运行,采用键值对(key-value)的存储形式,并支持持久化,将内存中的数据保存到磁盘
2.Redis特点
- 高读写速度:
Redis 的性能非常优越,能够支持每秒大量的读写请求
2. 丰富的数据类型:支持多种数据结构,如字符串、列表、哈希、集合和有序集合,适应不同场景的需求
3. 数据持久化:支持将内存数据保存到磁盘,确保重启后数据仍然可用
4. 原子性:所有操作都是原子性的,保证数据一致性
5. 数据备份:通过主从复制(master-slave)模式实现数据备份,提高可靠性
3.Redis速度快的原因
- 纯内存存储:
Redis 将数据存储在内存中,避免了磁盘 I/O 带来的延迟,确保极快的数据读写速度
- 单线程模型:
Redis 采用单线程处理命令,减少了锁竞争和线程创建销毁的开销,降低了上下文切换的成本。这使得操作的执行更加高效
- I/O 多路复用:
通过使用 I/O 多路复用技术,Redis 能够同时处理多个连接,从而提高了并发处理能力,充分利用 CPU 资源
4.Redis应用场景
1. 缓存:
作为内存数据库,Redis 常用于缓存热点数据,减少后端数据库的负载,加快数据访问速度
2. 会话存储:
可以用来存储用户会话信息,实现高效的用户状态管理
3. 实时分析:
支持高频数据写入和读取,适合实时数据分析和统计,如网站访问量、用户行为等
4. 消息队列:
通过列表和发布/订阅机制,Redis 可用于构建高效的消息队列系统,处理异步任务
5. 排行榜和计数器:
利用有序集合,Redis 可以轻松实现实时排行榜和计数器功能
6. 临时数据存储:
支持设置键的过期时间,适合存储临时数据,如验证码等
7. 分布式锁:
Redis 的原子性操作可用于实现分布式锁,帮助控制并发访问
三、Redis安装部署
1.环境设置
关闭防火墙以及增强功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.下载依赖包及解压压缩包
下载依赖包
yum install -y gcc gcc-c++ make
上传并解压压缩包
cd /opt
tar zxvf redis-5.0.7.tar.gz
编译安装
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
3.执行脚本并配置相关配置文件
执行软件包提供的install_server.sh脚本文件
cd /opt/redis-5.0.7/utils
./install_server.sh
...... 一直回车
直到出现:Please select the redis executable path []
然后在这句话后面手动输入
/usr/local/redis/bin/redis-server
#注意要一次性正确输入
#没有一次性输入正确,那么要保证后面一定作软链接
Selected config:
Port : 6379 #默认侦听端口为6379
Config file : /etc/redis/6379.conf #配置文件路径
Log file : /var/log/redis_6379.log #日志文件路径
Data dir : /var/lib/redis/6379 #数据文件路径
Executable : /usr/local/redis/bin/redis-server #可执行文件路径
Cli Executable : /usr/local/bin/redis-cli #客户端命令工具
把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
ln -s /usr/local/redis/bin/* /usr/local/bin/
当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为 6379
netstat -natp | grep redis
Redis 服务控制
/etc/init.d/redis_6379 stop #停止
/etc/init.d/redis_6379 start #启动
/etc/init.d/redis_6379 restart #重启
/etc/init.d/redis_6379 status #状态
修改配置 /etc/redis/6379.conf 参数
vim /etc/redis/6379.conf
bind 127.0.0.1 172.16.58.10 #70行,添加 监听的主机地址
port 6379 #93行,Redis默认的监听端口
daemonize yes #137行,启用守护进程
pidfile /var/run/redis_6379.pid #159行,指定 PID 文件
loglevel notice #167行,日志级别
logfile /var/log/redis_6379.log #172行,指定日志文件
重启服务
/etc/init.d/redis_6379 restart
四、Redis命令工具
1.常用命令工具
redis-server:用于启动 Redis 的工具
redis-benchmark:用于检测 Redis 在本机的运行效率
redis-check-aof:修复 AOF 持久化文件
redis-check-rdb:修复 RDB 持久化文件
redis-cli:Redis 命令行工具
1.1redis-cli命令行工具
基本语法
redis-cli -h host -p port -a password
|----|-----------------------|
| 选项 | 功能 |
| -h | 指定远程主机 |
| -p | 指定 Redis 服务的端口号 |
| -a | 指定密码(如果未设置密码,可以省略此选项) |
redis-cli -h 172.16.58.10 -p 6379 -a 123
1.2redis-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 | 强制退出,仅显示每秒查询数量 |
| --csv | 以 CSV 格式输出结果 |
| -l | 生成循环,持续执行测试 |
| -t | 仅运行指定的测试命令 |
| -I(大写i) | Idle 模式,打开 N 个空闲连接并等待 |
发送并发连接和请求
redis-benchmark -h 172.16.58.10 -p 6379 -c 100 -n 100000
测试特定数据大小的性能
redis-benchmark -h 172.16.58.10 -p 6379 -q -d 100
测试本机上Redis服务的SET和LPUSH操作性能
redis-benchmark -t set,lpush -n 100000 -q
2.Redis数据库常用命令
2.1数据的存放和获取
set:存放数据,命令格式为 set key value
get:获取数据,命令格式为 get key
例:
127.0.0.1:6379> set student wm
OK
127.0.0.1:6379> get student
"wm"
2.2键值查询
设置键值
127.0.0.1:6379> set A1 1
OK
127.0.0.1:6379> set A2 2
OK
127.0.0.1:6379> set B3 3
OK
127.0.0.1:6379> set B1 4
OK
127.0.0.1:6379> set C5 5
OK
127.0.0.1:6379> set C20 5
OK
(1)KEYS * #查看所有键
127.0.0.1:6379> KEYS *
1) "A1"
2) "A2"
3) "B3"
4) "B1"
5) "C5"
6) "C20"
(2)KEYS A* # 以 A 开头的键
127.0.0.1:6379> KEYS A*
1) "A1"
2) "A5"
(3)KEYS A? # 以 A 开头,后面有任意一位
127.0.0.1:6379> KEYS A?
1) "A1"
1) "A5"
(4)KEYS C?? # 以 C 开头,后面有任意两位
127.0.0.1:6379> KEYS C??
1) "C20"
(5)判断键是否存在
exists key
127.0.0.1:6379> exists student #判断 student 键是否存在
(integer) 1 # 1 表示 student 键是存在
127.0.0.1:6379> exists room
(integer) 0 # 0 表示 room 键不存在
(6)删除指定键
del key
127.0.0.1:6379> keys *
127.0.0.1:6379> del A1
127.0.0.1:6379> get A1 #这时候会发现获取不到数据
(7)获取键值类型
type key
127.0.0.1:6379> type A2
string
(8)重命名键(覆盖)
rename old_key new_key
使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值。在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据
127.0.0.1:6379> keys B*
1) "B3"
2) "B1"
127.0.0.1:6379> rename B1 B2
OK
127.0.0.1:6379> keys B*
1) "B3"
2) "B2"
127.0.0.1:6379> get B3
"3"
127.0.0.1:6379> get B2
"4"
127.0.0.1:6379> rename B3 B33
OK
127.0.0.1:6379> get B3
(nil)
127.0.0.1:6379> get B2
"4"
(9)重命名键(不覆盖)
renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名
renamenx old_key new_key
127.0.0.1:6379> keys *
127.0.0.1:6379> get student
"wm"
127.0.0.1:6379> get B2
"4"
127.0.0.1:6379> renamenx B2 student
(integer) 0
127.0.0.1:6379> keys *
127.0.0.1:6379> get student
"wm"
127.0.0.1:6379> get B2
"4"
(10)查看当前数据库中键的数量
dbsize
127.0.0.1:6379> dbsize
(11)设置密码
config set requirepass yourpassword
127.0.0.1:6379> config set requirepass 123
(12)验证密码
auth yourpassword
127.0.0.1:6379> auth 123
127.0.0.1:6379> config get requirepass
3.Redis多数据库常用命令
3.1切换数据库
命令格式:select 序号
select db_number
使用 redis-cli 连接 Redis 数据库后,默认使用的是序号为 0 的数据库
127.0.0.1:6379> select 10 #切换至序号为 1 的数据库
127.0.0.1:6379[10]> select 15 #切换至序号为 5 的数据库
127.0.0.1:6379[15]> select 0 #切换至序号为 0 的数据库
3.2在数据库之间移动
格式:move 键值 序号
move key db_number
127.0.0.1:6379> set fzx 100
OK
127.0.0.1:6379> get fzx
"100"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> move fzx 1
(integer) 1
127.0.0.1:6379[1]> get fzx
"100"
3.3清空当前数据库数据
FLUSHDB :清空当前数据库数据
127.0.0.1:6379> FLUSHDB
OK
3.4清空所有数据库的数据(慎用)
FLUSHALL :清空所有数据库的数据,慎用!
127.0.0.1:6379> FLUSHALL
OK