当前位置: 首页 > news >正文

Redis 在互联网高并发场景下的应用--个人总结

在现代互联网系统中,高并发已经成为常态。无论是电商的秒杀场景、社交平台的热点推荐,还是支付接口的风控,系统需要同时应对成千上万的请求。这时候,Redis 作为一个高性能的内存数据库,凭借其极快的读写速度和丰富的数据结构,成为解决高并发问题的利器。

1. 缓存热点数据 —— 缓解数据库压力

问题背景:数据库在高并发场景下容易成为瓶颈,特别是热点数据的访问会导致 QPS 瞬间飙升。
Redis 解决方案

  • 使用 StringHash 缓存热点数据。

  • 采用 Cache Aside 模式:先查缓存,缓存未命中再查数据库并回填。

  • 避免常见问题:

    • 缓存穿透:使用布隆过滤器或缓存空对象。

    • 缓存雪崩:给缓存设置随机过期时间或提前预热。

    • 缓存击穿:对热点 key 加互斥锁,避免同时穿透到数据库。

应用场景:用户信息、商品详情页、首页推荐数据等。

示例代码

import redisr = redis.Redis(host='localhost', port=6379, db=0)def get_data_from_db(key):print("查询数据库")return {"id": key, "value": f"data_{key}"}def get_data(key):cache_key = f"cache:{key}"val = r.get(cache_key)if val:print("命中缓存")return eval(val)data = get_data_from_db(key)r.setex(cache_key, 60, str(data))return dataprint(get_data(1))
print(get_data(1))

2. 限流 —— 防止接口过载

问题背景:突发流量可能会压垮下游服务,例如秒杀、登录、支付接口。
Redis 解决方案

  • 使用 String 作为计数器:INCR + EXPIRE 实现固定时间窗口限流。

  • 使用 Sorted Set 存储时间戳:实现滑动窗口限流,更加精细化。

  • 可以配合 Lua 脚本保证原子性操作。

应用场景:API 调用限流、防止刷单、短信/验证码接口保护。

示例代码(滑动窗口限流)

import time
import redisr = redis.Redis(host='localhost', port=6379, db=0)def is_allowed_sliding_window(user_id, action, period=60, max_count=5):key = f"rate_limit:{user_id}:{action}"now = time.time()pipeline = r.pipeline()pipeline.zadd(key, {now: now})pipeline.zremrangebyscore(key, 0, now - period)pipeline.zcard(key)pipeline.expire(key, period)_, _, count, _ = pipeline.execute()return count <= max_countfor i in range(10):if is_allowed_sliding_window("u1001", "login"):print(i, "允许")else:print(i, "拒绝")time.sleep(0.5)

或者 使用 String 作为计数器

import redis
import timer = redis.Redis(host='localhost', port=6379, db=0)def is_allowed(user_id, action, period=60, max_count=5):"""在 period 时间内最多允许 max_count 次操作"""key = f"rate_limit:{user_id}:{action}"count = r.incr(key)if count == 1:r.expire(key, period)  # 设置过期时间if count > max_count:return Falsereturn True# 测试
for i in range(10):if is_allowed("u1001", "login"):print(i, "允许")else:print(i, "拒绝")time.sleep(0.5)

3. 分布式队列 —— 异步削峰

问题背景:大量请求直接打到数据库或下游服务,可能会瞬间撑爆系统。
Redis 解决方案

  • 使用 ListLPUSH + BRPOP)作为简单任务队列。

  • 使用 Stream 实现类似 Kafka 的消息队列:支持消费组、消息确认和持久化。

  • 常见用途:削峰填谷,将请求转为异步任务,让系统有更多缓冲时间。

应用场景:订单处理、日志收集、消息通知、秒杀排队。

示例代码(Stream 队列)

import redisr = redis.Redis(host='localhost', port=6379, db=0)
stream_key = "order_stream"# 生产者
def produce():for i in range(5):r.xadd(stream_key, {"order": f"order_{i}"})print("生产订单:", f"order_{i}")# 消费者
def consume():last_id = "0-0"while True:messages = r.xread({stream_key: last_id}, block=2000, count=2)if not messages:breakfor _, msgs in messages:for msg_id, data in msgs:print("消费订单:", msg_id, data)last_id = msg_idproduce()
consume()

4. 分布式锁 —— 保证数据一致性

问题背景:在分布式环境中,多实例同时修改同一资源,可能造成数据冲突。
Redis 解决方案

  • 使用 String 类型:

    • SET key value NX PX timeout 实现加锁,避免重复设置。

    • 校验 value 防止误删锁。

  • 高级方案:使用 RedLock 算法 提升可靠性,避免单点故障。

应用场景:库存扣减、任务调度、并发下的幂等操作。

示例代码

import redis
import uuid
import timer = redis.Redis(host='localhost', port=6379, db=0)def acquire_lock(lock_key, expire=5):lock_id = str(uuid.uuid4())result = r.set(lock_key, lock_id, nx=True, ex=expire)return lock_id if result else Nonedef release_lock(lock_key, lock_id):script = """if redis.call('get', KEYS[1]) == ARGV[1] thenreturn redis.call('del', KEYS[1])elsereturn 0end"""return r.eval(script, 1, lock_key, lock_id)lock_id = acquire_lock("my_lock", expire=3)
if lock_id:print("获得锁,执行业务逻辑...")time.sleep(2)print("释放锁:", release_lock("my_lock", lock_id))
else:print("未获得锁")

