Database
- 默认数据库数量:Redis 默认提供 16 个数据库(编号 0-15),而非 10 个(可通过修改
redis.conf
的databases 16
调整数量)。 - 默认操作库:未指定时,所有命令在 数据库 0 执行。
- 隔离性:不同数据库之间的数据完全隔离(键名相同也不会冲突)。
-
# 1. 切换到数据库5 SELECT 5 # 2. 添加测试数据 SET project "Redis Training" HSET config timeout 30 # 3. 查看当前库键数量 DBSIZE # 返回 2 # 4. 返回数据库0并验证隔离性 SELECT 0 DBSIZE # 返回原库0的键数(未变化) # 5. 清空数据库5(谨慎操作!) SELECT 5 FLUSHDB DBSIZE # 返回 0
一、哈希(Hash)
1. 核心概念
- 用途:存储对象(如用户信息),每个键对应多个字段(field)和值(value)。
- 类比:类似 JSON 对象或 Python 字典。
- 优势:可单独操作字段,无需读取整个对象。
2. 练习:用户信息管理
# 1. 添加用户信息(user:1001 是键,name/age/city 是字段)
HSET user:1001 name "Alice" age 30 city "New York"
# 返回:3(成功设置3个字段)
# 2. 获取单个字段值
HGET user:1001 name
# 返回:"Alice"
# 3. 获取所有字段和值
HGETALL user:1001
# 返回:name Alice age 30 city New York(按字段顺序显示)
# 4. 修改年龄为31
HSET user:1001 age 31
# 返回:0(字段已存在,仅更新值)
# 5. 删除 city 字段
HDEL user:1001 city
# 返回:1(成功删除1个字段)
# 6. 检查剩余字段
HGETALL user:1001
# 返回:name Alice age 31
二、列表(List)
1. 核心概念
- 用途:有序元素集合,允许重复值(例如消息队列、时间线)。
- 特点:可从两端(左/右)插入或弹出元素。
- 索引:从左到右从 0 开始,-1 表示最后一个元素。
# 1. 从左侧插入三个任务 LPUSH tasks "write report" "debug code" "meeting" # 返回:3(列表当前元素数) # 2. 查看列表所有元素(0到-1表示全部) LRANGE tasks 0 -1 # 返回:1) "meeting" 2) "debug code" 3) "write report"(LPUSH 左侧插入,所以顺序反转) # 3. 从右侧添加新任务 RPUSH tasks "review PR" # 返回:4(当前元素数) # 4. 查看更新后的列表 LRANGE tasks 0 -1 # 返回:1) "meeting" 2) "debug code" 3) "write report" 4) "review PR" # 5. 弹出左侧第一个任务(处理最早的任务) LPOP tasks # 返回:"meeting" # 6. 查看剩余任务 LRANGE tasks 0 -1 # 返回:1) "debug code" 2) "write report" 3) "review PR"
三、集合(Set)
1. 核心概念
- 用途:存储唯一元素的无序集合(例如标签系统、好友列表)。
- 特性:自动去重,支持集合运算(交集、并集、差集)。
-
# 1. 为文章ID=2001添加标签 SADD article:2001:tags "tech" "database" "redis" # 返回:3(添加了3个不重复标签) # 2. 检查标签是否存在 SISMEMBER article:2001:tags "redis" # 返回:1(存在) # 3. 获取所有标签(无序) SMEMBERS article:2001:tags # 返回:1) "database" 2) "tech" 3) "redis"(顺序可能不同) # 4. 错误示例:重复添加 "tech" SADD article:2001:tags "tech" # 返回:0(未新增元素) # 5. 删除 "database" 标签 SREM article:2001:tags "database" # 返回:1(成功删除) # 6. 查看最终标签 SMEMBERS article:2001:tags # 返回:1) "tech" 2) "redis" # 7. 集合运算 sadd article "ai" "cloud" sadd text "ai" "front_end" sinter article text # 返回:1) "ai"
四、Sorted Set
- 特点:每个成员(member)关联一个分数(score),按分数排序(默认升序),成员唯一但分数可重复。
- 典型场景:排行榜、优先级队列、带权重的投票系统。
# 1. 创建游戏活动排行榜,有效期为1小时
ZADD event_2025 5000 "Player1" 4800 "Player2"
EXPIRE event_2025 3600
# 2. 更新分数并刷新过期时间
ZINCRBY event_2025 300 "Player2" # Player2 分数+300
EXPIRE event_2025 3600 # 重置过期时间
# 3. 查看当前排名(降序)
ZREVRANGE event_2025 0 -1 WITHSCORES
# 4. 手动清理(立即过期)
EXPIRE event_2025 0
Redis AOF 持久化:核心原理与使用指南
1. AOF(Append Only File)是什么?
- 核心机制:AOF 以日志形式记录 所有写操作命令(如
SET
,HMSET
等),重启时通过 重放命令 重建数据。 - 与 RDB 的区别:
- RDB:定时生成数据快照(二进制文件),恢复快但可能丢失最后一次快照后的数据。
- AOF:记录逐条操作,数据完整性更高,但文件体积通常更大,恢复速度较慢。
2. AOF 工作流程
- 命令追加:每次写操作后,将命令以 Redis 协议格式追加到内存缓冲区。
- 文件写入:根据配置的
appendfsync
策略,将缓冲区内容写入磁盘的 AOF 文件。 - 文件重写(Rewrite):定期压缩 AOF 文件,删除冗余命令(例如重复的
SET
操作),生成更精简的新文件。
3. 配置 AOF 持久化
修改 redis.conf
配置文件:
# 启用 AOF(默认关闭)
appendonly yes
# 同步策略(重要!)
appendfsync everysec # 可选值:always(每次写都同步)、everysec(每秒同步,默认)、no(由系统决定)
# 自动触发重写的条件
auto-aof-rewrite-percentage 100 # 当前AOF文件大小超过上次重写后大小的100%时触发
auto-aof-rewrite-min-size 64mb # AOF文件最小达到64MB才触发重写
4. 手动管理 AOF
- 立即触发重写:
BGREWRITEAOF # 后台异步执行,不影响主进程
修复损坏的 AOF 文件:
redis-check-aof --fix appendonly.aof # 自动尝试修复
关闭 AOF:
CONFIG SET appendonly no # 动态修改配置(需手动持久化到配置文件)
5. AOF 文件示例
*3
$3
SET
$5
mykey
$7
myvalue
#格式说明:使用 Redis 序列化协议(RESP),*3 表示该命令有 3 个参数,$3 表示后续字符串长度为 3。
一些笔记
1.Redis 是单线程还多线程?
这要从不同角度和不同版本分析了;我们平常所说 Redis 是单线程是指 Redis 执行核心指令操作的方式是通过串行的方式单线程执行的;在 Redis6 之前是纯单线程模型,但是随着其请求量的增大和硬件平台的升级 redis 也开始逐步引入了多线程,这些多线程主要用于处理网络 IO、数据备份和集群支持等方面,但是核心指令执行依然是单线程;
2.单线程有哪些好处
单线程的好处:
- 没有线程切换的开销对 CPU 友好
- 没有并发操作不用担心数据并发安全
- 无锁的竞争效率更高
3.单线程好处这么多为什么需要引入多线程
随着 CPU 多核化还有整体硬件水平的提升,如果依然使用单线程的方式处理那么硬件系统的利用率就会很低,最明显的就是网络 IO 会变成 Redis 的瓶颈,因为 Redis 是内存操作并且数据结构的设计优秀所以瓶颈不会在内存和 CPU,但是高并发的场景下如果一个请求的处理时间过长或者执行了 AOF 刷盘或则 RDB 快照那么就会将串行等待时间变长导致性能变低;
4.为什么 Redis 设计成单线程也能这么快?
从硬件层面来说:Redis 是工作在内存上的读写操作很快对 CPU 友好; 从数据结构层面来说:Redis 为了追求高性能底层的数据结构都优秀比如 skipList、listpack 都是在有限的内存上做到了极致的性能; 从线程层面上来说:Redis 在核心指令执行是单线程的,这样不会有锁的竞争、不会有上下文的切换也不用考虑并发安全问题;Redis 的网络 IO、数据备份和集群支持等方面采用的是多线程,尤其是在大数据量的请求下 epoll 方式的网络 io 多路复用大大提升了整体的性能;