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

Redis 使用场景、缓存什么数据?怎么保证数据一致性?

Redis 作为高性能的内存数据库,其核心价值在于极速读写能力丰富的数据结构,但使用不当会导致数据一致性问题。


一、Redis 核心使用场景与缓存数据类型

1. 高频读低频写数据(缓存经典场景)
数据类型示例数据结构选择
热点商品信息商品详情页String/ Hash
用户会话(Session)登录状态、购物车String
全局配置项系统开关、AB测试配置String/ Hash
2. 复杂计算中间结果
场景Redis 解决方案优势
实时排行榜ZSET (有序集合)亿级数据毫秒排序
好友关系SET (集合)交集/并集快速计算
地理位置查询GEO附近的人/商家
3. 高并发写缓冲
客户端请求
Redis写入缓冲
异步持久化到DB
MySQL/Oracle
  • 适用场景:秒杀库存扣减、点赞计数
  • 数据结构INCR 命令原子操作计数器
4. 不该缓存的数据类型
  • 强一致性要求数据:银行账户余额
  • 超大二进制文件:视频/图片(应用OSS存储)
  • 极少访问的冷数据:历史归档记录

二、数据一致性保障方案(缓存与DB同步)

1. 主流方案对比
方案一致性强度延迟复杂度适用场景
先更新DB后删缓存最终一致通用场景(推荐)
双写事务强一致金融交易
订阅Binlog最终一致异构系统同步
缓存过期弱一致不确定容忍脏数据场景
2. 最佳实践:Cache-Aside Pattern
Client Cache DB 1. 读取数据 返回数据 2. 查询数据库 返回数据 3. 写入缓存 alt [缓存命中] [缓存未命中] 4. 更新数据库 确认更新 5. 删除缓存 Client Cache DB
3. 关键问题解决方案

问题1:缓存删除失败

  • 重试机制
    // 删除缓存的重试策略(指数退避)
    RetryTemplate retryTemplate = new RetryTemplate();
    ExponentialBackOffPolicy backOff = new ExponentialBackOffPolicy();
    backOff.setInitialInterval(500);
    backOff.setMultiplier(2);
    retryTemplate.setBackOffPolicy(backOff);
    retryTemplate.execute(ctx -> {redis.del(key);return null;
    });
    

问题2:并发写导致脏数据

  • 分布式锁控制
    SET lock_key unique_id NX PX 30000  # 获取锁
    // 执行DB更新+删缓存
    EVAL "if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('del',KEYS[1]) end" 1 lock_key unique_id
    

问题3:主从延迟

  • 强制读主库
    /* 在SQL中增加Hint强制走主库 */
    SELECT /*+ MASTER */ * FROM table WHERE id=100
    

三、多级缓存架构设计

请求
未命中
未命中
未命中
未命中
客户端
CDN缓存
Nginx缓存
应用本地缓存
Redis集群
数据库
缓存层级配置策略:
层级缓存工具过期时间容量限制
CDNAkamai/阿里云CDN10分钟-24小时TB级
Nginxproxy_cache1-5分钟10-100GB
应用本地缓存Caffeine30秒-2分钟1-5GB
分布式缓存Redis5分钟-12小时百GB-TB级

四、高可靠生产配置

1. Redis 部署架构
异地灾备
同城双活
同步复制
异步复制
异地集群
本地集群
Redis Cluster B区
Redis Cluster A区
2. 关键参数调优
# redis.conf 生产建议
maxmemory 64gb  # 预留20%内存
maxmemory-policy volatile-lfu  # 对带过期Key用LFU淘汰
appendfsync everysec  # RDB+AOF混合持久化
cluster-require-full-coverage no  # 部分节点故障仍可用
3. 监控告警指标
指标危险阈值监控工具
内存使用率>80%Prometheus
网络延迟>50msRedis SLOWLOG
Key驱逐速率>1000/秒info stats
主从同步延迟>10MBredis-cli --latency
连接数>5000Grafana仪表盘

五、经典踩坑案例

