Redis 学习基础篇

📕 Redis 学习基础篇

✅ 1.1 Redis 简介

🔷 Redis 是什么?

Redis(Remote Dictionary Server)是一个基于内存的高性能键值型数据库,支持丰富的数据结构,广泛应用于缓存、消息队列、排行榜、计数器、实时统计等高并发业务场景。

  • 特点:

    • 内存操作:速度快(百万级 QPS)
    • 数据结构丰富:StringListSetHashZSet
    • 持久化支持: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")) # 输出 abc123

# 自增
r.set("count", 10)
r.incr("count") # 输出 11

✅ 二、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")) # {'name': '张三', 'age': '28'}

✅ 三、List(列表)

🧠 特点:

  • 链表结构,支持从两端插入、弹出(LPUSH/RPUSH)
  • 支持阻塞操作(BLPOP)

🎯 实战场景:

  • 消息队列
  • 最近操作记录(如登录历史)

🔧 Python 示例:

1
2
r.lpush("queue:task", "任务1", "任务2")
print(r.rpop("queue:task")) # 任务1,先进后出

📌 结合 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") # Bob 加 20 分
print(r.zrevrange("leaderboard", 0, 1, withscores=True)) # [('Bob', 100.0), ('Alice', 100.0)]

✅ 六、Bitmap(位图)

🧠 特点:

  • 以位为单位进行存储、操作
  • 超轻量级数据标记方式

🎯 实战场景:

  • 用户是否签到、是否激活、广告曝光记录

🔧 Python 示例:

1
2
r.setbit("user:sign:2025-07-01", 1001, 1)  # 用户 1001 签到
print(r.getbit("user:sign:2025-07-01", 1001)) # 1

✅ 七、HyperLogLog

🧠 特点:

  • 基于概率算法的基数估算器
  • 内存恒定(~12KB)

🎯 实战场景:

  • UV 去重统计(例如日活 IP)

🔧 Python 示例:

1
2
r.pfadd("uv:2025-07-01", "ip1", "ip2", "ip3")
print(r.pfcount("uv:2025-07-01")) # 输出 3

✅ 八、Stream(流)

🧠 特点:

  • 类 Kafka 的消息队列
  • 支持消费组、阻塞读取

🎯 实战场景:

  • 日志采集系统
  • 消息通知(订单、用户消息)

🔧 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
# 使用 Homebrew 安装
brew install redis

# 启动 Redis
brew services start redis

# 测试连接
redis-cli ping # 返回 PONG

🐧 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
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 第三方库

1
pip install 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) # ex=60 表示 60秒过期

# 读取缓存数据
name = r.get("user:1001:name")
print("用户名:", name)

示例:模拟页面访问计数器

1
2
3
r.incr("page:home:views")   # 每访问一次 +1
count = r.get("page:home:views")
print("首页访问量:", count)

Redis 学习基础篇
https://dreamshao.github.io/2025/07/09/redis教程基础篇/
作者
Yun Shao
发布于
2025年7月9日
许可协议