提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- [一、关系型数据库 vs 非关系型数据库](#一、关系型数据库 vs 非关系型数据库)
-
- [1.1 关系型数据库(SQL)](#1.1 关系型数据库(SQL))
- [1.2 非关系型数据库(NoSQL)](#1.2 非关系型数据库(NoSQL))
- [1.3 关系型数据库与非关系型数据库对比](#1.3 关系型数据库与非关系型数据库对比)
- 1.4总结
- [二、Redis 简介](#二、Redis 简介)
- [三、Redis 安装与部署](#三、Redis 安装与部署)
-
- [3.1 环境准备](#3.1 环境准备)
- [3.2 安装流程](#3.2 安装流程)
- [3.4 配置文件调整](#3.4 配置文件调整)
- [四、Redis 命令工具](#四、Redis 命令工具)
-
- [4.1 常用工具介绍](#4.1 常用工具介绍)
- [五、Redis 常用命令](#五、Redis 常用命令)
-
- [5.1 基本数据操作](#5.1 基本数据操作)
- [5.2 模糊查询](#5.2 模糊查询)
- [5.3 键值判断与删除](#5.3 键值判断与删除)
- [5.4 键重命名](#5.4 键重命名)
- [5.5查看当前数据库中 key 的数目](#5.5查看当前数据库中 key 的数目)
- [5.6 密码设置与查看](#5.6 密码设置与查看)
- [5.7 Redis 多数据库管理](#5.7 Redis 多数据库管理)
- 总结
前言
关系型数据库 vs 非关系型数据库
Redis简介
安装与部署
常用命令
一、关系型数据库 vs 非关系型数据库
1.1 关系型数据库(SQL)
关系型数据库采用表格模型组织数据,具有严格的结构化特性。
特点:
1.表格模型(行 + 列)
2.使用 SQL 语言
3.数据必须符合表结构
4.强事务 ACID 特性,保证数据一致性
5.纵向扩展(升级硬件)
6.mysql部署在单独的物理服务器上,云上用RDS
常见产品:MySQL、Oracle、PostgreSQL
典型应用场景:
银行转账:A 转账给 B,必须保证 A 扣钱成功的同时 B 收钱成功(事务保证一致性)。
1.2 非关系型数据库(NoSQL)
非关系型数据库提供了更灵活的数据模型,适合处理大规模数据和半结构化数据。
特点:
键值对 / 文档 / 图结构存储
无需固定表结构
高并发、高可扩展
横向扩展(增加服务器节点)
常见产品:Redis、MongoDB、HBase、Memcached
典型应用场景:
微信聊天应用:一条消息可能是文字、图片、语音等多种形式,不适合用表格存储,文档型数据库更能满足这种灵活的数据结构需求。
1.3 关系型数据库与非关系型数据库对比
| 特性 | 关系型数据库 (RDBMS) | 非关系型数据库 (NoSQL) |
|---|---|---|
| 数据模型 | 结构化数据模型 使用表(Table)、行(Row)、列(Column)组织数据 表之间通过外键(Foreign Key)建立关系 | 灵活的数据模型 可以是键值对(Key-Value)、文档(Document)、列族(Column-Family)、图(Graph)等 无固定模式(Schema-less) |
| 查询语言 | 结构化查询语言(SQL) 支持复杂查询、连接(JOIN)、事务等 | 多样化查询方式 通常使用特定API或查询语言(如MongoDB的查询语法) 部分不支持复杂连接操作 |
| 扩展性 | 垂直扩展为主 通过提升单机性能(CPU、内存、存储)来扩展 水平扩展(分片)较复杂 | 水平扩展为主 易于通过增加节点实现分布式扩展 适合处理海量数据和高并发 |
| 事务支持 | 强一致性(ACID) 支持复杂事务(原子性、一致性、隔离性、持久性) | 最终一致性(BASE)为主 部分支持事务(如MongoDB多文档事务),但通常弱于RDBMS |
| 适用场景 | 结构化数据、复杂查询、强事务需求 如:财务系统、ERP、传统业务系统 | 半结构化/非结构化数据、高并发读写、灵活扩展 如:社交媒体、物联网、日志系统、内容管理 |
| 代表产品 | MySQL, PostgreSQL, Oracle, SQL Server | MongoDB(文档型), Redis(键值型), Cassandra(列族型), Neo4j(图型) |
选型建议:
- 选择关系型数据库:当需要强一致性事务、复杂的关系查询、数据结构稳定时。
- 选择非关系型数据库:当处理海量数据、需要水平扩展、数据结构灵活多变或读写并发极高时。
- 混合架构:许多现代系统同时使用两者(如用Redis缓存+MySQL持久化),发挥各自优势。
1.4总结
示例场景对比:
- 电商订单系统:用RDBMS保证交易事务的准确性(如扣款、库存)。
- 用户行为日志:用NoSQL存储大量半结构化的点击流数据,支持快速写入和灵活查询。
关键差异:
结构化 vs 灵活性:关系型数据库适合严格结构化的数据,非关系型数据库适合动态或半结构化数据。
扩展方式:关系型数据库通常通过硬件升级(垂直扩展),非关系型数据库通过分布式节点(水平扩展)。
设计哲学:关系型数据库优先保证数据一致性和完整性,非关系型数据库优先考虑性能和可扩展性。
二、Redis 简介
2.1定义:
开源、C 语言编写、基于内存、支持持久化的键值数据库。
2.2特性:
高性能:读取可达 110000 次/s,写入 81000 次/s
数据结构丰富:string、list、hash、sets、sorted sets
支持持久化:数据可保存到磁盘
原子性:单线程避免并发锁问题
主从复制:数据备份
2.3高性能原理
为什么快?
- 纯内存操作 → 避免磁盘 IO
- 单线程 → 避免锁开销
- I/O 多路复用 → 高并发
举例:
秒杀活动:库存扣减、订单写入,放到 Redis 避免数据库压力。
抖音热搜榜:用 sorted set 存储关键词 + 热度,实时排序。
注:在 Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,
仍然是单线程处理的
2.4 应用场景举例
秒杀活动:库存扣减、订单写入等高频操作放到Redis中,避免直接访问数据库造成压力
抖音热搜榜:使用sorted set存储关键词和热度值,实现实时排序和更新
2.5 学习资源
Redis中文学习网:https://www.tkcnn.com/redis/Getting-started.html
官方文档:https://redis.io/docs/latest/get-started/
三、Redis 安装与部署
3.1 环境准备
bash
# 下载地址:http://download.redis.io/releases/
systemctl stop firewalld
setenforce 0
yum install -y gcc gcc-c++ make
3.2 安装流程
bash
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
#由于Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行 ./configure 进行配置,可直接执行 make 与 make install 命令进行安装。
make && make PREFIX=/usr/local/redis install
## 标题
# 执行软件包提供的 install_server.sh 脚本文件设置 Redis 服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh # 一直回车
# 注意:需要手动修改可执行文件路径为/usr/local/redis/bin/redis-server
安装脚本会生成以下配置:
端口:6379(默认侦听端口)
配置文件:/etc/redis/6379.conf
日志文件:/var/log/redis_6379.log
数据目录:/var/lib/redis/6379
可执行文件:/usr/local/redis/bin/redis-server
客户端工具:/usr/local/bin/redis-cli

3.3 环境配置
c
# 创建符号链接,便于系统识别
ln -s /usr/local/redis/bin/* /usr/local/bin/
当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为 6379
c
netstat -natp | grep redis
c
# 服务管理
/etc/init.d/redis_6379 stop # 停止
/etc/init.d/redis_6379 start # 启动
/etc/init.d/redis_6379 restart # 重启
/etc/init.d/redis_6379 status # 状态
3.4 配置文件调整
c
vim /etc/redis/6379.conf
# 主要配置参数:
bind 127.0.0.1 192.168.10.110 # 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行,指定日志文件
# 重启redis
/etc/init.d/redis_6379 restart
配置参数说明:
可以将Redis配置比喻为一个仓库:
bind:指定谁可以进入仓库(允许访问的IP)
port:仓库的大门编号(服务端口)
daemonize:仓库是否有人值守(守护进程模式)
requirepass:仓库的锁(访问密码)
四、Redis 命令工具
4.1 常用工具介绍
redis-server:Redis服务器启动程序
redis-cli:Redis命令行客户端工具
c
# 连接语法:redis-cli -h host -p port -a password
-h :指定远程主机
-p :指定 Redis 服务的端口号
-a :指定密码,未设置数据库密码可以省略-a 选项
若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库
redis-cli -h 192.168.10.110 -p 6379 -a 123456
redis-benchmark:Redis性能测试工具
示例:redis-benchmark -c 100 -n 100000 → 100 并发,10 万请求
c
# 测试示例
#向 IP 地址为 192.168.10.110、端口为 6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求测试性能
redis-benchmark -h 192.168.10.120 -p 6379 -c 100 -n 100000
c
#测试存取大小为 100 字节的数据包的性能
redis-benchmark -h 192.168.10.110 -p 6379 -q -d 100
redis-check-rdb / redis-check-aof:持久化文件修复工具
五、Redis 常用命令
5.1 基本数据操作
set:存放数据,命令格式为 set key value
get:获取数据,命令格式为 get key
c
# 设置和获取值
127.0.0.1:6379> set teacher zhangsan
OK
127.0.0.1:6379> get teacher
"zhangsan"
5.2 模糊查询
#keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。
c
127.0.0.1:6379> set k1 1
127.0.0.1:6379> set k2 2
127.0.0.1:6379> set k3 3
127.0.0.1:6379> set v1 4
127.0.0.1:6379> set v5 5
127.0.0.1:6379> set v22 5
127.0.0.1:6379> KEYS * # 查看所有键
127.0.0.1:6379> KEYS v* # 查看v开头的键
127.0.0.1:6379> KEYS v? # 查看v开头且后面只有一位的键
127.0.0.1:6379> KEYS v?? # 查看v开头且后面有两位的键
应用场景:快速查看所有以user开头的缓存数
5.3 键值判断与删除
c
# exists 命令可以判断键值是否存在。
127.0.0.1:6379> exists teacher # 判断键是否存在
127.0.0.1:6379> exists tea
c
# del 命令可以删除当前数据库的指定 key。
127.0.0.1:6379> keys *
127.0.0.1:6379> del v5
127.0.0.1:6379> get v5
c
# type 命令可以获取 key 对应的 value 值类型。
127.0.0.1:6379> type k1 # 获取值类型
应用场景:检查某个商品是否还在缓存中
5.4 键重命名
rename命令重命名(会覆盖已存在的键)
cpp
命令格式:rename 源key 目标key
使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且目标key的值会覆盖源key的值。在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据。
127.0.0.1:6379> keys v*
1) "v1"
2) "v22"
127.0.0.1:6379> rename v22 v2
OK
127.0.0.1:6379> keys v*
1) "v1"
2) "v2"
127.0.0.1:6379> get v1
"4"
127.0.0.1:6379> get v2
"5"
127.0.0.1:6379> rename v1 v2
OK
127.0.0.1:6379> get v1
(nil)
127.0.0.1:6379> get v2
"4"
cpp
# renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名。(不覆盖)
命令格式:renamenx 源key 目标key
127.0.0.1:6379> keys *
127.0.0.1:6379> get teacher
"zhangsan"
127.0.0.1:6379> get v2
"4"
127.0.0.1:6379> renamenx v2 teacher
(integer) 0
127.0.0.1:6379> keys *
127.0.0.1:6379> get teacher
"zhangsan"
127.0.0.1:6379> get v2
"4"
应用场景:公司业务调整,需要将"用户"相关键改为"客户",但要避免覆盖已有数据
5.5查看当前数据库中 key 的数目
cpp
127.0.0.1:6379> dbsize # 查看当前数据库key数量
127.0.0.1:6379> keys
5.6 密码设置与查看
cpp
#使用config set requirepass yourpassword命令设置密码
127.0.0.1:6379> config set requirepass 123456 # 设置密码
#使用config get requirepass命令查看密码(一旦设置密码,必须先验证通过密码,否则所有操作不可用)
127.0.0.1:6379> auth 123456 # 认证密码
127.0.0.1:6379> config get requirepass # 查看密码
5.7 Redis 多数据库管理
Redis 支持多数据库,Redis 默认情况下包含 16 个数据库,数据库名称是用数字 0-15 来依次命名的。
多数据库相互独立,互不干扰。
cpp
#多数据库间切换
命令格式:select 序号
使用 redis-cli 连接 Redis 数据库后,默认使用的是序号为 0 的数据库。
# 数据库切换
127.0.0.1:6379> select 10 # 切换到10号数据库
127.0.0.1:6379[10]> select 15 #切换至序号为 15 的数据库
127.0.0.1:6379[15]> select 0 #切换至序号为 0 的数据库
cpp
#多数据库间移动数据
格式:move 键值 序号
127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k1
(nil)
127.0.0.1:6379[1]> select 0 #切换至目标数据库 0
OK
127.0.0.1:6379> get k1 #查看目标数据是否存在
"100"
127.0.0.1:6379> move k1 1 #将数据库 0 中 k1 移动到数据库 1 中
(integer) 1
127.0.0.1:6379> select 1 #切换至目标数据库 1
OK
127.0.0.1:6379[1]> get k1 #查看被移动数据
"100"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get k1 #在数据库 0 中无法查看到 k1 的值
(nil)
cpp
# 清除数据库内数据
FLUSHDB # 清空当前数据库
FLUSHALL # 清空所有数据库(慎用!)
应用场景:将测试数据放在1号库,生产数据在0号库,避免混