一、初识 Redis
1.1 Redis 概述
1. Redis 简介
Redis(Remote Dictionary Server) 是一款高性能的 键值存储(Key-Value Store) 数据库,属于 NoSQL 数据库的一种。相较于传统键值数据库,Redis 的核心优势在于其支持 多种数据结构,包括:
- String(字符串)
- Hash(哈希表)
- List(列表)
- Set(集合)
- Sorted Set(有序集合)
- Bitmaps(位图)
- HyperLogLog(基数统计)
- GEO(地理空间索引)
由于 Redis 数据主要存储在内存中,其读写性能极高(可达 10万+ QPS)。同时,Redis 提供 持久化机制(RDB 快照和 AOF 日志),确保数据在宕机或故障时不会丢失。
此外,Redis 还支持:
- 键过期(Key Expiration)
- 发布订阅(Pub/Sub)
- 事务(Transactions)
- 流水线(Pipeline)
- Lua 脚本(Lua Scripting)
2. Redis 的发展历程
- 2008 年:Redis 由 Salvatore Sanfilippo(@antirez) 开发,最初用于优化其项目 LLOOGG 的队列性能(替代 MySQL)。
- 2009 年:Redis 1.0 开源发布,迅速获得广泛关注。
- 至今:Redis 已成为全球最受欢迎的 内存数据库 之一,被众多 大型互联网公司 采用。
1.2 Redis 核心特性
- MySQL 主要通过 表 存储数据,“关系型数据库”
- Redis 通过 键值对 存储数据,“非关系型数据库”
根据官方的介绍,Redis 具有以下特性和优点:
1. 高性能
- Redis 提供极高的读写性能,能在毫秒级的时间内完成数据操作。
- 支持单线程架构,利用事件循环处理多个客户端请求,避免了上下文切换的开销。
- 从网络角度上,Redis 使用了IO多路复用的机制(epoll)
- Redis是C语言开发的,从某种程度上也减少了延迟以及提高了处理速度
2. 丰富的数据类型
- 除了传统的键值对数据存储,Redis 支持多种复杂的数据类型,如:
- 字符串(String)
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- 有序集合(Sorted Set)
- 位图(Bitmap)
- HyperLogLog(用于基数统计)
- 地理空间(Geospatial)
3. 持久化
- Redis 提供了两种持久化机制:
- RDB(Redis 数据库快照):通过定期将数据保存到磁盘中来持久化数据。
- AOF(追加文件):每次对 Redis 进行写操作时,将操作命令追加到日志文件中。
- 这两种方式可以结合使用,以确保数据的持久性和高可用性。
4. 原子操作
- Redis 提供对数据的原子操作支持,确保在并发情况下,数据的修改不会发生冲突或不一致。
5. 主从复制
- Redis 支持主从复制机制,可以通过复制将数据同步到多个从节点,从而提高数据的可用性与读取性能。
6. 高可用性与分布式
- Redis 通过 Redis Sentinel 实现高可用性,能够自动故障转移(failover),保证系统的持续可用性。
- Redis Cluster 支持分布式部署,可以自动分片(sharding),以支持大规模的数据存储。
7. 内存存储与低延迟
- Redis 完全基于内存(RAM)操作,具有极低的延迟。
- 适用于高频的读写操作,如实时应用程序、缓存等。
8. 灵活的过期策略
- Redis 支持键值对的过期时间设置,可以自动删除过期的数据。
- 支持 LRU(Least Recently Used)算法来清除最少使用的键,帮助控制内存使用。
9. 事务支持
- Redis 提供了事务机制,支持 MULTI、EXEC、WATCH 等命令来实现一组操作的原子执行。
10. 简单的 API
- Redis 提供了非常简单直观的 API,易于集成和使用,支持多种编程语言,如 Python、Java、C、Go 等。
总结
下图是总结了Redis的核心功能:
- 速度快:由于是内存数据库,读取速度极快。
- 数据结构丰富:支持多种数据结构,能够满足不同场景的需求。
- 高可用性:通过复制和故障转移机制确保系统的高可用性。
- 易于扩展:支持分片和分布式架构,能轻松扩展为大规模分布式系统。
- 灵活性强:支持多种持久化方案和过期策略。
1.3 Redis 应用场景
Redis 适用场景
缓存
- Web缓存:Redis 常被用作缓存系统,以提高Web应用的响应速度和减轻数据库的负载。它通过存储热数据,避免重复查询数据库。
- 页面缓存:可以将渲染过的页面存储在 Redis 中,从而快速返回给用户,减少服务器端渲染负担。
- 数据库查询结果缓存:将数据库查询结果缓存在 Redis 中,避免对数据库的重复查询,减少数据库负载。
会话存储(Session Store)
- Redis 常被用作会话存储,尤其是在处理大量用户会话时。由于 Redis 支持键值对存储和高效的过期策略,非常适合存储用户会话数据。
- 它能支持高并发的读写,并且提供自动过期功能,确保会话数据能在合理时间后自动清理。
实时数据分析
- Redis 的快速读写能力使它非常适合做实时数据分析。例如,使用 Redis 存储网站的实时访问数据、用户活动数据等。
- 计数器:利用 Redis 的自增操作,可以很方便地实现点击计数、PV(页面浏览量)和 UV(独立访客数)等功能。
- 实时流数据处理:借助 Redis 的 列表 和 集合 等数据结构,可以实时处理和分析大量流数据。
排行榜/计分系统
- 有序集合(Sorted Set) 是 Redis 的一项强大功能,非常适合实现排行榜和计分系统。通过有序集合,可以高效地存储并排序用户分数。
- 常见应用如在线游戏的排行榜、社交平台的用户积分等。
消息队列(Message Queue)
- Redis 可以作为高效的消息队列系统,支持 发布/订阅(Pub/Sub) 模式以及 列表 结构作为队列实现。
- 它可以用来在分布式系统中进行异步任务处理、事件通知等场景。其快速的生产者/消费者模型能够实现低延迟的消息传递。
实时聊天系统
- Redis 的发布/订阅模型(Pub/Sub)常常用于实现实时消息推送系统。通过 Redis,用户可以在不同的聊天室中实时交换消息。
- 该功能非常适合社交应用、即时通讯工具、在线客服等场景。
队列任务系统
- Redis 的列表(List)数据结构非常适合用来实现任务队列,支持 LPUSH 和 RPOP 等原子操作,可以高效地进行任务的推送和消费。
- 例如,后台任务处理、异步任务分发等场景。
分布式锁
- 在分布式系统中,Redis 可以作为分布式锁的实现方式。通过 Redis 提供的 SETNX 命令,多个进程可以竞争获取锁,确保资源在同一时刻只被一个进程访问。
- 这种锁的机制可广泛应用于分布式系统中的资源控制、事务管理等场景。
Redis 不适用场景
站在数据规模的角度看,数据可以分为大规模数据和小规模数据;我们知道 Redis 的数据是存在内存中的,如果数据量过于大的情况下,使用Redis经济成分很高(内存的价格远高于磁盘)
站在数据冷热的角度看,数据分为热数据与冷数据;热数据通常指需要频繁操作的数据,反之为冷数据,对于一个视频网站来说,视频的基本信息就属于热数据,用户观看记录一般情况下不会经常访问,属于冷数据。
如果将这些冷数据放在Redis中,就浪费了其内存空间。这些冷数据就不适合放在Redis中。
即将那些要经常被访问的数据放到内存中,而不经常被访问的放在磁盘中存储。
1.4 Redis 版本
Redis 借鉴了 Linux 操作系统的版本号命名规则:如果版本号的第二位是奇数,则表示该版本为非稳定版本(例如 2.7、2.9、3.1);如果是偶数,则为稳定版本(例如 2.6、2.8、3.0、3.2)。当前的奇数版本是下一个稳定版本的开发版本,例如 2.9 是 3.0 版本的开发版本。因此,生产环境通常选择偶数版本的 Redis。如果希望提前体验新的特性,可以选择最新的奇数版本。
二、Redis 安装与基础操作
下面相关的安装与操作部分主要以Ubuntu系统为主进行介绍:
2.1 安装 Redis
- 在 Ubuntu 系统中,直接使用 apt 安装即可:
apt install redis -y # -y 自动确认安装过程中的提示
- Windows 系统安装reids:
- https://github.com/tporadowski/redis/releases
- 进入github对应的目录下,直接下载压缩包或安装包msi
- 安装后reids目录内容如下:
2.2 支持远程连接
- Ubuntu 系统 修改
/etc/redis/redis.conf
- 修改
bind 127.0.0.1
为bind 0.0.0.0
- 修改
protected-mode yes
改为protected-mode no
- Windows 系统修改下载目录下的
redis.windows-service.conf
2.3 Redis 基础控制
启动 Redis 服务
service redis-server start
停止 Redis 服务
service redis-server stop
重启 Redis 服务
service redis-server restart
三、Redis 重要文件 & 作用
3.1 工具 & 脚本
下面是一些Redis中重要的工具与脚本,用于服务器的管理、性能测试、监控、数据文件的检查与修复等功能:
文件路径 | 解释 | 作用 |
---|---|---|
/usr/bin/redis-benchmark |
Redis 基准测试工具 | 用于测试 Redis 服务器性能。可以模拟大量并发操作来评估 Redis 的性能表现。 |
/usr/bin/redis-check-aof |
AOF 文件检查工具 | 用于检查和修复 Redis 的 AOF(追加文件)日志。如果 Redis 崩溃或数据不一致,可以使用它来检查和修复 AOF 文件。 |
/usr/bin/redis-check-rdb |
RDB 文件检查工具 | 用于检查和修复 Redis 的 RDB(数据库快照)文件。如果 RDB 文件损坏或不完整,可以使用该工具进行修复。 |
/usr/bin/redis-cli |
Redis 命令行客户端 | 通过命令行连接到 Redis 服务器,允许用户发送 Redis 命令进行交互、管理 Redis 实例。 |
/usr/bin/redis-sentinel |
Redis Sentinel 监控工具 | 用于管理 Redis 集群的高可用性。它监控主服务器的健康状态,并在主服务器发生故障时,自动切换到备用服务器。 |
/usr/bin/redis-server |
Redis 服务器启动程序 | 启动 Redis 服务器实例,处理所有客户端的请求并执行数据存储和查询操作。 |
/usr/libexec/redis-shutdown |
Redis 关闭服务脚本 | 用于优关闭 Redis 服务器,确保数据被正确保存并释放资源。 |
3.2 配置文件
/etc/redis-sentinel.conf
/etc/redis.conf
/etc/redis.conf
是 Redis 服务器的配置文件。/etc/redis-sentinel.conf
是 Redis Sentinel 的配置文件。
3.3 持久化文件存储目录
/var/lib/redis/
Redis 持久化生产的 RDB 和 AOF ⽂件都默认生成于该目录下。
3.4 日志文件目录
/var/log/redis/
该目录下会保存 Redis 运行期间 产生的日志文件,默认按照天数进行分割,并会将一定日期的日期文件使用gzip格式压缩保存。
四、Redis 命令行客户端
Redis客户端与服务端的交互过程如下图:
4.1 连接Redis服务器的两种模式
1. 交互式连接(推荐用于日常操作)
连接命令格式:
redis-cli -h {host} -p {port}
典型使用场景:
- 需要连续执行多个命令
- 调试和开发环境
- 需要查看命令返回值的场景
操作示例:
$ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping # 测试连接
PONG
127.0.0.1:6379> set user:1001 "张三" # 设置键值
OK
127.0.0.1:6379> get user:1001 # 获取值
"张三"
127.0.0.1:6379> info memory # 查看内存信息
2. 命令行模式(适合脚本调用)
命令格式:
redis-cli -h {host} -p {port} {command}
适用场景:
- Shell脚本中调用Redis命令
- 需要直接获取命令结果的场景
- 自动化任务执行
使用示例:
$ redis-cli ping # 测试连接
PONG
$ redis-cli set counter 100 # 设置值
OK
$ redis-cli incr counter # 原子递增
(integer) 101
$ redis-cli --raw get counter # 原始格式输出
101
4.2 连接参数简化技巧
默认连接配置:
- 当连接本地服务器(127.0.0.1)和默认端口(6379)时,可省略参数:
redis-cli # 等同于 redis-cli -h 127.0.0.1 -p 6379
常用连接选项:
参数 | 说明 | 示例 |
---|---|---|
-a | 认证密码 | redis-cli -a password |
-n | 选择数据库 | redis-cli -n 1 |
–raw | 原始格式输出 | redis-cli --raw get key |
–stat | 实时监控 | redis-cli --stat |
4.3 高级连接技巧
1. 批量命令执行
$ redis-cli <<EOF
SET user:1002 "李四"
EXPIRE user:1002 3600
GET user:1002
EOF
2. 管道操作(提升批量操作性能)
$ echo -e "SET key1 value1\nGET key1" | redis-cli --pipe
3. TLS安全连接(Redis 6.0+)
redis-cli --tls --cert ./redis.crt --key ./redis.key
4.4 连接问题排查
常见错误处理:
连接拒绝:
$ redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused
解决方案:
- 确认Redis服务已启动:
ps aux | grep redis
- 检查防火墙设置
- 确认Redis服务已启动:
认证失败:
(error) NOAUTH Authentication required
解决方案:
redis-cli -a yourpassword
连接超时:
解决方案:redis-cli -h remote_host --timeout 5