Skip to content
清晨的一缕阳光
返回

Redis 快速入门与实战指南

本文是 Redis 的快速入门指南,将带你从零开始学习 Redis 的安装部署、基本操作和实际应用。无论你是初学者还是有一定经验的开发者,都能从中获得实用的知识。

一、Redis 简介

1.1 什么是 Redis?

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,通常用作数据库、缓存和消息中间件。

核心特点

1.2 适用场景

场景说明典型应用
缓存加速数据访问用户信息、商品详情
会话存储分布式 Session用户登录状态
消息队列异步任务处理订单处理、邮件发送
排行榜实时排序游戏排名、热搜榜
计数器高并发计数文章阅读量、点赞数
分布式锁并发控制秒杀、库存扣减

二、安装与部署

2.1 Docker 部署(推荐)

单机部署

# 拉取最新镜像
docker pull redis:7.2

# 启动 Redis 容器
docker run -d \
  --name redis \
  -p 6379:6379 \
  -v /data/redis/data:/data \
  -v /data/redis/redis.conf:/etc/redis/redis.conf \
  redis:7.2 redis-server /etc/redis/redis.conf --appendonly yes

配置文件(redis.conf)

# 基础配置
port 6379
bind 0.0.0.0
protected-mode yes
daemonize no

# 持久化配置
appendonly yes
appendfsync everysec
dir /data

# 内存配置
maxmemory 2gb
maxmemory-policy allkeys-lru

# 安全配置
requirepass your-strong-password
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""

# 日志配置
loglevel notice
logfile /var/log/redis/redis.log

Docker Compose 部署

version: '3.8'

services:
  redis:
    image: redis:7.2
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./data:/data
      - ./redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis-commander:
    image: rediscommander/redis-commander:latest
    container_name: redis-commander
    environment:
      - REDIS_HOSTS=local:redis:6379:0:your-password
    ports:
      - "8081:8081"
    depends_on:
      - redis

2.2 Linux 源码编译安装

# 下载安装包
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar xzf redis-7.2.4.tar.gz
cd redis-7.2.4

# 编译
make
make test

# 安装
sudo make install

# 验证安装
redis-server --version
redis-cli --version

启动服务

# 后台启动
redis-server /etc/redis/redis.conf --daemonize yes

# 前台启动(调试用)
redis-server --port 6379

# 设置开机自启(systemd)
sudo vim /etc/systemd/system/redis.service

Systemd 服务配置

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
# 启动服务
sudo systemctl start redis
sudo systemctl enable redis

# 查看状态
sudo systemctl status redis

2.3 Windows 部署

Redis 官方不支持 Windows,但可以通过以下方式运行:

方式一:WSL2(推荐)

# 在 WSL2 中安装
sudo apt update
sudo apt install redis-server

# 启动
sudo service redis-server start

方式二:Docker Desktop

# 使用 Docker Desktop 运行
docker run -d -p 6379:6379 redis:7.2

方式三:Microsoft Archive(不推荐)

⚠️ 已停止维护,仅用于学习

三、基本操作

3.1 连接 Redis

# 本地连接
redis-cli

# 远程连接
redis-cli -h 192.168.1.100 -p 6379

# 带密码连接
redis-cli -h localhost -p 6379 -a your-password

# 执行单条命令
redis-cli INCR counter
redis-cli GET user:1001

# 交互模式
redis-cli
127.0.0.1:6379> PING
PONG

3.2 通用命令

# 查看键
KEYS pattern                  # 查看所有匹配的键(生产环境慎用)
SCAN 0 MATCH pattern COUNT 10 # 安全遍历键

# 检查键
EXISTS key                    # 判断键是否存在
TYPE key                      # 查看键的类型
TTL key                       # 查看剩余生存时间

# 删除键
DEL key [key ...]             # 删除键
UNLINK key [key ...]          # 异步删除(推荐)
EXPIRE key seconds            # 设置过期时间
PEXPIRE key milliseconds      # 设置毫秒级过期时间

# 数据库操作
SELECT db_index               # 切换数据库
DBSIZE                        # 查看键数量
FLUSHDB                       # 清空当前数据库
FLUSHALL                      # 清空所有数据库

# 其他
RANDOMKEY                     # 随机返回一个键
MOVE key db                   # 将键移到另一个数据库
RENAME key newkey             # 重命名键

3.3 String 类型操作

# 基本操作
SET key value                 # 设置值
GET key                       # 获取值
MSET key1 value1 key2 value2  # 批量设置
MGET key1 key2                # 批量获取