案例:缓存雪崩

现象:大量Key同时过期 → 请求穿透到DB → 数据库崩溃
解决

# 设置差异化过期时间
EXPIRE key ${base_time + random(0, 300)}
案例:热Key问题

现象:某明星离婚事件导致用户主页缓存Key QPS超50万
解决

// 本地缓存+Redis二级缓存
LoadingCache<String, Object> localCache = Caffeine.newBuilder().maximumSize(10_000).refreshAfterWrite(1, TimeUnit.SECONDS).build(key -> redis.get(key));
案例:大Value阻塞

现象:10MB的JSON数据导致网络阻塞
解决

# 压缩存储
import zlib
compressed = zlib.compress(json.dumps(data).encode())
redis.set(key, compressed)# 读取时解压
data = json.loads(zlib.decompress(redis.get(key)))

总结:Redis 使用黄金法则

  1. 缓存选型铁律

    • 只缓存变更频率低访问频率高的数据
    • 价值公式:缓存收益 = (DB读取成本 - Redis读取成本) * 读取次数 - 缓存维护成本
  2. 一致性选择

  3. 性能压测指标

    操作单节点QPS
    GET/SET10万+
    LPUSH8万+
    ZADD5万+
    事务(MULTI)3万+

终极建议

  • 对一致性要求极高的场景:使用Redis作为只读缓存,写请求直落数据库
  • 超大规模热点数据:采用Redis+本地缓存两级架构,本地缓存兜底
  • 每天凌晨自动扫描大Keyredis-cli --bigkeys -i 0.1
  • 定期执行缓存穿透防御演练:模拟请求不存在的Key验证防护机制

你想要的我全都有:https://pan.q删掉憨子uark.cn/s/75a5a07b45a2

在这里插入图片描述

http://www.xdnf.cn/news/1017667.html

相关文章:

  • 自定义线程池 4.0
  • 基于51单片机的简易售货机系统
  • 使用 C/C++ 和 OpenCV 构建智能停车场视觉管理系统
  • 在GIS 工作流中实现数据处理(4)
  • 用Java实现常见排序算法详解
  • 玩转Docker | 使用Docker部署vaultwarden密码管理器
  • 让 Deepseek 写电器电费计算器(html版本)
  • 使用docker compose部署netmaker打通内网
  • JDK 8u231安装教程 - Windows 64位下载安装及环境变量配置指南
  • 解决U盘安装Win11无法命令行跳过联网激活的问题
  • java复习 11
  • 使用 C++/OpenCV 和 libevent 构建远程智能停车场管理系统
  • 每天宜搭宜搭小知识—报表组件—柱线混合图
  • 算法第15天:继续二叉树|前序递归+回溯与前序递归的场景总结、最大二叉树、合并二叉树、二叉搜索树中的搜索、验证二叉搜索树
  • Mac电脑 系统监测工具 System Dashboard Pro
  • 【leetcode】543. 二叉树的直径
  • uni-app项目实战笔记4--使用组件具名插槽slot定义公共标题模块
  • 案例:城市“光革命”背后,塔能科技的智能照明进化方程式
  • 欧美简洁时尚风格通用PPT模版分享
  • 麒麟信安支撑2025年电力监控系统安全运维新技能推广应用示范培训班顺利举办
  • Java + easyexcel 新旧数据对比,单元格值标红
  • 优化 Excel 文件可以提升文件性能、减少文件大小并加快计算速度
  • mysql中替换字符串(正则)
  • mapbox进阶,切片网格生成实现
  • 深入理解Python协程:asyncio、异步并发、事件循环
  • 开疆智能ModbusTCP转Devicenet网关连接三菱PLC与ABB机器人配置案例
  • NAS 年中成果汇报:从入门到高阶的影视/音乐/小说/资源下载 等好玩Docker 全集合
  • Python让自动驾驶“看见未来”:环境建模那些事儿
  • AWS知识点和技术面试模拟题
  • 基于python大数据的nba球员可视化分析系统