5. 实时统计与排行榜

问题背景:高并发下,需要对访问量、点赞数、排名进行实时计算。
Redis 解决方案

  • 使用 INCR / HINCRBY 做计数器。

  • 使用 Sorted Set 实现排行榜,支持按分数排序。

应用场景:网站 PV/UV 统计、热搜榜、积分排名、点赞排行榜。

示例代码

import redisr = redis.Redis(host='localhost', port=6379, db=0)# 统计 PV
r.incr("page_view")
print("页面访问量:", r.get("page_view").decode())# 排行榜
leaderboard = "game_rank"
r.zincrby(leaderboard, 10, "user1")
r.zincrby(leaderboard, 20, "user2")print("排行榜:", r.zrevrange(leaderboard, 0, -1, withscores=True))

总结

在互联网高并发场景下,Redis 可以解决以下核心问题:

  1. 缓存热点数据 → 缓解数据库压力,提升响应速度。

  2. 限流 → 防止突发流量冲击系统。

  3. 分布式队列 → 实现削峰填谷,支撑异步处理。

  4. 分布式锁 → 保证数据一致性,防止并发冲突。

  5. 实时统计与排行榜 → 提供快速的聚合计算能力。

Redis 不仅仅是一个缓存,更是一个 高并发场景下的基础设施。合理利用其数据结构与特性,可以极大提升系统的可扩展性与稳定性。


文章转载自:

http://iJgz7DM8.hrpmt.cn
http://bqIUHtgc.hrpmt.cn
http://32lee5zp.hrpmt.cn
http://64eiYK9y.hrpmt.cn
http://qqEwrxcg.hrpmt.cn
http://uryZuQ5s.hrpmt.cn
http://NonTtlcJ.hrpmt.cn
http://kqEdlNpZ.hrpmt.cn
http://9UCAjIbI.hrpmt.cn
http://mbzX69L9.hrpmt.cn
http://h25sqJ1b.hrpmt.cn
http://ptSdME29.hrpmt.cn
http://aiOqE6dc.hrpmt.cn
http://Xxs8PvMd.hrpmt.cn
http://fifrpKqt.hrpmt.cn
http://T76wUbap.hrpmt.cn
http://g5fMsCYN.hrpmt.cn
http://roTJjE2D.hrpmt.cn
http://eySAVCMR.hrpmt.cn
http://OiathLeb.hrpmt.cn
http://nU6EEgvp.hrpmt.cn
http://EYp5Il1S.hrpmt.cn
http://9HrYEr2r.hrpmt.cn
http://I5xSyyZC.hrpmt.cn
http://bg0Ry5DW.hrpmt.cn
http://zauChSPL.hrpmt.cn
http://ELDEyusM.hrpmt.cn
http://4HXHHojI.hrpmt.cn
http://yOTHSozE.hrpmt.cn
http://6zgySBva.hrpmt.cn
http://www.dtcms.com/a/370173.html

相关文章:

  • 算法题-链表03
  • 版本发布流程手册:Release分支规范与Bug分级标准全解析
  • 目标检测中的池化层
  • react native 出现 FATAL EXCEPTION: OkHttp Dispatcher
  • HttpClient、OkHttp 和 WebClient
  • js逆向Webpack模块加载机制解析:从数组到JSONP
  • cuda-NCCL笔记(1)-- 初步了解使用NCCL
  • Lua 面向对象编程
  • 微信小程序(uniapp)实现连接蓝牙
  • 从 scheduler_tick 到上下文切换:深入解析 Linux 内核的 TIF_NEED_RESCHED 标志设置流程
  • 微前端框架性能对比与选型指南:从理论到实践
  • pyAutoGUI 模块主要功能介绍-(1)鼠标功能
  • Maven的介绍及基本使用
  • 使用 C# .NETCore 实现MongoDB
  • 2025年渗透测试面试题总结-55(题目+回答)
  • %前置模糊查询优化
  • 【架构艺术】变更风险防控架构嵌入决策降噪模块的方法
  • ElmentUI之DateTimePicker 日期时间选择器
  • RabbitMQ 入门与 Go 语言实践
  • [Upscayl图像增强] Electron主进程命令 | 进程间通信IPC
  • 80(HTTP默认端口)和8080端口(备用HTTP端口)区别
  • AI模型测评平台工程化实战十二讲(第一讲:从手工测试到系统化的觉醒)
  • FreeMarker快速入门指南
  • python的数据结构
  • Spark 中spark.implicits._ 中的 toDF和DataFrame 类本身的 toDF 方法
  • 基于Spark的中文文本情感分析系统研究
  • 《用 asyncio 构建异步任务队列:Python 并发编程的实战与思考》
  • Python+DRVT 从外部调用 Revit:批量创建梁(2)
  • 数据库原理及应用_数据库管理和保护_第5章数据库的安全性_理论部分
  • 开源OpenHarmony润开鸿HH-SCDAYU800A开发板开箱体验