# 带过期时间
SETEX key seconds value       # 设置值和过期时间
SET key value EX seconds      # 同上(Redis 2.6.12+)
SET key value NX EX seconds   # 不存在时设置(分布式锁)

# 数值操作
INCR key                      # 自增 1
INCRBY key increment          # 自增指定值
DECR key                      # 自减 1
DECRBY key decrement          # 自减指定值

# 字符串操作
APPEND key value              # 追加字符串
STRLEN key                    # 获取字符串长度
GETRANGE key start end        # 获取子串
SETRANGE key offset value     # 覆盖部分字符串

# 位操作(用于布隆过滤器、计数器)
SETBIT key offset value       # 设置位值
GETBIT key offset             # 获取位值
BITCOUNT key [start end]      # 统计 1 的数量

实战示例

# 1. 缓存用户信息
SET user:1001 '{"name":"张三","age":25}' EX 300

# 2. 文章阅读量
INCR article:888:views

# 3. 分布式锁
SET lock:order:12345 "worker-1" NX EX 10

# 4. 验证码存储
SET sms:code:13800138000 "123456" EX 300

# 5. 限流计数
INCR rate:api:user:1001
EXPIRE rate:api:user:1001 60

3.4 Hash 类型操作

# 基本操作
HSET key field value          # 设置字段值
HGET key field                # 获取字段值
HMSET key field1 value1 ...   # 批量设置(3.0+ 废弃,用 HSET)
HMGET key field1 field2       # 批量获取
HGETALL key                   # 获取所有字段

# 字段操作
HDEL key field [field ...]    # 删除字段
HEXISTS key field             # 判断字段是否存在
HLEN key                      # 获取字段数量
HKEYS key                     # 获取所有字段名
HVALS key                     # 获取所有字段值

# 数值操作
HINCRBY key field increment   # 字段自增
HINCRBYFLOAT key field incr   # 字段自增(浮点数)

实战示例

# 1. 存储用户信息
HSET user:1001 name "张三" age 25 email "zhangsan@example.com"
HGET user:1001 name
HMGET user:1001 name age email

# 2. 购物车
HSET cart:user:1001 product:888 2 product:999 1
HINCRBY cart:user:1001 product:888 1  # 增加数量

# 3. 商品详情
HMSET product:888 title "iPhone 15" price 5999 stock 100
HGETALL product:888

3.5 List 类型操作

# 左侧操作
LPUSH key value [value ...]   # 左侧插入
LPOP key                      # 左侧弹出
LINDEX key index              # 获取指定位置元素
LLEN key                      # 获取列表长度

# 右侧操作
RPUSH key value [value ...]   # 右侧插入
RPOP key                      # 右侧弹出

# 阻塞操作(消息队列)
BLPOP key [key ...] timeout   # 阻塞左侧弹出
BRPOP key [key ...] timeout   # 阻塞右侧弹出

# 范围操作
LRANGE key start stop         # 获取范围元素
LTRIM key start stop          # 修剪列表
LREM key count value          # 删除元素
LSET key index value          # 设置指定位置的值

实战示例

# 1. 消息队列
LPUSH queue:tasks "task-1" "task-2" "task-3"
BRPOP queue:tasks 5  # 阻塞 5 秒等待任务

# 2. 最新文章列表
LPUSH articles:latest id1 id2 id3
LTRIM articles:latest 0 99  # 保留最新 100 篇

# 3. 用户动态时间线
LPUSH timeline:user:1001 "action:1" "action:2"
LRANGE timeline:user:1001 0 49  # 获取最近 50 条动态

3.6 Set 类型操作

# 基本操作
SADD key member [member ...]  # 添加成员
SREM key member [member ...]  # 删除成员
SISMEMBER key member          # 判断成员是否存在
SMEMBERS key                  # 获取所有成员
SCARD key                     # 获取成员数量

# 集合运算
SINTER key [key ...]          # 交集
SUNION key [key ...]          # 并集
SDIFF key [key ...]           # 差集

# 随机操作
SPOP key [count]              # 随机弹出
SRANDMEMBER key [count]       # 随机获取

实战示例

# 1. 用户标签
SADD user:1001:tags "java" "python" "redis"
SISMEMBER user:1001:tags "java"

# 2. 共同好友
SINTER friends:user:1001 friends:user:1002

# 3. 抽奖
SADD lottery:participants "user1" "user2" "user3"
SPOP lottery:participants 3  # 抽取 3 名幸运用户

# 4. 在线用户
SADD online:users "user1" "user2"
SCARD online:users  # 在线人数

3.7 ZSet 类型操作

