全栈手账 订阅 RSS

Redis 快速入门

Redis 快速上手教程:从安装启动讲起,介绍五种核心数据结构与常用命令、过期策略与持久化机制(RDB / AOF),并演示如何用 Python 客户端操作 Redis,适合快速入门。

读了 15 分钟 更新于 7 月 15 日

1. 什么是 Redis

Redis(Remote Dictionary Server)是一个开源的高性能键值存储系统,以内存为主要存储介质,支持持久化到磁盘。

核心特点:

  • 内存数据库,读写速度极快(10万+ QPS)
  • 支持丰富的数据结构(字符串、哈希、列表、集合、有序集合)
  • 支持持久化、事务、发布订阅
  • 单线程模型,避免并发问题
  • 支持 Lua 脚本、集群、哨兵

典型应用场景:

  • 缓存(减轻数据库压力)
  • 会话管理(Session Store)
  • 实时排行榜
  • 消息队列(Pub/Sub)
  • 计数器(点赞、访问量)

2. 安装与启动

Windows

powershell
# 使用 Scoop 安装scoop install redis# 启动服务redis-server# 启动客户端redis-cli

macOS

bash
# 使用 Homebrew 安装brew install redis# 启动服务brew services start redis# 启动客户端redis-cli

Linux(Ubuntu/Debian)

bash
# 安装sudo apt-get updatesudo apt-get install redis-server# 启动服务sudo systemctl start redissudo systemctl enable redis# 启动客户端redis-cli

Docker

bash
# 运行 Redis 容器docker run -d -p 6379:6379 --name myredis redis# 进入容器执行命令docker exec -it myredis redis-cli

3. 基础命令

连接与测试

redis
# 连接 Redis(默认端口 6379)redis-cli -h localhost -p 6379# 测试连接127.0.0.1:6379> PINGPONG# 选择数据库(0-15,默认 0)127.0.0.1:6379> SELECT 1OK

键管理

命令 说明 示例
SET key value 设置键值 SET name "Alice"
GET key 获取值 GET name → "Alice"
DEL key 删除键 DEL name
EXISTS key 检查键是否存在 EXISTS name → 1 或 0
KEYS pattern 查找匹配的键 KEYS user:*
TYPE key 获取值类型 TYPE name → "string"
TTL key 获取剩余过期时间(秒) TTL name
EXPIRE key seconds 设置过期时间 EXPIRE name 3600
PERSIST key 移除过期时间 PERSIST name
FLUSHDB 清空当前数据库 FLUSHDB
FLUSHALL 清空所有数据库 FLUSHALL

4. 五种核心数据结构

4.1 String(字符串)

最基础的数据类型,可存储文本、数字、二进制数据。

redis
# 设置值SET username "bob"# 获取值GET username"bob"# 设置并指定过期时间(秒)SET session_token "abc123" EX 1800# 数字自增SET counter 100INCR counter        # → 101INCRBY counter 10   # → 111# 数字自减DECR counter        # → 110# 追加内容APPEND username " smith"GET username        # → "bob smith"# 获取长度STRLEN username     # → 10

4.2 Hash(哈希表)

适合存储对象,键值对的集合。

redis
# 设置字段值HSET user:1001 name "Alice" age 25 city "Beijing"# 获取字段值HGET user:1001 name       # → "Alice"HGET user:1001 age        # → "25"# 获取所有字段和值HGETALL user:10011) "name"2) "Alice"3) "age"4) "25"5) "city"6) "Beijing"# 获取所有字段HKEYS user:1001           # → ["name", "age", "city"]# 获取所有值HVALS user:1001           # → ["Alice", "25", "Beijing"]# 字段自增HINCRBY user:1001 age 1   # → 26# 检查字段是否存在HEXISTS user:1001 name    # → 1# 删除字段HDEL user:1001 city# 获取字段数量HLEN user:1001            # → 2

4.3 List(列表)

双向链表,可在两端插入/删除元素。

redis
# 从左侧插入LPUSH fruits apple banana cherryLRANGE fruits 0 -1        # → ["cherry", "banana", "apple"]# 从右侧插入RPUSH fruits dateLRANGE fruits 0 -1        # → ["cherry", "banana", "apple", "date"]# 从左侧弹出LPOP fruits               # → "cherry"# 从右侧弹出RPOP fruits               # → "date"# 获取长度LLEN fruits               # → 2# 获取指定范围元素LRANGE fruits 0 1         # → ["banana", "apple"]# 获取指定索引元素LINDEX fruits 0           # → "banana"# 移除指定元素(count 为负数表示从尾部移除)LREM fruits 1 banana      # → 1(移除1个banana)

4.4 Set(集合)

无序、不重复的元素集合,支持交集、并集、差集操作。

redis
# 添加元素SADD tags python java go rust# 获取所有元素SMEMBERS tags1) "python"2) "java"3) "go"4) "rust"# 检查元素是否存在SISMEMBER tags python     # → 1# 获取集合大小SCARD tags                # → 4# 删除元素SREM tags rust            # → 1# 差集(tags 中有但 new_tags 中没有)SADD new_tags python javascriptSDIFF tags new_tags       # → ["java", "go"]# 交集(两个集合都有的)SINTER tags new_tags      # → ["python"]# 并集SUNION tags new_tags      # → ["python", "java", "go", "javascript"]# 随机获取元素SRANDMEMBER tags          # → "java"# 随机移除元素SPOP tags                 # → "go"

4.5 Sorted Set(有序集合)

