Hshen
人若无名 便可潜心练剑
GitHub Abou byHshen Hshen

Redis 学习指南

2025年4月5日

预计阅读:13min

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 redis

macOS 系统安装:

brew install redis

Windows 系统:

Windows 不是 Redis 的官方支持平台,但可以使用:

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:绑定到特定 IP
  • requirepass 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 key2

2. 哈希(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 city

3. 列表(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-0

5. 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 提供两种持久化方式:

  1. RDB(Redis Database):按指定时间间隔生成数据快照
  2. 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 5000

6. Redis 应用场景

  1. 缓存系统:存储热点数据,减轻后端数据库压力
  2. 会话存储:存储用户会话信息
  3. 排行榜/计数器:利用有序集合实现高效排行榜
  4. 消息队列:使用列表或流实现轻量级消息队列
  5. 实时分析:利用位图等进行实时统计
  6. 地理位置应用:使用地理空间命令处理位置数据
  7. 分布式锁:实现分布式系统中的锁机制
  8. 限速器:实现访问频率限制

7. Redis 性能优化

  1. 内存优化

    • 合理设置 maxmemory
    • 选择适当的淘汰策略
    • 使用 SCAN 代替 KEYS
  2. 命令优化

    • 使用批量命令(MGET/MSET)
    • 使用 Pipeline 减少网络开销
    • 避免使用复杂度高的命令(如 KEYS)
  3. 连接优化

    • 使用连接池
    • 适当设置 timeout 值
  4. 持久化优化

    • 分离 RDB 和 AOF 到不同磁盘
    • 调整持久化频率

8. Redis 安全性

  1. 访问控制

    • 设置密码认证
    • 绑定特定 IP 地址
    • 禁用危险命令
  2. 网络安全

    • 使用防火墙限制访问
    • 启用 TLS/SSL 加密连接
  3. 权限管理(Redis 6.0+)

    • 使用 ACL 进行细粒度权限控制
# 创建用户并设置权限
ACL SETUSER myuser on >mypass ~* +@all

9. Redis 监控与调试

  1. INFO 命令:获取 Redis 服务器状态信息

    INFO memory
    INFO clients
    INFO stats
  2. MONITOR 命令:实时监控 Redis 命令执行

    MONITOR
  3. SLOWLOG 命令:查看慢查询日志

    SLOWLOG GET 10
  4. 第三方监控工具

    • Redis Commander
    • Redis Desktop Manager
    • Prometheus + Grafana

10. Redis 客户端工具

命令行客户端

  1. 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客户端工具

  1. Redis Desktop Manager (RedisInsight) - 跨平台桌面管理工具

  2. Another Redis Desktop Manager - 开源跨平台客户端

  3. Redis Commander - 基于Web的Redis管理工具

    • 特点:通过浏览器访问,支持集群
    • 安装:npm install -g redis-commander

编程语言客户端

  1. Python

    # 安装
    pip install redis
    # 基本用法
    import redis
    r = redis.Redis(host='localhost', port=6379, db=0)
    r.set('foo', 'bar')
    value = r.get('foo')
  2. 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();
  3. 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");
  4. 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()
  5. 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 password

11. 学习资源

  1. 官方文档https://redis.io/documentation
  2. Redis 命令参考https://redis.io/commands
  3. Redis 在线测试https://try.redis.io/
  4. 书籍
    • 《Redis 实战》
    • 《Redis 设计与实现》
    • 《Redis 开发与运维》

12. Redis 常见问题解决

  1. 内存占用过高

    • 检查大键:redis-cli --bigkeys
    • 设置合理的过期时间
    • 启用压缩
  2. 连接数过多

    • 检查连接池配置
    • 增加 maxclients 配置
  3. 持久化导致性能下降

    • 调整持久化频率
    • 使用单独的磁盘
    • 考虑禁用持久化(仅用作缓存时)