# 基本操作
ZADD key [NX|XX] [GT|LT] score member  # 添加成员
ZREM key member [member ...]           # 删除成员
ZSCORE key member                      # 获取分数
ZCARD key                              # 获取成员数量

# 排名查询
ZREVRANK key member                    # 倒序排名
ZRANK key member                       # 正序排名
ZRANGE key start stop [WITHSCORES]     # 正序范围
ZREVRANGE key start stop [WITHSCORES]  # 倒序范围

# 范围查询(按分数)
ZRANGEBYSCORE key min max [WITHSCORES] # 按分数范围
ZREVRANGEBYSCORE key max min           # 倒序按分数

# 计数
ZCOUNT key min max                     # 统计分数范围内的数量
ZINCRBY key increment member           # 增加分数

实战示例

# 1. 游戏排行榜
ZADD leaderboard:game1 1000 "player1"
ZADD leaderboard:game1 950 "player2"
ZREVRANGE leaderboard:game1 0 9 WITHSCORES  # Top 10

# 2. 热搜榜
ZINCRBY hot:search 1 "Redis 教程"
ZINCRBY hot:search 1 "Java 并发"
ZREVRANGE hot:search 0 49 WITHSCORES  # 热搜前 50

# 3. 延迟队列(分数为执行时间戳)
ZADD queue:delay 1712649600 "task-1"
ZRANGEBYSCORE queue:delay 0 1712649600  # 获取到期任务

四、客户端集成

4.1 Python(redis-py)

# 安装
pip install redis

# 基本使用
import redis
import json

# 连接
r = redis.Redis(
    host='localhost',
    port=6379,
    db=0,
    password='your-password',
    decode_responses=True,
    socket_timeout=5,
    socket_connect_timeout=5
)

# 连接池
pool = redis.ConnectionPool(
    host='localhost',
    port=6379,
    max_connections=50
)
r = redis.Redis(connection_pool=pool)

# String 操作
r.set('user:1001', json.dumps({'name': '张三', 'age': 25}), ex=300)
user = json.loads(r.get('user:1001'))

# Hash 操作
r.hset('user:1002', mapping={'name': '李四', 'age': '28'})
name = r.hget('user:1002', 'name')

# List 操作(消息队列)
r.lpush('queue:tasks', 'task-1', 'task-2')
task = r.brpop('queue:tasks', timeout=5)

# Pipeline(批量操作)
pipe = r.pipeline()
for i in range(100):
    pipe.set(f'key:{i}', i)
pipe.execute()

# 事务
with r.pipeline() as pipe:
    pipe.multi()
    pipe.set('key1', 'value1')
    pipe.set('key2', 'value2')
    pipe.execute()

# Lua 脚本
lua_script = """
if redis.call('get', KEYS[1]) == ARGV[1] then
    return redis.call('del', KEYS[1])
else
    return 0
end
"""
script = r.register_script(lua_script)
script(keys=['lock:key'], args=['value'])

4.2 Java(Lettuce / Jedis)

<!-- Maven 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
# application.yml
spring:
  redis:
    host: localhost
    port: 6379
    password: your-password
    database: 0
    lettuce:
      pool:
        max-active: 50
        max-idle: 20
        min-idle: 5
// Spring Data Redis 使用
@Autowired
private RedisTemplate<String, Object> redisTemplate;

// String 操作
redisTemplate.opsForValue().set("user:1001", user, 300, TimeUnit.SECONDS);
User user = (User) redisTemplate.opsForValue().get("user:1001");

// Hash 操作
redisTemplate.opsForHash().put("user:1002", "name", "张三");
String name = (String) redisTemplate.opsForHash().get("user:1002", "name");

// List 操作
redisTemplate.opsForList().leftPush("queue:tasks", "task-1");
Object task = redisTemplate.opsForList().rightPop("queue:tasks");

// ZSet 操作
redisTemplate.opsForZSet().add("leaderboard", "player1", 1000);
Set<Object> top10 = redisTemplate.opsForZSet().reverseRange("leaderboard", 0, 9);

// 使用 StringRedisTemplate(推荐)
@Autowired
private StringRedisTemplate stringRedisTemplate;

stringRedisTemplate.opsForValue().increment("counter");

4.3 Node.js(ioredis)

npm install ioredis
const Redis = require('ioredis');

// 连接
const redis = new Redis({
  host: 'localhost',
  port: 6379,
  password: 'your-password',
  db: 0,
  retryStrategy: (times) => Math.min(times * 50, 2000),
});

