1.1 Redis 简介
1.1.1 Redis 是什么?
Redis(Remote Dictionary Server)是一个开源的、基于内存、支持多种数据结构的高性能 Key-Value 数据库,由 Salvatore Sanfilippo(又名 antirez) 于 2009 年创建,后由 Redis Labs(现 Redis Inc.)接手维护。
Redis 的最大特点就是:数据全部存储在内存中,磁盘只用于持久化,因此读写速度极快,常被称为 "内存数据库"。
1.1.2 Redis 的核心特性
特性 | 说明 |
基于内存,持久化 | Redis 所有数据都在内存中进行操作,且支持将数据同步到磁盘(RDB / AOF)。 |
丰富的数据类型 | 支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理位置、流等结构。 |
原子性操作 | 所有单条 Redis 命令都是原子操作,多条命令可用事务(MULTI/EXEC)或 Lua 脚本实现原子性。 |
高性能 | 每秒可执行数十万次读写操作,适用于高并发场景。 |
多语言支持 | 提供官方/社区驱动支持几乎所有主流语言(Python、Java、C#、Go、C++、PHP、Node.js 等)。 |
多种部署方式 | 支持单机、主从(Replication)、哨兵(Sentinel)和集群(Cluster)部署模式。 |
Pub/Sub 模式 | 内建发布/订阅系统,可以用于构建轻量级的消息通知系统。 |
1.1.3 Redis 的数据类型
类型 | 描述 | 示例用途 |
String(字符串) | 最基本的类型,支持整数、浮点数、字符串 | 缓存、计数器、令牌桶等 |
Hash(哈希) | 类似 Python 字典,field -> value 映射 | 用户信息存储 |
List(列表) | 有序链表,支持两端插入、弹出 | 消息队列、任务队列 |
Set(集合) | 无序、不重复元素集合 | 标签、抽奖系统 |
Sorted Set(有序集合) | 带分数的集合,可按分数排序 | 排行榜、积分系统 |
Bitmap(位图) | 使用位进行存储 | 活跃用户统计、签到系统 |
HyperLogLog | 统计不同元素个数,近似但高效 | UV(独立访客)统计 |
Geo(地理) | 存储经纬度和搜索范围 | 附近的人、地图应用 |
Stream(流) | 类似 Kafka 的消息流结构 | 日志收集、数据管道 |
1.1.4 Redis 应用场景
Redis 的速度与数据结构优势使它广泛应用于以下场景:
场景 | 用法 |
缓存系统 | 将热点数据缓存在 Redis 中,减轻数据库压力,提高响应速度(如:用户信息缓存、商品详情缓存) |
计数器系统 | 实现点赞、阅读数、访问量等功能,使用字符串的自增操作 |
排行榜系统 | 使用有序集合(Sorted Set)构建游戏积分榜、电商销量榜等 |
Session 管理 | Web 应用的会话信息存储在 Redis 中,支持分布式架构 |
消息队列 | 使用 List(RPUSH + LPOP)或 Stream 构建异步任务队列 |
分布式锁 | 利用 SETNX、Lua 脚本或 Redlock 算法实现高可靠分布式锁 |
发布/订阅系统 | 基于 Redis 的 Pub/Sub 构建简易消息通知服务 |
实时数据分析 | 使用位图、HyperLogLog、流等结构进行高性能数据统计 |
1.1.5 Redis 的架构设计简述
- 单线程模型:Redis 使用单线程模型处理客户端请求(主线程),避免了线程上下文切换带来的性能开销。数据操作都是原子的。
- IO 多路复用:内部使用
epoll
(Linux)等机制来处理大量并发请求,保证高吞吐。 - 持久化机制:
-
- RDB(快照方式):定期将内存数据快照写入磁盘,恢复快。
- AOF(日志方式):记录每一条写命令,可以实现更高的数据安全性。
- 复制机制:一主多从,支持数据同步,增强可用性。
- 哨兵机制:自动监控 Redis 实例的健康状态,实现自动故障转移。
- 集群机制:Redis Cluster 实现水平扩展,分布式存储,适合大规模数据和高并发场景。
1.1.6 Redis 与其他数据库的对比
比较项 | Redis | MySQL | MongoDB | Memcached |
类型 | 内存数据库 | 关系型数据库 | 文档型数据库 | 内存缓存 |
数据结构 | 多种结构 | 表结构 | BSON 文档 | 仅字符串 |
持久化 | RDB / AOF | 支持 | 支持 | 不支持 |
查询能力 | 键值查询,支持部分复杂操作 | SQL | 灵活文档查询 | 键值查询 |
并发处理 | 单线程+IO复用 | 多线程 | 多线程 | 多线程 |
分布式 | Cluster 支持 | 需借助中间件 | 原生支持 | 不支持 |
应用场景 | 缓存、计数器、排行榜等 | 主数据存储 | JSON存储、日志等 | 临时缓存 |
1.2 Redis 下载与安装
1.2.1 Redis 下载
Redis 的官方源码托管在 GitHub,也可以从官网下载最新稳定版本。
中文网:Redis中文网
GitHub 仓库:https://github.com/redis/redis
Redis安装包分为windows版和Linux版:
- Windows版下载地址:https://github.com/microsoftarchive/redis/releases
- Linux版下载地址: Index of /releases/
你可以使用如下命令下载源码:
wget http://download.redis.io/releases/redis-7.2.1.tar.gz
替换版本号可获取其他版本。
1.2.2 Redis 安装( Linux )
- 解压源码
tar -xzf redis-7.2.1.tar.gz
cd redis-7.2.1
- 编译 Redis
Redis 使用 make
工具编译:
make
make test # 可选步骤:运行测试用例
- 安装 Redis 到系统路径
make install
默认会安装以下几个可执行文件到 /usr/local/bin
:
redis-server
:Redis 服务端redis-cli
:命令行客户端redis-benchmark
:性能测试工具redis-check-rdb
:检查 RDB 文件redis-check-aof
:检查 AOF 文件
注意:Redis 7.x 版本之后对 GCC 要求较高,请确保使用较新版本的 GCC 编译器(推荐 GCC 9+)。
1.2.3 Redis 安装( Windows)
Redis的Windows版属于绿色软件,直接解压即可使用
1.3 Redis 服务启动与停止(Windows 版)
虽然 Redis 官方并不再维护 Windows 原生版本,但社区提供了稳定版本,依然可以在 Windows 上开发和测试。
1.3.1 Redis 在 Windows 上的启动方式
启动 Redis 服务端:
redis-server.exe redis.windows.conf
你也可以直接运行 redis-server.exe
来启动默认配置(但推荐加载配置文件)。
启动后会看到日志输出如下:
[xxx] Ready to accept connections
表示服务已成功启动。
注意:
- 如果你双击
redis-server.exe
启动,会看到黑色窗口,请不要关闭,否则 Redis 服务也会关闭。 - 如需后台运行,可以通过将其安装为 Windows 服务(见下方扩展)。
1.3.2 Redis 客户端连接命令(Windows)
Redis 提供命令行客户端工具 redis-cli.exe
。
连接本地 Redis:
redis-cli.exe
连接远程 Redis:
redis-cli.exe -h <host> -p <port> -a <password>
例子:
redis-cli.exe -h 127.0.0.1 -p 6379
连接后将进入交互模式:
127.0.0.1:6379> set name one
OK
127.0.0.1:6379> get name
"one"
1.3.3 修改 Redis 配置文件(Windows)
Redis 的配置文件在 Windows 版本中名为 redis.windows.conf
,是一个普通的文本文件,你可以用记事本或 VS Code 打开它。
以下是几个常用的配置项说明(建议修改):
配置项 | 功能 | 示例 |
| 设置监听端口 |
|
| 设置 Redis 访问密码 |
|
| Windows 无效 | 不修改 |
| 绑定 IP(Windows 中无效) | 无需设置 |
| 是否开启 AOF 持久化 |
|
| 持久化文件保存目录 |
|
修改配置后,重新用该配置文件启动 Redis:
redis-server.exe redis.windows.conf
1.3.4 Redis 客户端图形工具
Another Redis Desktop Manager
1.4 Redis 服务启动与停止(Linux 端)
环境准备说明
默认你已经:
- 安装了 Redis(一般通过源码编译或
yum install redis
安装) - 配置文件路径通常为:
/etc/redis.conf
- Redis 命令工具位于
/usr/local/bin
或/usr/bin
1.4.1 Redis 服务启动命令
方法一:使用命令直接启动 Redis
最基本的启动 Redis 命令如下:
redis-server /etc/redis.conf
或者使用默认配置(不推荐):
redis-server
方法二:作为系统服务启动
如果你通过系统包管理工具安装(如 yum / apt),Redis 会注册为系统服务:
# 启动 Redis 服务
sudo systemctl start redis
# 设置开机自启
sudo systemctl enable redis
# 查看运行状态
sudo systemctl status redis
# 停止 Redis 服务
sudo systemctl stop redis
# 重启 Redis 服务
sudo systemctl restart redis
有些发行版服务名可能是 redis-server
或 redis_6379
,可以用 systemctl list-units | grep redis
查看。
1.4.2 客户端连接命令
Redis 提供了命令行工具 redis-cli
,用于连接 Redis 服务。
连接本地 Redis:
redis-cli
连接成功后会进入交互式终端:
127.0.0.1:6379> set name redis
OK
127.0.0.1:6379> get name
"redis"
连接远程 Redis:
redis-cli -h <hostname> -p <port> -a <password>
例如:
redis-cli -h 192.168.1.100 -p 6379 -a 123456
1.4.3 修改 Redis 配置文件
Redis 的主配置文件通常在:
/etc/redis.conf
或者你自己安装的目录下,如:
/usr/local/redis/redis.conf
常用配置项解释:
配置项 | 描述 | 示例 |
| Redis 监听端口 |
|
| 绑定主机 IP |
(仅本地)或 (全部IP) |
| 设置访问密码 |
|
| 是否后台运行 |
(Linux 上建议开启) |
| 数据持久化文件存储目录 |
|
| 开启 AOF 持久化 |
|
修改配置文件后重启 Redis:
sudo systemctl restart redis
或者(如果是手动启动的):
pkill redis-server
redis-server /etc/redis.conf
扩展:使用后台运行方式启动 Redis(daemonize)
在实际部署中,我们希望 Redis 能后台运行。
修改配置文件:
daemonize yes
然后运行:
redis-server /etc/redis.conf
此时你可以用:
ps -ef | grep redis
来查看后台进程是否存在。
如果不想用 systemd
启动,也可以用 nohup
:
nohup redis-server /etc/redis.conf > /var/log/redis.log 2>&1 &
总结命令一览(Linux)
操作 | 命令 |
启动 Redis(配置文件) |
|
启动 Redis(系统服务) |
|
停止 Redis |
|
查看状态 |
|
启动客户端 |
|
连接远程 Redis |
|
修改配置 | 编辑 文件 |
后台运行 Redis | 配置 或使用 |
2. Redis 数据类型
Redis 一大优势就是支持多种灵活且高效的数据结构,不仅仅是简单的键值对存储。
2.1 五种常用数据类型介绍
类型 | 英文名 | 说明 | 常用应用场景 |
字符串 | String | 最基本的数据类型,存储文本或数字 | 缓存、计数器、会话信息等 |
哈希 | Hash | 键值对集合,适合存储对象 | 用户信息、配置项 |
列表 | List | 链表结构,有序可重复 | 消息队列、任务列表 |
集合 | Set | 无序不重复元素集合 | 标签系统、去重功能 |
有序集合 | Sorted Set | 每个元素有一个分数,自动排序 | 排行榜、带权重排序 |
2.2 各种数据类型特点
类型 | 特点 | 优点 | 缺点 |
String | 存储最灵活的数据类型(可以是整数、浮点、JSON) | 操作简单、效率高 | 单值结构,不适合复杂结构 |
Hash | 类似 Python 字典,支持字段操作 | 占用内存小,结构清晰 | 适合小量字段,不宜嵌套 |
List | 有序、允许重复,支持栈和队列操作 | 支持从两端插入/删除,适合消息队列 | 长列表插入/查询性能下降 |
Set | 元素唯一,无序集合 | 自动去重,快速查找/交集/差集 | 无序,不支持排序 |
ZSet | 有序集合,按分数排序 | 排行榜、分页支持、按权重统计 | 写入比 Set 更耗资源(维护排序) |
3. Redis 常用命令
3.1 字符串操作命令
# 设置字符串键值
SET key value
# 获取键对应的值
GET key
# 设置带过期时间的键(单位秒)
SETEX key seconds value
# 自增 / 自减
INCR key
DECR key
# 追加字符串内容
APPEND key value
# 设置多个键值对
MSET key1 val1 key2 val2 ...
# 获取多个键的值
MGET key1 key2 ...
# 设置值并返回旧值
GETSET key new_value
常见场景:缓存用户信息、登录状态、计数器等。
3.2 哈希操作命令(Hash)
# 设置哈希字段值
HSET user:1 name "Tom"
# 获取字段值
HGET user:1 name
# 设置多个字段值
HMSET user:1 name "Tom" age 20
# 获取多个字段
HMGET user:1 name age
# 获取所有字段和值
HGETALL user:1
# 判断字段是否存在
HEXISTS user:1 age
# 删除字段
HDEL user:1 age
# 获取字段数
HLEN user:1
# 自增字段(数字类型)
HINCRBY user:1 age 1
常见场景:存储对象型数据如用户信息、商品配置等。
3.3 列表操作命令(List)
# 从左/右推入元素(插入)
LPUSH mylist value
RPUSH mylist value
# 从左/右弹出元素(删除)
LPOP mylist
RPOP mylist
# 获取指定范围内元素(分页)
LRANGE mylist start stop
# 获取列表长度
LLEN mylist
# 设置指定索引的值
LSET mylist index value
# 删除指定值的元素
LREM mylist count value
# 截取保留指定范围(修剪列表)
LTRIM mylist start stop
常见场景:消息队列、时间线、评论列表等。
3.4 集合操作命令(Set)
# 添加元素
SADD myset value1 value2
# 移除元素
SREM myset value
# 判断是否存在
SISMEMBER myset value
# 获取所有元素
SMEMBERS myset
# 获取元素数量
SCARD myset
# 随机获取元素
SRANDMEMBER myset [count]
# 求交集、并集、差集
SINTER set1 set2
SUNION set1 set2
SDIFF set1 set2
常见场景:标签系统、共同好友、兴趣匹配、权限控制。
3.5 有序集合操作命令(Sorted Set / ZSet)
# 添加元素,带分数(score)
ZADD rank 100 "Tom" 200 "Jerry"
# 获取元素分数
ZSCORE rank "Tom"
# 增加分数
ZINCRBY rank 10 "Tom"
# 按分数排序返回元素
ZRANGE rank 0 -1 WITHSCORES
# 按分数从高到低排序
ZREVRANGE rank 0 -1 WITHSCORES
# 获取指定成员排名(从 0 开始)
ZRANK rank "Tom"
ZREVRANK rank "Tom"
# 按分数范围查询
ZRANGEBYSCORE rank 50 150
# 删除元素
ZREM rank "Tom"
常见场景:排行榜(如游戏分数)、热度值统计、动态权重排序。
3.6 通用命令(适用于所有类型)
# 检查键是否存在
EXISTS key
# 删除键
DEL key
# 设置键过期时间(秒)
EXPIRE key 60
# 查看剩余时间(秒)
TTL key
# 查看类型
TYPE key
# 获取所有键(慎用,线上不推荐)
KEYS *
# 重命名键
RENAME key new_key
# 持久化键(移除过期时间)
PERSIST key
建议:KEYS
命令在生产环境慎用,可使用 SCAN
替代(更安全)。