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 或关闭持久化。