Redis基础

95 阅读6分钟

Redis(Remote Dictionary Server)是一个开源的高性能键值对存储数据库,被广泛应用于缓存、会话管理、消息队列等场景。以下是 Redis 的基础知识,涵盖核心概念、数据结构、常用命令及基础操作:

1. Redis 基本概念

Redis 是什么?

Redis(Remote Dictionary Server)是一个开源的高性能键值对存储数据库,全称为 “远程字典服务器”。它具有以下特点:

  • 基于内存存储:数据存放在内存中,读写速度极快(单线程 QPS 可达 10 万 +)。
  • 支持丰富数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。
  • 持久化支持:可将内存数据定期或实时保存到磁盘,防止数据丢失。
  • 单线程模型:采用单线程处理请求,避免多线程竞争问题,更适合 IO 密集型场景。
  • 高可用方案:支持主从复制、哨兵模式和集群(Cluster)部署。

2. 为什么需要 Redis?

2.1 高性能场景

  • 缓存加速:将高频访问的数据(如用户信息、商品详情)存入 Redis,减少数据库压力。
  • 实时统计:如网站访问量、文章点赞数(原子性自增操作)。
  • 会话共享:在分布式系统中,存储用户会话(如登录状态)。

2.2 复杂业务场景

  • 排行榜:用有序集合实现游戏积分排名、热搜榜。
  • 消息队列:用列表实现异步任务队列。
  • 去重计数:用集合实现共同好友推荐、UV 统计。

3. 数据结构详解

Redis 的核心是数据结构服务器,每种数据结构都有独特的应用场景。

3.1 字符串(String)

最基本的数据类型,值可以是字符串、数字或二进制数据(最大 512MB)。

应用场景

  • 缓存对象(如 JSON 格式的用户信息)。

  • 计数器(如点赞数、访问量)。

  • 分布式锁(基于SETNX命令)。

常用命令

bash

# 设置键值对(覆盖旧值)
SET key "value"

# 获取值
GET key

# 原子性自增/自减(用于计数器)
INCR key       # 自增1
DECRBY key 5   # 自减5

# 设置带过期时间的键(秒)
SETEX key 60 "value"  # 60秒后自动删除

3.2 哈希(Hash)

键值对的集合,适合存储对象(如用户资料、配置信息)。

应用场景

  • 存储对象的多个属性(如用户的姓名、年龄、邮箱)。

  • 缓存数据库记录(减少序列化开销)。

常用命令

bash

# 设置单个字段
HSET user:1001 name "Alice"

# 设置多个字段
HMSET user:1001 age 25 email "alice@example.com"

# 获取单个字段
HGET user:1001 name

# 获取所有字段和值
HGETALL user:1001

# 删除字段
HDEL user:1001 age

3.3 列表(List)

双向链表结构,支持两端插入 / 删除元素,适合实现队列或栈。

应用场景

  • 消息队列(生产者消费者模型)。

  • 最新动态展示(如微博时间线,最新评论)。

常用命令

bash

# 左侧插入元素(先进后出,栈结构)
LPUSH queue:tasks "task1"
LPUSH queue:tasks "task2"  # 队列变为 ["task2", "task1"]

# 右侧插入元素(先进先出,队列结构)
RPUSH queue:messages "msg1"
RPUSH queue:messages "msg2"  # 队列变为 ["msg1", "msg2"]

# 获取列表范围(0表示第一个元素,-1表示最后一个)
LRANGE queue:tasks 0 -1  # 输出: ["task2", "task1"]

# 弹出元素(左侧弹出)
LPOP queue:tasks  # 输出: "task2"

3.4 集合(Set)

无序且唯一的数据结构,支持交集、并集、差集运算。

应用场景

  • 去重(如点赞用户记录、访问 IP 统计)。

  • 社交关系(共同好友、粉丝列表)。

  • 随机抽取(如抽奖系统)。

常用命令

bash

# 添加元素(自动去重)
SADD users:1001:likes "article1" "article2" "article3"

# 判断元素是否存在
SISMEMBER users:1001:likes "article2"  # 输出: 1(存在)

# 获取所有元素
SMEMBERS users:1001:likes

# 集合运算
SADD users:1002:likes "article2" "article4"
SINTER users:1001:likes users:1002:likes  # 交集 → "article2"
SUNION users:1001:likes users:1002:likes  # 并集 → "article1" "article2" "article3" "article4"

3.5 有序集合(Sorted Set)

每个元素关联一个分数(Score) ,按分数排序,适合实现排行榜。

应用场景

  • 游戏积分排名。

  • 热搜榜(按搜索热度排序)。

  • 带权重的任务调度(分数为优先级)。

常用命令

bash

# 添加元素(分数在前,值在后)
ZADD leaderboard 100 "Alice" 90 "Bob" 85 "Charlie"

# 获取指定范围元素(按分数升序)
ZRANGE leaderboard 0 -1 WITHSCORES  # 输出: [("Charlie", 85), ("Bob", 90), ("Alice", 100)]

# 获取分数排名(从0开始)
ZRANK leaderboard "Bob"  # 输出: 1(第二名)

# 获取分数区间内的元素(降序)
ZREVRANGEBYSCORE leaderboard +inf 90  # 输出: ["Alice", "Bob"]

4. 基础操作与命令

4.1 连接与认证

bash

# 启动Redis客户端(默认连接本地6379端口)
redis-cli

# 指定主机和端口连接
redis-cli -h 127.0.0.1 -p 6379

# 带密码连接
redis-cli -a yourpassword

4.2 键(Key)操作

bash

# 查看所有键(生产环境慎用,可能影响性能)
KEYS *

# 判断键是否存在
EXISTS key

# 删除键(可批量删除)
DEL key1 key2

# 查看键的类型
TYPE key

# 设置过期时间(秒)
EXPIRE key 60  # 60秒后自动删除

# 查看剩余过期时间(-1表示永不过期,-2表示已过期)
TTL key

4.3 服务器操作

bash

# 查看服务器信息(内存、连接数、持久化状态等)
INFO

# 清空当前数据库(谨慎使用!)
FLUSHDB

# 清空所有数据库(谨慎使用!)
FLUSHALL

# 查看内存使用情况
INFO memory

5. 持久化机制

Redis 是内存数据库,但支持两种持久化方式,确保数据不丢失。

5.1 RDB(快照)

  • 原理:定期将内存中的数据生成二进制快照文件(默认dump.rdb)。

  • 触发方式

    • 手动触发:SAVE(阻塞服务器)或BGSAVE(后台异步执行)。
    • 自动触发:配置文件中设置save 900 1(900 秒内至少 1 个键被修改时触发)。
  • 优点:文件紧凑,恢复速度快,适合大规模数据恢复。

  • 缺点:可能丢失最后一次快照后的数据(如服务器突然断电)。

5.2 AOF(日志)

  • 原理:记录所有写操作命令到日志文件(默认appendonly.aof)。

  • 配置:在redis.conf中设置appendonly yes

  • 同步策略

    • appendfsync always:每次写操作都同步到磁盘(最安全,但性能最差)。
    • appendfsync everysec:每秒同步一次(默认,平衡安全性和性能)。
    • appendfsync no:由操作系统决定何时同步(性能最好,但可能丢失较多数据)。
  • 优点:数据安全性高,可配置不同的同步频率。

  • 缺点:日志文件较大,恢复速度较慢。

5.3 如何选择?

  • 若对数据安全性要求高(如支付系统),建议同时启用 RDB 和 AOF。
  • 若仅作为缓存(允许少量数据丢失),可只使用 RDB 或关闭持久化。