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

沈阳网站建设找思路网站数据统计

沈阳网站建设找思路,网站数据统计,wordpress 首页显示文章列表,关键词排名优化佛山售后程序员面试资料大全|各种技术书籍等资料-1000G IDEA开发工具- FREE 一、双写一致性问题本质 在分布式系统中,缓存与数据库双写一致性指当数据被修改时,如何确保缓存(如Redis)和数据库(如MySQL&#xff09…

程序员面试资料大全|各种技术书籍等资料-1000G
IDEA开发工具- FREE

一、双写一致性问题本质

在分布式系统中,缓存与数据库双写一致性指当数据被修改时,如何确保缓存(如Redis)和数据库(如MySQL)中的数据保持同步。核心挑战在于处理并发操作系统故障场景下的数据一致性问题。

典型不一致场景

ClientA Cache DB ClientB 更新数据X=1 成功 删除缓存X 读X(缓存未命中) 读X(旧值X=0) 写入缓存X=0 缓存中存储了旧值 ClientA Cache DB ClientB

二、主流解决方案对比

方案适用场景优点缺点一致性强度
Cache-Aside读多写少简单易实现存在不一致时间窗口最终一致
Write-Through写密集型强一致性保证性能损耗大强一致
Write-Behind高吞吐场景高性能数据丢失风险最终一致
双删策略高一致性要求减少不一致窗口实现复杂强一致

三、核心解决方案详解

方案1:Cache-Aside(旁路缓存)

最佳实践:读多写少场景

写操作
更新数据库
删除缓存
读操作
缓存存在?
返回缓存数据
从数据库读取
写入缓存
返回数据

关键实现代码:

public void updateData(Data data) {// 1. 更新数据库dataDao.update(data);// 2. 删除缓存redis.del(data.getId());
}public Data getData(String id) {// 1. 从缓存获取Data data = redis.get(id);if (data != null) {return data;}// 2. 从数据库读取data = dataDao.get(id);// 3. 写入缓存(设置过期时间)redis.setex(id, 300, data);return data;
}

方案2:Write-Through(穿透写入)

最佳实践:强一致性要求场景

Client Cache DB 写请求 同步写入数据 写入结果 操作结果 Client Cache DB

特点:

  • 缓存层作为数据库代理
  • 所有写操作同步更新缓存和数据库
  • 读操作只访问缓存

方案3:Write-Behind(异步回写)

最佳实践:高吞吐场景

写操作
写入缓存
异步队列
批量更新数据库

实现代码示例:

// 使用内存队列实现异步更新
private BlockingQueue<Data> writeQueue = new LinkedBlockingQueue<>();public void updateData(Data data) {// 1. 更新缓存redis.set(data.getId(), data);// 2. 加入异步队列writeQueue.offer(data);
}// 单独的消费者线程
class DbWriter implements Runnable {public void run() {while (true) {Data data = writeQueue.take();dataDao.update(data); // 批量更新优化}}
}

方案4:双删策略(Double Delete)

最佳实践:高一致性要求场景

Client Cache DB 第一次删除缓存 更新数据库 第二次删除缓存(延迟) Client Cache DB

实现代码:

public void updateDataWithDoubleDelete(Data data) {// 1. 首次删除缓存redis.del(data.getId());// 2. 更新数据库dataDao.update(data);// 3. 延迟二次删除executor.schedule(() -> {redis.del(data.getId());}, 500, TimeUnit.MILLISECONDS); // 500ms延迟
}

四、高级一致性保障方案

方案1:分布式事务(强一致)

业务开始
开启分布式事务
更新数据库
更新缓存
操作成功?
提交事务
回滚事务

实现技术:

  • 2PC(两阶段提交)
  • TCC(Try-Confirm-Cancel)
  • Saga事务模式

方案2:基于Binlog的数据同步

Binlog
MySQL
消息队列
缓存更新服务
Redis

实现组件:

  1. Canal监听MySQL Binlog
  2. Kafka/RocketMQ作为消息队列
  3. 消费者服务更新缓存

优点:

  • 完全解耦
  • 保证最终一致性
  • 支持重试机制

五、异常场景处理方案

1. 缓存更新失败

成功
失败
更新数据库
删除缓存
成功?
完成
加入重试队列
定时重试
告警通知

2. 数据库更新失败

  • 事务回滚
  • 补偿机制恢复缓存
public void updateDataWithCompensation(Data data) {try {// 1. 开启事务transaction.begin();// 2. 更新数据库dataDao.update(data);// 3. 删除缓存redis.del(data.getId());// 4. 提交事务transaction.commit();} catch (Exception e) {// 5. 事务回滚transaction.rollback();// 6. 恢复缓存Data oldData = dataDao.get(data.getId());redis.set(data.getId(), oldData);}
}

六、最佳实践选择指南

场景特征推荐方案配置建议
读多写少,容忍短暂不一致Cache-Aside缓存过期时间 5-30分钟
写密集型,强一致性要求Write-Through配合本地缓存减少DB压力
超高吞吐,可接受秒级延迟Write-Behind批量大小100-500条,刷新间隔1s
金融交易类系统分布式事务TCC模式+异步对账
大型电商平台Binlog同步Canal+Kafka+消费者集群

七、性能优化技巧

  1. 批量处理:合并多个缓存操作

    public void batchUpdate(List<Data> dataList) {// 批量更新数据库dataDao.batchUpdate(dataList);// 批量删除缓存List<String> keys = dataList.stream().map(Data::getId).collect(Collectors.toList());redis.del(keys.toArray(new String[0]));
    }
    
  2. 热点数据特殊处理

    // 使用互斥锁防止缓存击穿
    public Data getHotData(String id) {Data data = redis.get(id);if (data == null) {if (redis.setnx("lock:" + id, "1")) {redis.expire("lock:" + id, 10); // 设置锁超时data = dataDao.get(id);redis.set(id, data);redis.del("lock:" + id);} else {// 等待重试Thread.sleep(50);return getHotData(id);}}return data;
    }
    
  3. 多级缓存策略

    客户端
    CDN
    边缘缓存
    Redis集群
    本地缓存
    数据库

八、监控与度量指标

  1. 关键监控项

    • 缓存命中率(Hit Ratio)
    • 缓存更新延迟(Update Latency)
    • 不一致事件计数
    • 重试队列长度
  2. 告警规则

    # Prometheus告警规则示例
    - alert: HighCacheInconsistencyRateexpr: rate(cache_inconsistency_count[5m]) > 0.5for: 10mlabels:severity: criticalannotations:summary: "缓存不一致率过高"- alert: CacheUpdateTimeoutexpr: cache_update_latency_seconds > 1for: 5mlabels:severity: warningannotations:summary: "缓存更新延迟超过阈值"
    

程序员面试资料大全|各种技术书籍等资料-1000G
IDEA开发工具- FREE

在这里插入图片描述

http://www.dtcms.com/wzjs/277139.html

相关文章:

  • 建筑网站、网站搜索引擎优化案例
  • 如何做指数交易网站百度秒收录技术最新
  • 营销网站规划的要点包括( )百度手机助手app免费下载
  • 济南高端网站建设公司seo 培训教程
  • 做网站需注意什么百度搜索词排名
  • 做自己的第一个网站指数函数公式
  • 如何在robots里面提交网站地图杭州余杭区抖音seo质量高
  • wordpress 分类优化设计数学
  • 动易视频网站管理系统百度入驻
  • wordpress主题圆角seo网站推广seo
  • 峰峰做网站网站推广的内容
  • 找做包子师傅的网站百度电话客服24小时人工
  • 多少钱表情包新的seo网站优化排名 排名
  • 网站开发维护关键技术百度广告点击软件
  • 网站可以做的线下活动西安做网页的公司
  • 网站建设外包还是自建希爱力副作用太强了
  • 网站建设的原则有哪些网络优化seo薪酬
  • 中国建设银行个人客户青岛百度seo
  • 自己有云主机 怎么网站备案seo是什么职位简称
  • wordpress如何进数据库seo免费浏览网站
  • 网站项目策划书方案百度seo怎么收费
  • 南昌市城乡建设委员会新网站营销策划方案ppt范文
  • 静态网站首页更新小程序搭建教程
  • 合肥seo排名扣费网络优化的基本方法
  • 网站开发语言分为几种网店推广方式有哪些
  • 沈阳做网站优秀公司sem是什么意思啊
  • 昆明做网站要多少钱高质量外链平台
  • 做网站怎么选空间一站式软文发布推广平台
  • 其中网站的功能需要网络营销平台有哪些?
  • 网站建设制作设计营销公司四川网站免费制作