Redis 学习指南
2025年4月5日
1. Redis 简介
Redis(Remote Dictionary Server)是一个开源的、内存中的数据结构存储系统,可用作数据库、缓存和消息代理。Redis 由 Salvatore Sanfilippo 开发,现在由 Redis Labs 维护。
主要特点
- 高性能:基于内存操作,读写速度极快(每秒可执行约 100,000 次读写操作)
- 持久化:支持数据持久化,可将内存中的数据保存到磁盘上
- 多种数据类型:支持字符串、哈希、列表、集合、有序集合等数据结构
- 原子操作:所有操作都是原子性的,支持事务
- 发布/订阅:支持发布/订阅模式
- Lua 脚本:支持 Lua 脚本执行
- 集群:支持主从复制、哨兵模式和分片集群
2. Redis 安装与配置
安装 Redis
Linux 系统安装:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install redis-server
# CentOS/RHEL
sudo yum install redismacOS 系统安装:
brew install redisWindows 系统:
Windows 不是 Redis 的官方支持平台,但可以使用:
- WSL(Windows Subsystem for Linux)
- Redis Windows 非官方版本:https://github.com/tporadowski/redis/releases
Docker 安装:
基本安装:
# 拉取最新版本的Redis镜像
docker pull redis
# 运行Redis容器
docker run --name my-redis -p 6379:6379 -d redis使用Docker Compose:
# docker-compose.yml
version: '3'
services:
redis:
image: redis
ports:
- "6379:6379"
#
volumes:
- redis-data:/data
restart: always
# 可选:设置密码
command: redis-server --requirepass your_password
volumes:
redis-data:持久化配置:
# 使用卷挂载持久化数据
docker run --name my-redis -p 6379:6379 -v /path/to/local/data:/data -d redis redis-server --appendonly yes
# 挂载自定义配置文件
docker run --name my-redis -p 6379:6379 -v /path/to/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf配置 Redis
主要配置文件:redis.conf,常见配置项:
port 6379:指定 Redis 服务器监听端口bind 127.0.0.1:绑定到特定 IPrequirepass foobared:设置认证密码maxmemory 100mb:最大内存使用maxmemory-policy allkeys-lru:内存淘汰策略
3. Redis 基础命令
连接 Redis
redis-cli
redis-cli -h 127.0.0.1 -p 6379 -a password # 指定主机、端口和密码基本操作
# 测试连接
PING # 返回 PONG
# 设置/获取键值
SET key value
GET key
# 检查键是否存在
EXISTS key
# 删除键
DEL key
# 设置过期时间(秒)
EXPIRE key seconds
# 查看剩余过期时间
TTL key
# 清空数据库
FLUSHDB # 清空当前数据库
FLUSHALL # 清空所有数据库4. Redis 数据类型
1. 字符串(String)
最基本的数据类型,可以存储文本、整数或二进制数据。
SET name "Redis"
GET name
# 计数器
SET counter 1
INCR counter
INCRBY counter 10
# 设置多个值
MSET key1 "value1" key2 "value2"
MGET key1 key22. 哈希(Hash)
存储字段和值的映射表,适合存储对象。
HSET user:1 name "John" age 30 city "New York"
HGET user:1 name
HGETALL user:1
HMGET user:1 name city
HINCRBY user:1 age 1
HEXISTS user:1 name
HDEL user:1 city3. 列表(List)
字符串列表,按插入顺序排序,可用作队列或栈。
LPUSH mylist "world"
LPUSH mylist "hello" # 左侧插入
RPUSH mylist "!" # 右侧插入
LRANGE mylist 0 -1 # 获取所有元素
LPOP mylist # 左侧弹出
RPOP mylist # 右侧弹出
LLEN mylist # 列表长度4. 集合(Set)
无序字符串集合,元素不重复。
SADD myset "a" "b" "c"
SMEMBERS myset
SISMEMBER myset "a"
SCARD myset # 集合大小
SREM myset "c" # 移除元素
# 集合操作
SINTER set1 set2 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集5. 有序集合(Sorted Set)
类似集合,但每个元素关联一个分数,按分数排序。
ZADD scores 90 "Alice" 85 "Bob" 95 "Carol"
ZRANGE scores 0 -1 # 按分数升序
ZREVRANGE scores 0 -1 # 按分数降序
ZRANGE scores 0 -1 WITHSCORES # 显示分数
ZRANGEBYSCORE scores 80 90 # 按分数范围查询
ZINCRBY scores 5 "Bob" # 增加分数
ZRANK scores "Carol" # 获取排名
ZREM scores "Alice" # 移除元素6. 位图(Bitmap)
用于处理位操作,可用于计数、标记状态等。
SETBIT online:today 10 1 # 设置第10位为1
GETBIT online:today 10
BITCOUNT online:today # 计算设置为1的位数7. HyperLogLog
用于估算集合基数的概率数据结构,内存占用小。
PFADD visitors user1 user2 user3
PFCOUNT visitors # 估算基数8. 地理空间(Geo)
用于存储地理坐标和计算距离。
GEOADD locations 116.39 39.90 "Beijing"
GEOADD locations 121.47 31.23 "Shanghai"
GEODIST locations "Beijing" "Shanghai" km # 计算距离
GEORADIUS locations 116.39 39.90 1000 km # 查找指定范围内的位置9. 流(Stream)
用于消息队列系统的数据类型,Redis 5.0 新增。
XADD mystream * name John age 30
XREAD COUNT 2 STREAMS mystream 0-05. Redis 高级特性
事务
Redis 事务允许一次执行多个命令,保证原子性(要么全部执行,要么全不执行)。
MULTI # 开始事务
SET user:id name John
SET user:id age 30
EXEC # 执行事务
DISCARD # 取消事务发布/订阅模式
允许客户端订阅频道,接收发布到这些频道的消息。
# 客户端 1
SUBSCRIBE news # 订阅频道
# 客户端 2
PUBLISH news "Hello" # 发布消息Lua 脚本
Redis 支持使用 Lua 脚本进行复杂操作,保证原子性。
EVAL "return redis.call('GET', KEYS[1])" 1 mykey持久化
Redis 提供两种持久化方式:
- RDB(Redis Database):按指定时间间隔生成数据快照
- AOF(Append Only File):记录每个写操作到日志文件
配置示例:
# RDB 配置
save 900 1 # 900秒内有1个更改则保存
save 300 10 # 300秒内有10个更改则保存
save 60 10000 # 60秒内有10000个更改则保存
# AOF 配置
appendonly yes
appendfsync everysec # 每秒同步一次主从复制
Redis 支持主从复制,从服务器可以是其他主服务器的从服务器。
# 从服务器配置
SLAVEOF 127.0.0.1 6379
# 或在配置文件中:
replicaof 127.0.0.1 6379哨兵模式
监控 Redis 主从服务器,自动故障转移。
sentinel.conf 配置示例:
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000集群模式
Redis 集群提供数据分片、高可用性和自动故障转移。
配置启用集群:
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 50006. Redis 应用场景
- 缓存系统:存储热点数据,减轻后端数据库压力
- 会话存储:存储用户会话信息
- 排行榜/计数器:利用有序集合实现高效排行榜
- 消息队列:使用列表或流实现轻量级消息队列
- 实时分析:利用位图等进行实时统计
- 地理位置应用:使用地理空间命令处理位置数据
- 分布式锁:实现分布式系统中的锁机制
- 限速器:实现访问频率限制
7. Redis 性能优化
-
内存优化
- 合理设置 maxmemory
- 选择适当的淘汰策略
- 使用 SCAN 代替 KEYS
-
命令优化
- 使用批量命令(MGET/MSET)
- 使用 Pipeline 减少网络开销
- 避免使用复杂度高的命令(如 KEYS)
-
连接优化
- 使用连接池
- 适当设置 timeout 值
-
持久化优化
- 分离 RDB 和 AOF 到不同磁盘
- 调整持久化频率
8. Redis 安全性
-
访问控制
- 设置密码认证
- 绑定特定 IP 地址
- 禁用危险命令
-
网络安全
- 使用防火墙限制访问
- 启用 TLS/SSL 加密连接
-
权限管理(Redis 6.0+)
- 使用 ACL 进行细粒度权限控制
# 创建用户并设置权限
ACL SETUSER myuser on >mypass ~* +@all9. Redis 监控与调试
-
INFO 命令:获取 Redis 服务器状态信息
INFO memory INFO clients INFO stats -
MONITOR 命令:实时监控 Redis 命令执行
MONITOR -
SLOWLOG 命令:查看慢查询日志
SLOWLOG GET 10 -
第三方监控工具:
- Redis Commander
- Redis Desktop Manager
- Prometheus + Grafana
10. Redis 客户端工具
命令行客户端
- redis-cli:Redis官方命令行客户端
# 基本连接 redis-cli # 带认证连接 redis-cli -h host -p port -a password # 实用命令 redis-cli --stat # 实时统计 redis-cli --bigkeys # 扫描大键 redis-cli --latency # 监控延迟 redis-cli --scan --pattern "user:*" # 扫描匹配的键
GUI客户端工具
-
Redis Desktop Manager (RedisInsight) - 跨平台桌面管理工具
- 特点:键浏览器、控制台、分析工具
- 下载:https://redis.com/redis-enterprise/redis-insight/
-
Another Redis Desktop Manager - 开源跨平台客户端
- 特点:简洁界面、多语言支持、SSH隧道
- 下载:https://github.com/qishibo/AnotherRedisDesktopManager
-
Redis Commander - 基于Web的Redis管理工具
- 特点:通过浏览器访问,支持集群
- 安装:
npm install -g redis-commander
编程语言客户端
-
Python:
# 安装 pip install redis# 基本用法 import redis r = redis.Redis(host='localhost', port=6379, db=0) r.set('foo', 'bar') value = r.get('foo') -
Java:Jedis, Lettuce, Redisson
<!-- Maven依赖 (Jedis) --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.3.1</version> </dependency>// 基本用法 Jedis jedis = new Jedis("localhost", 6379); jedis.set("foo", "bar"); String value = jedis.get("foo"); jedis.close(); -
Node.js:
# 安装 npm install redis// 基本用法 const redis = require("redis"); const client = redis.createClient(); await client.connect(); await client.set("key", "value"); const value = await client.get("key"); -
Go:
# 安装 go get github.com/go-redis/redis/v8// 基本用法 import ( "context" "github.com/go-redis/redis/v8" ) rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", }) err := rdb.Set(ctx, "key", "value", 0).Err() val, err := rdb.Get(ctx, "key").Result() -
PHP:
# 安装 composer require predis/predis// 基本用法 $redis = new Predis\Client(); $redis->set('foo', 'bar'); $value = $redis->get('foo');
Docker中使用Redis客户端
# 使用redis-cli连接到Docker中的Redis实例
docker exec -it my-redis redis-cli
# 带密码连接
docker exec -it my-redis redis-cli -a your_password
# 运行独立的redis-cli容器连接到Redis
docker run -it --network host redis redis-cli -h host -p port -a password11. 学习资源
- 官方文档:https://redis.io/documentation
- Redis 命令参考:https://redis.io/commands
- Redis 在线测试:https://try.redis.io/
- 书籍:
- 《Redis 实战》
- 《Redis 设计与实现》
- 《Redis 开发与运维》
12. Redis 常见问题解决
-
内存占用过高
- 检查大键:
redis-cli --bigkeys - 设置合理的过期时间
- 启用压缩
- 检查大键:
-
连接数过多
- 检查连接池配置
- 增加 maxclients 配置
-
持久化导致性能下降
- 调整持久化频率
- 使用单独的磁盘
- 考虑禁用持久化(仅用作缓存时)