类似 Set,但每个元素关联一个分数(score),按分数排序。

redis
# 添加元素和分数ZADD scores 95 Alice 88 Bob 92 Charlie 98 Dave# 获取所有元素(按分数升序)ZRANGE scores 0 -1 WITHSCORES1) "Bob"2) "88"3) "Charlie"4) "92"5) "Alice"6) "95"7) "Dave"8) "98"# 获取所有元素(按分数降序)ZREVRANGE scores 0 -1 WITHSCORES1) "Dave"2) "98"3) "Alice"4) "95"5) "Charlie"6) "92"7) "Bob"8) "88"# 获取指定排名范围(0 为第一名)ZRANGE scores 0 1 WITHSCORES  # 前三名ZREVRANGE scores 0 1 WITHSCORES  # 倒数两名# 获取元素分数ZSCORE scores Alice       # → "95"# 分数自增ZINCRBY scores 2 Bob      # → "90"# 获取集合大小ZCARD scores              # → 4# 获取指定分数范围的元素ZRANGEBYSCORE scores 90 95 WITHSCORES1) "Charlie"2) "92"3) "Alice"4) "95"# 删除元素ZREM scores Bob           # → 1# 获取排名(升序)ZRANK scores Alice        # → 1(第二名)# 获取排名(降序)ZREVRANK scores Alice     # → 1(第二名)

5. 过期时间

redis
# 设置键时指定过期时间SET temp_data "value" EX 60    # 60秒过期SET temp_data "value" PX 60000 # 60000毫秒过期# 设置已有键的过期时间EXPIRE session 3600        # 3600秒过期PEXPIRE session 3600000    # 毫秒# 获取剩余过期时间TTL session                # 返回剩余秒数(-1 表示永不过期,-2 表示键不存在)PTTL session               # 返回剩余毫秒数# 移除过期时间PERSIST session# 设置过期时间点(UNIX 时间戳)EXPIREAT session 1715232000PEXPIREAT session 1715232000000

6. 持久化

Redis 提供两种持久化方式:

RDB(Redis Database)

  • 原理:定时快照,将内存数据写入 .rdb 文件
  • 优点:文件体积小,恢复速度快
  • 缺点:可能丢失最近一次快照后的修改
redis
# 手动触发快照SAVE        # 阻塞主进程BGSAVE      # 后台异步执行# 查看持久化配置CONFIG GET save

AOF(Append Only File)

  • 原理:记录所有写操作命令到 .aof 文件
  • 优点:数据安全性更高,最多丢失一秒数据
  • 缺点:文件体积大,恢复速度慢
redis
# 开启 AOF(需修改配置文件 redis.conf)appendonly yes# 同步策略(默认 everysec)appendfsync always     # 每次写入都同步(慢但安全)appendfsync everysec   # 每秒同步(推荐)appendfsync no         # 由操作系统决定(最快)# 手动重写 AOF(压缩文件)BGREWRITEAOF

建议:生产环境同时开启 RDB 和 AOF。


7. Python 操作 Redis

使用 redis-py 库:

bash
pip install redis

基本操作

python
import redis# 连接 Redisr = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)# Stringr.set('name', 'Alice')print(r.get('name'))      # 'Alice'# Hashr.hset('user:1001', mapping={'name': 'Bob', 'age': 25, 'city': 'Beijing'})print(r.hgetall('user:1001'))  # {'name': 'Bob', 'age': '25', 'city': 'Beijing'}# Listr.lpush('fruits', 'apple', 'banana', 'cherry')print(r.lrange('fruits', 0, -1))  # ['cherry', 'banana', 'apple']# Setr.sadd('tags', 'python', 'java', 'go')print(r.smembers('tags'))  # {'python', 'java', 'go'}# Sorted Setr.zadd('scores', {'Alice': 95, 'Bob': 88, 'Charlie': 92})print(r.zrange('scores', 0, -1, withscores=True))# [('Bob', 88.0), ('Charlie', 92.0), ('Alice', 95.0)]# 过期时间r.set('temp', 'value', ex=60)print(r.ttl('temp'))  # 60# 批量操作pipe = r.pipeline()pipe.set('key1', 'val1')pipe.set('key2', 'val2')pipe.execute()

连接池(推荐)

python
from redis import ConnectionPoolpool = ConnectionPool(host='localhost', port=6379, db=0)r = redis.Redis(connection_pool=pool)

8. 常用配置

redis.conf 关键配置:

ini
# 绑定地址(生产环境建议仅绑定内网 IP)bind 127.0.0.1# 端口port 6379# 密码(建议设置)requirepass yourpassword# 数据库数量databases 16# 最大内存限制maxmemory 1GBmaxmemory-policy allkeys-lru  # 内存满时删除最久未使用的键# RDB 快照save 900 1        # 900秒内至少1次写操作save 300 10       # 300秒内至少10次写操作save 60 10000     # 60秒内至少10000次写操作# AOFappendonly yesappendfsync everysec

9. 安全建议

  1. 设置密码:requirepass 配置项
  2. 绑定内网 IP:不要直接暴露到公网
  3. 启用防火墙:限制访问源 IP
  4. 定期备份:定期备份 .rdb 和 .aof 文件
  5. 限制内存:设置 maxmemory 防止内存溢出
  6. 禁用危险命令:在配置中重命名或禁用 FLUSHALL、CONFIG 等命令

10. 参考资源

前端、后端、部署、客服都是我一个人。写这里的东西都是真踩过的坑,不是抄来的教程。