📕 Redis 学习基础篇
✅ 1.1 Redis 简介
🔷 Redis 是什么?
Redis(Remote Dictionary Server)是一个基于内存的高性能键值型数据库,支持丰富的数据结构,广泛应用于缓存、消息队列、排行榜、计数器、实时统计等高并发业务场景。
特点:
- 内存操作:速度快(百万级 QPS)
- 数据结构丰富:
String
、List
、Set
、Hash
、ZSet
- 持久化支持:AOF、RDB
- 原子操作、事务机制
- 支持发布订阅、Lua 脚本、集群、哨兵模式
🏢 企业为什么用 Redis?
功能场景 |
用途描述 |
缓存系统 |
存储热点数据,降低 DB 压力,提高响应速度 |
消息队列 |
利用 List 或 Stream 实现发布/订阅、异步通信 |
分布式锁 |
多个节点互斥资源访问,用于任务控制、库存控制 |
排行榜系统 |
使用 ZSet 结构实现动态排名 |
限流系统 |
使用 INCR / SETNX 结合脚本限速,防止接口被刷 |
会话共享 |
在分布式部署中存储用户登录态和 Token |
🔍 与 Memcached、MySQL 的对比
对比项 |
Redis |
Memcached |
MySQL |
数据结构 |
多种(String、Set、Hash…) |
仅支持 String |
表结构,关系型 |
持久化 |
✅(RDB / AOF) |
❌ 无法落盘 |
✅ 默认支持 |
分布式 |
✅ Redis Cluster |
需客户端分片支持 |
✅ 主从复制 |
用作缓存 |
✅ |
✅ |
❌ 通常不建议 |
典型使用场景 |
缓存、排行榜、限流、秒杀系统 |
缓存静态页面、简单对象缓存 |
持久数据存储、复杂关系型查询 |
✅ 一、String(字符串)
🧠 特点:
- 最基本的数据结构,二进制安全(可存储图片、音频等)
- 最大 512MB
- 可用于计数器、缓存 JSON、Token
🎯 实战场景:
- 用户 Token 缓存
- 页面访问计数器
- 简单配置信息存储
🔧 Python 示例:
1 2 3 4 5 6 7 8 9
| import redis r = redis.Redis(decode_responses=True)
r.set("token:1001", "abc123", ex=3600) print(r.get("token:1001"))
r.set("count", 10) r.incr("count")
|
✅ 二、Hash(哈希)
🧠 特点:
- 类似于 Python 的字典结构
- 适合存储对象(如用户信息)
🎯 实战场景:
- 用户档案:
user:1001 -> {name:张三, age:28}
- 商品详情页缓存
🔧 Python 示例:
1 2 3
| r.hset("user:1001", mapping={"name": "张三", "age": 28}) print(r.hget("user:1001", "name")) print(r.hgetall("user:1001"))
|
✅ 三、List(列表)
🧠 特点:
- 链表结构,支持从两端插入、弹出(LPUSH/RPUSH)
- 支持阻塞操作(BLPOP)
🎯 实战场景:
🔧 Python 示例:
1 2
| r.lpush("queue:task", "任务1", "任务2") print(r.rpop("queue:task"))
|
📌 结合 Celery、FastAPI 可做异步任务队列基础。
✅ 四、Set(集合)
🧠 特点:
🎯 实战场景:
🔧 Python 示例:
1 2
| r.sadd("user:1001:likes", "足球", "篮球", "篮球") print(r.smembers("user:1001:likes"))
|
✅ 五、Sorted Set(有序集合 ZSet)
🧠 特点:
- 带分数(score)的 Set,自动排序
- 查询效率高
🎯 实战场景:
🔧 Python 示例:
1 2 3
| r.zadd("leaderboard", {"Alice": 100, "Bob": 80}) r.zincrby("leaderboard", 20, "Bob") print(r.zrevrange("leaderboard", 0, 1, withscores=True))
|
✅ 六、Bitmap(位图)
🧠 特点:
🎯 实战场景:
🔧 Python 示例:
1 2
| r.setbit("user:sign:2025-07-01", 1001, 1) print(r.getbit("user:sign:2025-07-01", 1001))
|
✅ 七、HyperLogLog
🧠 特点:
🎯 实战场景:
🔧 Python 示例:
1 2
| r.pfadd("uv:2025-07-01", "ip1", "ip2", "ip3") print(r.pfcount("uv:2025-07-01"))
|
✅ 八、Stream(流)
🧠 特点:
🎯 实战场景:
🔧 Python 示例:
1 2
| r.xadd("mystream", {"user": "1001", "msg": "hello"}) print(r.xread({"mystream": "0-0"}, count=1))
|
🏁 小结
数据结构 |
用途推荐 |
是否支持过期 |
是否支持排序 |
是否适合大数据量 |
String |
最常见的 key-value |
✅ |
❌ |
✅ |
Hash |
用户配置、JSON 对象 |
✅ |
❌ |
✅ |
List |
队列、消息流 |
✅ |
❌ |
❌(大键风险) |
Set |
去重、集合运算 |
✅ |
❌ |
✅ |
ZSet |
排行榜、优先队列 |
✅ |
✅ |
✅ |
Bitmap |
用户标记 |
✅ |
❌ |
✅ |
HLL |
UV 去重 |
✅ |
❌ |
✅ |
Stream |
日志流、事件系统 |
✅ |
✅(基于 ID) |
✅ |
✅ 1.2 Redis 安装部署
💻 在本地安装 Redis
🧩 Windows 用户(推荐 WSL 或使用 Redis Windows 版本)
Redis 官方不维护 Windows 版本,可使用社区维护版本。
🍎 macOS 用户
1 2 3 4 5 6 7 8
| brew install redis
brew services start redis
redis-cli ping
|
🐧 Linux 用户(Ubuntu 示例)
1 2 3 4 5 6 7 8
| sudo apt update sudo apt install redis-server
sudo nano /etc/redis/redis.conf
sudo systemctl start redis
|
🐳 Docker 安装 Redis(企业推荐)
1 2 3
| docker run -d --name redis \ -p 6379:6379 \ redis:latest
|
📌 持久化挂载:
1 2 3 4
| docker run -d --name redis \ -v /mydata/redis:/data \ -p 6379:6379 \ redis --appendonly yes
|
🧰 客户端工具介绍
1️⃣ redis-cli 命令行客户端
1 2 3 4 5 6
| redis-cli -h 127.0.0.1 -p 6379
SET name "Alice" GET name
|
2️⃣ RedisInsight(可视化客户端)
官网地址:https://redis.com/redis-enterprise/redis-insight/
- 支持图形化浏览、键值操作、慢查询分析、集群图可视化
- 推荐给初学者与企业运维
🐍 使用 Python 操作 Redis
安装 redis
第三方库
示例:Python 缓存用户信息
1 2 3 4 5 6 7 8 9 10
| import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set("user:1001:name", "Alice", ex=60)
name = r.get("user:1001:name") print("用户名:", name)
|
示例:模拟页面访问计数器
1 2 3
| r.incr("page:home:views") count = r.get("page:home:views") print("首页访问量:", count)
|