Redis 作为目前最流行的 NoSQL 数据库之一,是后端开发和技术架构中的核心组件。
Redis 概述:知识点详解
1.1 NoSQL 数据库
1.1.1 什么是 NoSQL?
NoSQL(Not Only SQL)是对不同于传统关系型数据库(RDBMS)的数据库管理系统的统称。随着互联网的发展,数据量爆炸式增长,传统关系型数据库在应对高并发、海量数据以及灵活的数据模型时显得力不从心,从而推动了 NoSQL 的兴起。
1.1.2 NoSQL 与关系型数据库的主要区别
| 特性 | 关系型数据库 (RDBMS) | NoSQL 数据库 |
|---|---|---|
| 数据模型 | 表格模型,数据以行和列的形式存储,关系通过外键定义。 | 模型多样,主要包括键值对、文档、列族、图等。 |
| 模式 | 固定模式,需要预先定义表结构(Schema),修改困难。 | 动态模式,可以灵活地存储不同结构的数据,非常适合半结构化和非结构化数据。 |
| 扩展性 | 主要支持垂直扩展,即通过提升单机硬件性能来增加处理能力。 | 专为水平扩展设计,可以通过增加普通服务器节点来分担负载,成本更低。 |
| 事务与一致性 | 严格遵循 ACID 原则,保证强一致性。 | 遵循 BASE 原则(基本可用、软状态、最终一致性),以保证高性能和高可用性。 |
| 查询语言 | 使用结构化查询语言(SQL)。 | 不同数据库有不同的查询方式,如 MongoDB 使用 MQL,Redis 使用命令。 |
1.1.3 NoSQL 数据库的四大核心类型
- 键值存储 :数据以
Key-Value的形式存储。性能极高,常用于缓存、会话管理。代表产品:Redis、Amazon DynamoDB。 - 文档数据库 :数据以 JSON 或 BSON 格式的文档存储,支持嵌套结构。适合内容管理、用户画像等。代表产品:MongoDB、CouchDB。
- 列族存储 :数据按列族存储,适合大规模数据分析、时序数据。代表产品:Apache HBase、Cassandra。
- 图数据库 :数据以节点和边(关系)的形式存储。适用于社交网络、推荐系统、欺诈检测。代表产品:Neo4j。
1.2 Redis 简介
1.2.1 什么是 Redis?
Redis(Remote Dictionary Server)是一个开源(BSD 许可)、基于内存存储的数据结构服务器。它可以用作数据库 、高速缓存 和消息队列代理。
1.2.2 Redis 的核心特点
- 基于内存,性能极高:数据主要存储在内存中,读写速度极快,每秒可处理数十万甚至百万级请求。
- 丰富的数据结构:不仅仅支持简单的 Key-Value,还支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、HyperLogLog、地理空间(GEO)等。
- 持久化机制:虽然数据在内存中,但 Redis 提供了 RDB(快照)和 AOF(追加日志)两种方式将数据持久化到磁盘,以防数据丢失。
- 高可用与分布式 :
- 主从复制:实现数据的多副本备份。
- 哨兵模式:提供高可用性,自动进行故障转移。
- Redis Cluster:支持分布式部署,实现数据自动分片和水平扩展。
- 丰富的功能:支持事务、Lua 脚本、发布订阅(Pub/Sub)、管道(Pipeline)等。
1.2.3 Redis 的主要应用场景
- 缓存系统:减轻后端数据库的压力,如页面缓存、热点数据缓存。
- 会话存储:在分布式系统中集中管理用户登录会话信息。
- 实时排行榜/计数器:利用有序集合和原子自增操作,实现点赞数、阅读量、游戏排名等。
- 消息队列:利用列表或 Stream 数据类型实现简单的任务调度和异步处理。
- 分布式锁 :利用
SETNX命令实现分布式系统中的资源互斥访问。
1.2.4 Redis 的优势与局限性
- 优势:极致性能、数据结构丰富、生态完善、支持持久化。
- 局限性 :
- 内存成本高:数据量受限于物理内存,成本比磁盘数据库高。
- 持久化开销 :RDB 持久化时的
fork操作可能造成短暂延迟;AOF 的always模式会显著降低写入性能。 - 复杂查询能力弱:不支持表关联、分组等复杂查询。
- 最终一致性:在主从异步复制下,可能存在短暂的数据不一致。
1.3 Redis 组件安装
1.3.1 安装方式概览
在 Linux 环境中,Redis 的安装主要有两种方式:
- 包管理器安装 :简单快捷,适合学习和快速部署。
- Debian/Ubuntu :
sudo apt update && sudo apt install redis-server - Red Hat/CentOS :
sudo yum install redis
- Debian/Ubuntu :
- 源码编译安装 :可以指定版本和安装路径,适合定制化需求。
- 步骤:下载源码包 -> 解压 ->
make->make install。
- 步骤:下载源码包 -> 解压 ->
1.3.2 安装后的初步检查
- 检查服务状态 :
sudo systemctl status redis(或redis-server)。 - 查看版本 :
redis-server --version。 - 连接测试 :使用客户端连接
redis-cli,执行ping命令,返回PONG表示成功。
1.4 Redis 服务配置
1.4.1 配置文件 redis.conf
Redis 的配置主要通过修改 redis.conf 文件实现。常见的文件位置有 /etc/redis/redis.conf 或 /usr/local/etc/redis/redis.conf。
1.4.2 核心配置项解析
| 配置项 | 说明 | 示例 | 参考资料 |
|---|---|---|---|
bind |
监听IP地址。默认 127.0.0.1 只允许本地访问。生产环境可设为内网IP。 |
bind 0.0.0.0 |
|
port |
监听端口。默认 6379。 |
port 6379 |
|
daemonize |
是否以守护进程方式后台运行。 | daemonize yes |
|
logfile |
日志文件存放路径。 | logfile /var/log/redis/redis-server.log |
|
databases |
设置数据库的数量,默认16个。 | databases 16 |
|
save |
RDB持久化规则,如 save 900 1 表示15分钟内至少有1个key改变就触发快照。 |
save 900 1 |
|
appendonly |
是否开启AOF持久化。 | appendonly yes |
|
maxmemory |
设置Redis能使用的最大内存。建议不超过物理内存的70%。 | maxmemory 2gb |
|
maxmemory-policy |
内存达到上限后的淘汰策略。常用 allkeys-lru(从所有key中淘汰最近最少使用的)。 |
maxmemory-policy volatile-lru |
|
requirepass |
设置访问密码。 | requirepass your_strong_password |
1.4.3 配置生效
修改配置文件后,必须重启 Redis 服务才能使更改生效:
bash
sudo systemctl restart redis-server
# 或
sudo /etc/init.d/redis-server restart
重启后可通过 redis-cli info 或 config get * 验证配置是否已加载。
1.5 Redis 基础认证
Redis 通过简单的密码认证机制提供一层安全防护。
1.5.1 设置密码
- 通过配置文件(永久有效) :在
redis.conf中取消注释或添加requirepass yourpassword,然后重启服务。 - 通过命令行动态设置(重启后失效) :在
redis-cli中执行CONFIG SET requirepass yourpassword。
1.5.2 使用密码连接 Redis
-
登录时指定密码 :
bashredis-cli -h 127.0.0.1 -p 6379 -a yourpassword -
登录后认证 :
bash$ redis-cli redis 127.0.0.1:6379> AUTH yourpassword OK
1.5.3 注意事项
- 密码以明文形式传输,认证层旨在提供基本保护,应结合防火墙(如设置
iptables)限制非信任IP访问。 - 避免使用过于简单的密码,因为Redis查询速度极快,外部用户可以快速尝试暴力破解。
1.6 redis-benchmark
1.6.1 工具简介
redis-benchmark 是 Redis 官方自带的性能测试工具,用于模拟 N 个客户端同时发送 M 个请求,以此衡量 Redis 服务器的读写吞吐量。
1.6.2 常用参数选项
| 参数 | 作用 | 默认值 | 示例 |
|---|---|---|---|
-h |
指定Redis服务器主机 | 127.0.0.1 |
-h 192.168.1.100 |
-p |
指定Redis服务器端口 | 6379 |
-p 6380 |
-a |
指定认证密码 | 无 | -a mypassword |
-c |
指定并发连接数 | 50 |
-c 200 |
-n |
指定总请求数 | 100000 |
-n 1000000 |
-d |
指定SET/GET操作的数据大小(字节) | 2 |
-d 100 |
-r |
使用随机Key。-r 10000 表示在 key:000000000000 到 key:000000009999 范围内随机 |
无 | -r 10000 |
-q |
静默模式,只显示每秒请求数 | 无 | -q |
--csv |
以CSV格式输出结果,便于导入分析 | 无 | --csv |
-t |
仅运行以逗号分隔的测试命令列表 | 无 | -t set,get |
-P |
开启管道模式,一次发送 numreq 条请求 |
1 |
-P 10 |
1.6.3 基准测试实践示例
-
基础性能测试:
bashredis-benchmark -q -n 100000 -c 50这条命令会测试100次请求、50个并发下的所有默认命令,并以安静模式输出每秒请求数。
-
测试特定命令及随机Key:
bashredis-benchmark -t set,get -r 100000 -n 200000 -d 256 -q在20万次总请求中,测试
set和get命令,使用10万个随机key,value大小为256字节,模拟更真实的缓存场景。 -
测试管道模式对性能的提升:
bashredis-benchmark -t set -P 8 -n 100000 -q通过
-P 8启用管道,一次流水线发送8条命令,可以显著减少网络往返时间(RTT),从而观察QPS的提升。