// 基本操作
await redis.set('user:1001', JSON.stringify({ name: '张三' }), 'EX', 300);
const user = JSON.parse(await redis.get('user:1001'));

// Pipeline
const pipeline = redis.pipeline();
for (let i = 0; i < 100; i++) {
  pipeline.set(`key:${i}`, i);
}
await pipeline.exec();

// 发布订阅
const sub = new Redis();
await sub.subscribe('channel:news');

sub.on('message', (channel, message) => {
  console.log(`收到消息:${message}`);
});

const pub = new Redis();
await pub.publish('channel:news', '突发新闻!');

// 关闭连接
await redis.quit();

五、监控与诊断

5.1 INFO 命令

# 查看所有信息
INFO

# 查看特定部分
INFO server        # 服务器信息
INFO memory       # 内存信息
INFO persistence  # 持久化信息
INFO stats        # 统计信息
INFO clients      # 客户端信息

关键指标解读

# 内存
used_memory: 1048576000          # 已用内存(字节)
used_memory_peak: 1200000000     # 内存峰值
maxmemory: 2147483648            # 最大内存限制

# 连接
connected_clients: 100           # 当前连接数
blocked_clients: 5               # 阻塞客户端数

# 性能
instantaneous_ops_per_sec: 10000 # 每秒操作数
total_commands_processed: 1000000 # 总命令数

# 持久化
rdb_last_save_time: 1712649600   # 上次 RDB 保存时间
aof_enabled: 1                   # AOF 是否开启

5.2 慢查询日志

# 设置慢查询阈值(微秒)
CONFIG SET slowlog-log-slower-than 10000  # 10ms

# 查看慢查询
SLOWLOG GET 10

# 慢查询数量
SLOWLOG LEN

# 清空慢查询
SLOWLOG RESET

5.3 实时监控

# 实时监控命令
MONITOR

# 查看当前连接
CLIENT LIST

# 查看某个客户端
CLIENT LIST ID 123

# 杀死某个客户端
CLIENT KILL ID 123

# 查看内存使用
MEMORY USAGE key
MEMORY STATS

六、最佳实践

6.1 Key 命名规范

✅ 推荐格式:
业务名:模块名:ID
user:info:1001
order:detail:20260407001
article:views:888

❌ 避免:
user_1001              # 语义不清晰
1001                   # 无任何语义
user:1001:name:zhang   # 层级混乱

6.2 避免大 Key

# 查找大 Key
redis-cli --bigkeys

# 查找大 Key(脚本)
for key in $(redis-cli keys "*"); do
  size=$(redis-cli memory usage $key)
  echo "$size $key"
done | sort -rn | head -20

大 Key 处理

类型阈值解决方案
String> 10KB拆分或压缩
Hash> 1000 字段按业务拆分
List> 5000 元素分页存储
Set/ZSet> 5000 元素分片存储

6.3 批量操作

# ❌ 低效:N 次网络往返
for i in range(1000):
    redis.set(f"key:{i}", i)

# ✅ 高效:1 次网络往返(Pipeline)
pipe = redis.pipeline()
for i in range(1000):
    pipe.set(f"key:{i}", i)
pipe.execute()

# ✅ 批量命令(MSET/MGET)
redis.mset({f"key:{i}": i for i in range(1000)})
values = redis.mget([f"key:{i}" for i in range(1000)])

6.4 连接池配置

# Python 连接池
pool = redis.ConnectionPool(
    host='localhost',
    port=6379,
    max_connections=50,      # 最大连接数
    socket_timeout=5,        # 超时时间
    socket_connect_timeout=5,
    retry_on_timeout=True,
    decode_responses=True
)
// Java 连接池
LettuceConnectionFactory factory = new LettuceConnectionFactory();
factory.setPoolConfig(GenericObjectPoolConfig.builder()
    .maxTotal(50)
    .maxIdle(20)
    .minIdle(5)
    .build()
);

七、总结

快速参考表

操作命令时间复杂度
字符串读写SET/GETO(1)
Hash 字段操作HSET/HGETO(1)
List 两端操作LPUSH/RPOPO(1)
Set 添加删除SADD/SREMO(1)
ZSet 添加ZADDO(log N)
ZSet 排名ZRANKO(1)
过期设置EXPIREO(1)
删除键DELO(1)

学习路线

flowchart LR
    A[基础] --> B[数据类型]
    B --> C[持久化]
    C --> D[高可用]
    D --> E[集群]
    E --> F[性能优化]
    F --> G[实战应用]

参考资料


分享这篇文章到:

上一篇文章
Redis 性能监控与诊断
下一篇文章
Redis 应用场景与选型指南