一、Redis 是什么Redis 全称Remote Dictionary Server是一个开源的内存数据库。与 MySQL 这类把数据存在磁盘上的数据库不同Redis 把数据存在内存中因此读写速度极快通常可以达到每秒数十万次操作。它的主要特点速度极快基于内存操作读写延迟在微秒级数据结构丰富不只是简单的 key-value支持字符串、列表、哈希、集合、有序集合等支持持久化可以将内存数据定期保存到磁盘防止重启后数据丢失支持过期时间每个 key 可以设置 TTL到期自动删除单线程模型命令执行是串行的天然避免并发写入冲突二、核心数据结构Redis 不是只会存字符串它有 5 种基础数据类型每种都针对特定场景设计。1. String字符串最基本的类型可以存文本、数字、甚至序列化后的 JSON。SET username 张三 GET username # 返回 张三 SET counter 0 INCR counter # 自增返回 1常用于计数器 EXPIRE username 3600 # 设置 1 小时后过期2. Hash哈希类似一个小型 Map适合存储对象。HSET user:1 name 张三 age 28 city 北京 HGET user:1 name # 返回 张三 HGETALL user:1 # 返回所有字段3. List列表有序的字符串列表支持从头部或尾部插入/弹出天然适合做队列。RPUSH task 任务A # 从右侧入队 RPUSH task 任务B LPOP task # 从左侧出队返回 任务A4. Set集合无序、不重复的字符串集合支持交集、并集、差集操作。SADD online_users user1 user2 user3 SISMEMBER online_users user1 # 判断是否在线 SCARD online_users # 在线人数5. ZSet有序集合在 Set 基础上每个元素附带一个分数score按分数自动排序。排行榜的核心就靠它。ZADD leaderboard 9800 玩家A ZADD leaderboard 12000 玩家B ZREVRANGE leaderboard 0 9 WITHSCORES # 取前10名从高到低三、典型场景一缓存这是 Redis 最经典的用途。当用户频繁请求同一份数据比如商品详情页每次都去查数据库既慢又浪费资源。解决思路是第一次查数据库结果存入 Redis后续直接从 Redis 读取。用户请求 → 查 Redis ↓ 命中 是 → 直接返回毫秒级 否 → 查 MySQL → 写入 Redis → 返回伪代码示意Java/Python 风格def get_product(product_id): cache_key fproduct:{product_id} # 先查缓存 result redis.get(cache_key) if result: return json.loads(result) # 缓存未命中查数据库 product db.query(SELECT * FROM products WHERE id ?, product_id) # 写入缓存设置 10 分钟过期 redis.setex(cache_key, 600, json.dumps(product)) return product注意几个常见问题缓存穿透查询一个根本不存在的 key每次都打到数据库。解决对空结果也缓存或使用布隆过滤器。缓存击穿某个热点 key 突然过期大量请求同时打到数据库。解决设置互斥锁只让一个请求去查库。缓存雪崩大量 key 同时过期。解决过期时间加随机抖动。四、典型场景二消息队列利用 List 的LPUSH / RPOP特性可以实现一个简单的消息队列将耗时任务异步处理。场景举例用户注册后发送欢迎邮件。发邮件可能需要几秒不能让用户等着。用户注册 → 将发邮件任务RPUSH 进 Redis List ↓ 后台 Worker 循环 LPOP 取任务 → 发送邮件# 生产者注册时将任务入队 def register(user): db.save(user) redis.rpush(email_queue, json.dumps({to: user.email, type: welcome})) # 消费者后台 Worker 持续处理 while True: task redis.blpop(email_queue, timeout5) # 阻塞式取任务 if task: send_email(json.loads(task[1]))注意Redis 的 List 队列适合轻量任务。如果业务复杂、需要消息确认、重试机制建议使用 RabbitMQ 或 Kafka。五、典型场景三排行榜ZSet有序集合天生为排行榜而生。score 存分数member 存用户 IDRedis 自动维护排序。# 更新分数游戏得分、销售额等 ZINCRBY leaderboard 500 user:1001 # user:1001 加 500 分 # 查询前 10 名 ZREVRANGE leaderboard 0 9 WITHSCORES # 查询某个用户的排名 ZREVRANK leaderboard user:1001 # 返回名次从0开始 # 查询某个用户的分数 ZSCORE leaderboard user:1001这套操作的时间复杂度是 O(log N)即使有百万用户查询依然飞快。六、Redis 在项目中的典型架构位置客户端 ↓ 后端服务Spring Boot / Django 等 ↓ ↓ Redis MySQL 缓存/队列 持久存储Redis 不是用来替代 MySQL 的而是配合数据库使用承担高频读写的部分减轻数据库压力。总结场景用到的数据结构核心命令缓存StringSET / GET / SETEX消息队列ListRPUSH / BLPOP排行榜ZSetZADD / ZREVRANGE / ZREVRANK在线用户SetSADD / SCARD存储对象HashHSET / HGETALLRedis 的学习曲线不陡但要用好它需要理解每种数据结构背后的设计意图。建议从缓存场景入手在实际项目中逐步积累经验。
Redis 缓存、队列、排行榜的核心用法
一、Redis 是什么Redis 全称Remote Dictionary Server是一个开源的内存数据库。与 MySQL 这类把数据存在磁盘上的数据库不同Redis 把数据存在内存中因此读写速度极快通常可以达到每秒数十万次操作。它的主要特点速度极快基于内存操作读写延迟在微秒级数据结构丰富不只是简单的 key-value支持字符串、列表、哈希、集合、有序集合等支持持久化可以将内存数据定期保存到磁盘防止重启后数据丢失支持过期时间每个 key 可以设置 TTL到期自动删除单线程模型命令执行是串行的天然避免并发写入冲突二、核心数据结构Redis 不是只会存字符串它有 5 种基础数据类型每种都针对特定场景设计。1. String字符串最基本的类型可以存文本、数字、甚至序列化后的 JSON。SET username 张三 GET username # 返回 张三 SET counter 0 INCR counter # 自增返回 1常用于计数器 EXPIRE username 3600 # 设置 1 小时后过期2. Hash哈希类似一个小型 Map适合存储对象。HSET user:1 name 张三 age 28 city 北京 HGET user:1 name # 返回 张三 HGETALL user:1 # 返回所有字段3. List列表有序的字符串列表支持从头部或尾部插入/弹出天然适合做队列。RPUSH task 任务A # 从右侧入队 RPUSH task 任务B LPOP task # 从左侧出队返回 任务A4. Set集合无序、不重复的字符串集合支持交集、并集、差集操作。SADD online_users user1 user2 user3 SISMEMBER online_users user1 # 判断是否在线 SCARD online_users # 在线人数5. ZSet有序集合在 Set 基础上每个元素附带一个分数score按分数自动排序。排行榜的核心就靠它。ZADD leaderboard 9800 玩家A ZADD leaderboard 12000 玩家B ZREVRANGE leaderboard 0 9 WITHSCORES # 取前10名从高到低三、典型场景一缓存这是 Redis 最经典的用途。当用户频繁请求同一份数据比如商品详情页每次都去查数据库既慢又浪费资源。解决思路是第一次查数据库结果存入 Redis后续直接从 Redis 读取。用户请求 → 查 Redis ↓ 命中 是 → 直接返回毫秒级 否 → 查 MySQL → 写入 Redis → 返回伪代码示意Java/Python 风格def get_product(product_id): cache_key fproduct:{product_id} # 先查缓存 result redis.get(cache_key) if result: return json.loads(result) # 缓存未命中查数据库 product db.query(SELECT * FROM products WHERE id ?, product_id) # 写入缓存设置 10 分钟过期 redis.setex(cache_key, 600, json.dumps(product)) return product注意几个常见问题缓存穿透查询一个根本不存在的 key每次都打到数据库。解决对空结果也缓存或使用布隆过滤器。缓存击穿某个热点 key 突然过期大量请求同时打到数据库。解决设置互斥锁只让一个请求去查库。缓存雪崩大量 key 同时过期。解决过期时间加随机抖动。四、典型场景二消息队列利用 List 的LPUSH / RPOP特性可以实现一个简单的消息队列将耗时任务异步处理。场景举例用户注册后发送欢迎邮件。发邮件可能需要几秒不能让用户等着。用户注册 → 将发邮件任务RPUSH 进 Redis List ↓ 后台 Worker 循环 LPOP 取任务 → 发送邮件# 生产者注册时将任务入队 def register(user): db.save(user) redis.rpush(email_queue, json.dumps({to: user.email, type: welcome})) # 消费者后台 Worker 持续处理 while True: task redis.blpop(email_queue, timeout5) # 阻塞式取任务 if task: send_email(json.loads(task[1]))注意Redis 的 List 队列适合轻量任务。如果业务复杂、需要消息确认、重试机制建议使用 RabbitMQ 或 Kafka。五、典型场景三排行榜ZSet有序集合天生为排行榜而生。score 存分数member 存用户 IDRedis 自动维护排序。# 更新分数游戏得分、销售额等 ZINCRBY leaderboard 500 user:1001 # user:1001 加 500 分 # 查询前 10 名 ZREVRANGE leaderboard 0 9 WITHSCORES # 查询某个用户的排名 ZREVRANK leaderboard user:1001 # 返回名次从0开始 # 查询某个用户的分数 ZSCORE leaderboard user:1001这套操作的时间复杂度是 O(log N)即使有百万用户查询依然飞快。六、Redis 在项目中的典型架构位置客户端 ↓ 后端服务Spring Boot / Django 等 ↓ ↓ Redis MySQL 缓存/队列 持久存储Redis 不是用来替代 MySQL 的而是配合数据库使用承担高频读写的部分减轻数据库压力。总结场景用到的数据结构核心命令缓存StringSET / GET / SETEX消息队列ListRPUSH / BLPOP排行榜ZSetZADD / ZREVRANGE / ZREVRANK在线用户SetSADD / SCARD存储对象HashHSET / HGETALLRedis 的学习曲线不陡但要用好它需要理解每种数据结构背后的设计意图。建议从缓存场景入手在实际项目中逐步积累经验。