💡 如果把 MySQL 比作开着拖拉机的乡村邮递员,那 Redis 就是骑着火箭的特快专递——数据全放内存里,读写延迟轻松做到微秒级,五年蝉联"开发者最喜爱数据库"称号。
一、Redis 到底是啥?为啥程序员都爱它?
Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,由 Salvatore Sanfilippo 用 C 语言写成。它不只是简单的 Key-Value 缓存,而是一个支持多种数据结构的"瑞士军刀":字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理空间索引、流(Streams),Redis 8 起还内置了向量集、JSON、时间序列、概率数据结构等。
简单来说,Redis 在干什么:
┌─────────────┐ 微秒级读写 ┌──────────────┐
│ 你的应用 │ ←────────────→ │ Redis │
│ │ │ (内存驻留) │
└─────────────┘ └──────────────┘
│ ▲
│ 偶尔同步 │ 异步持久化
▼ │
┌─────────────┐ ┌──────────────┐
│ MySQL │ │ 磁盘(RDB/AOF)│
│ (慢但稳) │ └──────────────┘
└─────────────┘
它到底有多快、多强? Redis 8 官方数据显示:命令延迟比 7.2.5 最高降低 87%,吞吐量提升最高 2 倍,复制内存占用减少 35%。
典型使用场景:
-
🚀 缓存加速:把 MySQL 查询结果塞进 Redis,TTL 设 1 小时,扛住双十一级别的流量
-
🔢 计数器 / 限流:
INCR命令天然原子性,做阅读量、接口限流毫无压力 -
🏆 排行榜:ZSet 一键搞定游戏积分榜、热门文章 Top 10
-
🔐 分布式锁:
SETNX实现跨服务互斥 -
💬 消息队列 / 发布订阅:List 的
LPUSH+BRPOP,或更强的 Streams -
🤖 AI 向量检索:Redis 8 新增向量集,语义搜索、推荐系统直接搞定
⚠️ 许可小提醒:Redis 8 采用三重许可——RSALv2、SSPLv1、AGPLv3。自己部署完全免费,但云厂商(如 AWS ElastiCache)从 v8.0 起不能直接托管新版 Redis,他们转向了兼容分支 Valkey。自己用?完全没影响。
二、安装 Redis:三种姿势任君挑选
姿势 1:Docker 一键起飞(推荐新手)
Docker 是目前最干净、最 reproducible 的安装方式。Redis 官方镜像 Docker 拉取量已超 40 亿次。
最简启动:
# 一条命令跑起来
docker run --name my-redis -d redis:7-alpine
# 进命令行试试
docker exec -it my-redis redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
带密码 + 暴露端口:
docker run --name my-redis -d -p 6379:6379 \
redis:7-alpine \
redis-server --requirepass your_secure_password
姿势 2:Docker Compose 生产级部署(强烈推荐)
创建 redis.conf:
bind 0.0.0.0
port 6379
protected-mode yes
# 安全
requirepass your_secure_password_here
# 内存管理(防雪崩)
maxmemory 256mb
maxmemory-policy allkeys-lru
# 持久化 - AOF
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 持久化 - RDB
save 900 1
save 300 10
save 60 10000
创建 docker-compose.yml:
version: '3.8'
services:
redis:
image: redis:7-alpine
container_name: redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf:ro
command: redis-server /usr/local/etc/redis/redis.conf
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "-a", "your_secure_password_here", "ping"]
interval: 10s
timeout: 5s
retries: 5
volumes:
redis-data:
driver: local
启动:
docker compose up -d
docker compose logs redis
姿势 3:Linux 裸机安装(Ubuntu/Debian)
# 更新并安装
sudo apt update
sudo apt install redis-server -y
# 修改配置
sudo vim /etc/redis/redis.conf
# 改这几个关键点:
# bind 0.0.0.0 # 允许远程连接
# requirepass 你的密码
# appendonly yes # 开启 AOF
# maxmemory 512mb
# maxmemory-policy allkeys-lru
# 重启服务
sudo systemctl restart redis-server
sudo systemctl enable redis-server
📌 Redis 8 尝鲜:如果想体验最新版(含向量集、JSON 等),可以从源码编译:
wget https://github.com/redis/redis/archive/8.0.0.tar.gz && make && sudo make install
三、redis-cli 实战:五种核心数据结构玩出花
连接 Redis:
redis-cli -h 127.0.0.1 -p 6379 -a 你的密码
1. String(字符串):缓存与计数利器
# 基础存取 + 过期时间
SET user:1:name "Alice" EX 3600 # 设值并 1 小时后过期
GET user:1:name # -> "Alice"
TTL user:1:name # 看剩余存活时间
# 原子计数器(阅读量统计神器)
SET article:read:1001 0
INCR article:read:1001 # -> 1
INCR article:read:1001 # -> 2
INCRBY article:read:1001 10 # -> 12
# 分布式锁
SETNX lock:order:42 1 # 抢到锁返回 1,否则 0
EXPIRE lock:order:42 30 # 30 秒自动释放
2. Hash(哈希):存对象的最佳选择
# 存储用户信息
HSET user:1001 name "张三" age 28 city "北京"
HGET user:1001 name # -> "张三"
HGETALL user:1001 # 获取所有字段
HINCRBY user:1001 age 1 # 年龄 +1
# Redis 8 新命令:原子获取并删除字段
HGETDEL user:1001 FIELDS 1 name
# 新命令:获取字段并可选择设置过期
HGETEX user:1001 EX 60 FIELDS 1 age
3. List(列表):轻量级消息队列
LPUSH todo "task-A" # 左侧入队
RPUSH todo "task-B" # 右侧入队
LRANGE todo 0 -1 # 查看整个列表
BRPOP todo 0 # 阻塞弹出,0 表示无限等待
4. Set(集合):去重与标签系统
SADD user:1001:tags "java" "redis" "mysql"
SADD user:1002:tags "java" "python"
SMEMBERS user:1001:tags # 查看所有标签
SINTER user:1001:tags user:1002:tags # 共同标签 -> "java"
SISMEMBER user:1001:tags "redis" # 判断是否包含
5. Sorted Set(有序集合):排行榜王者
ZADD leaderboard 1500 "alice"
ZADD leaderboard 2200 "bob"
ZADD leaderboard 1800 "charlie"
ZRANGE leaderboard 0 -1 WITHSCORES REV # 从高到低
# 1) "bob" 2) "2200" 3) "charlie" 4) "1800" 5) "alice" 6) "1500"
ZINCRBY leaderboard 100 "alice" # alice 加分
ZRANK leaderboard "alice" REV # 查排名
通用键操作
EXISTS user:1:name # 是否存在
EXPIRE user:1:name 120 # 重设过期
TTL user:1:name # 剩余时间
DEL user:1:name # 删除
SCAN 0 MATCH user:* COUNT 10 # 安全遍历(生产禁用 KEYS *)
⚠️ 生产环境铁律:永远不要用
KEYS *!它会阻塞整个 Redis。用SCAN替代。
四、实战案例:Cache-Aside 缓存模式
这是最常用的缓存架构,伪代码逻辑:
async def get_user(user_id: int):
key = f"user:{user_id}"
# 1. 先查 Redis
cached = await redis.get(key)
if cached:
return json.loads(cached)
# 2. 缓存未命中,查数据库
user = await db.get_user(user_id)
# 3. 写入缓存,TTL 加随机抖动防集体失效
if user:
ttl = int(3600 * random.uniform(0.9, 1.1))
await redis.set(key, json.dumps(user), ex=ttl)
return user
真实场景示例(缓存用户热点数据):
# 模拟 MySQL 查出的数据写入 Redis
HMSET user:1 name "zhangsan" age 20
EXPIRE user:1 3600
# 查询时先打 Redis
HGETALL user:1
# 1) "name" 2) "zhangsan" 3) "age" 4) "20"
五、持久化:让内存数据"落地"
Redis 提供两种持久化机制,生产环境建议同时开启:
|
方式 |
原理 |
优点 |
缺点 |
|---|---|---|---|
|
RDB |
定时快照 |
恢复快、文件紧凑 |
可能丢失最后一次快照后的数据 |
|
AOF |
记录每条写命令 |
数据更安全 |
文件较大、恢复稍慢 |
推荐配置(redis.conf):
# RDB 快照
save 900 1 # 15 分钟内至少 1 个变更
save 300 10 # 5 分钟内至少 10 个变更
save 60 10000 # 1 分钟内至少 10000 个变更
# AOF
appendonly yes
appendfsync everysec # 折衷:每秒刷盘
六、可视化监控:Redis Insight
命令行玩腻了?官方推出的 Redis Insight 是 GUI 神器,可以:
-
可视化查看所有 Key 和数据结构
-
实时监控内存、命令吞吐量
-
直接执行命令的工作台
-
支持 Redis 8 的 JSON、向量集等新特性
# Docker 方式安装
docker run -d --name redis-insight -p 8001:8001 redis/redisinsight:latest
浏览器打开 http://localhost:8001 即可。
七、生产环境避坑指南
💡 几个让老司机都翻过车的点,新人务必记下:
-
一定要设
maxmemory+ 淘汰策略:否则 Redis 内存吃满会触发 OOM,整个进程被杀maxmemory 2gb maxmemory-policy allkeys-lru -
protected-mode和requirepass必须开:裸奔的 Redis 等于给黑客留门 -
禁用危险命令:生产环境建议在配置中重命名或禁用
FLUSHALL、FLUSHDB、KEYS -
使用连接池:每次新建连接开销大,应用侧务必复用连接
-
监控关键指标:
redis-cli INFO memory | grep used_memory_human redis-cli INFO stats | grep total_connections_received redis-cli INFO persistence
八、Redis 8 新特性速览(与时俱进部分)
如果你用 Redis 8,等于白嫖了一整套原本要装模块的"全家桶":
-
🆕 向量集(Vector Set):高维向量相似性搜索,AI 应用语义检索直接搞定
-
🆕 JSON 数据结构:原生支持 JSON 文档存储,用 JSONPath 查询
-
🆕 时间序列:IoT 传感器、股价数据高效压缩存储
-
🆕 概率数据结构:Bloom Filter、Cuckoo Filter、Count-Min Sketch、Top-K、T-Digest
-
🆕 哈希字段级过期:
HGETEX、HSETEX、HGETDEL原子操作 -
🆕 多线程 I/O:设置
io-threads 8吞吐量提升 112% -
🆕 查询引擎:为 Hash 和 JSON 建二级索引,向量搜索吞吐量提升 16 倍
# Redis 8 新玩法:存 JSON
JSON.SET user:1 $ '{"name":"Alice","age":30,"tags":["vip","active"]}'
JSON.GET user:1 $.name
# 向量相似性搜索
VADD vector:items 4 [0.1,0.2,0.3,0.4] "item1"
写在最后
Redis 不是一个"缓存工具"那么简单——它是一个内存数据结构平台。从最简单的 SET/GET 到复杂的向量检索,它几乎能覆盖所有高并发、低延迟的场景。
学习路径建议:
入门:String/Hash/List/Set/ZSet 五大结构
↓
进阶:过期策略、持久化、发布订阅、Streams
↓
高级:Redis Cluster 分片、Sentinel 高可用、Lua 脚本
↓
专家:Redis 8 向量集、JSON、查询引擎、AI 应用
📌 记住一句话:缓存不是银弹,但 Redis 几乎是互联网应用的标配。 掌握它,你的系统就能从"拖拉机"升级到"火箭"。
283



被折叠的 条评论
为什么被折叠?



