物流好的网站模板行业网站怎么建设

张小明 2026/1/10 8:03:30
物流好的网站模板,行业网站怎么建设,铜陵seo公司,国外做的好的网站Redis 缓存 缓存的通用模型 缓存与数据库的协同工作有三种经典模式#xff1a;Cache Aside#xff08;旁路缓存#xff09;#xff1a;由应用层负责维护缓存与数据库的一致性 查询#xff1a;先查缓存#xff0c;命中则返回#xff1b;未命中则查数据库#xff0c;并将…Redis 缓存缓存的通用模型缓存与数据库的协同工作有三种经典模式Cache Aside旁路缓存由应用层负责维护缓存与数据库的一致性查询先查缓存命中则返回未命中则查数据库并将结果写入缓存更新先更新数据库再删除缓存而非更新缓存✅优点实现简单、灵活性高⚠️缺点无法保证强一致性存在短暂不一致窗口当前最主流的方案Read/Write Through读写穿透由缓存层代理数据库读写查询缓存命中返回未命中由缓存自动查 DB 并回填更新直接写缓存缓存同步更新 DB✅ 优点对应用透明⚠️ 缺点缓存需实现复杂逻辑Redis 本身不支持需自研中间件Write Behind Caching写回缓存写操作只更新缓存由后台异步线程批量将变更写入数据库读操作优先读缓存✅ 优点极大提升写性能适用于日志、计数器等场景⚠️ 缺点一致性最弱系统崩溃可能丢数据实现复杂需处理顺序、重试注意不是“先写 DB 再同步缓存”而是先写缓存异步刷 DB 目前绝大多数系统采用Cache Aside模型因其简单、可控、易于调试。缓存一致性在Cache Aside模型中更新操作通常有两种顺序但都存在并发风险方案一先删除缓存再更新数据库 ❌不推荐线程1 删除缓存 → 正在更新 DB线程2 查询缓存空 → 查 DB此时 DB 还是旧值→ 将旧值写入缓存后续请求全部读到脏数据且长期不一致方案二先更新数据库再删除缓存 ✅推荐线程1 更新 DB → 删除缓存线程2 查询若在删缓存前会读到旧缓存短暂不一致但数据最终正确若在删缓存后会查 DB 获取最新值并重建缓存✅为什么选方案二虽然仍存在“短暂旧数据返回”的可能但不会将脏数据写回缓存最终一致性可保障。⚠️ 仍需注意的问题删除缓存失败若 DB 更新成功但删缓存失败 → 长期不一致解决方案异步重试如通过消息队列监控告警 人工介入极端场景下的不一致可采用“延迟双删”删除缓存 → 更新数据库 → sleep(100ms) → 再次删除缓存目的防止在更新 DB 期间有旧请求重建缓存✅ Java 示例先更新 DB再删除缓存ServicepublicclassUserService{AutowiredprivateUserMapperuserMapper;AutowiredprivateRedisTemplateString,ObjectredisTemplate;privatestaticfinalStringUSER_CACHE_KEYuser:;// 查询用户publicUsergetUserById(Longid){StringkeyUSER_CACHE_KEYid;Useruser(User)redisTemplate.opsForValue().get(key);if(user!null){returnuser;}// 缓存未命中查数据库useruserMapper.selectById(id);if(user!null){// 设置随机 TTL防雪崩longttl3600newRandom().nextInt(300);// 1h ~ 1h5minredisTemplate.opsForValue().set(key,user,ttl,TimeUnit.SECONDS);}else{// 防穿透缓存空值redisTemplate.opsForValue().set(key,,60,TimeUnit.SECONDS);}returnuser;}// 更新用户先更新 DB再删缓存TransactionalpublicvoidupdateUser(Useruser){userMapper.updateById(user);// 1. 更新数据库StringkeyUSER_CACHE_KEYuser.getId();redisTemplate.delete(key);// 2. 删除缓存// ✅ 生产建议若删除失败可发消息到 MQ 重试}}三大缓存异常问题即使采用正确的一致性策略仍可能遭遇以下三类高并发场景下的缓存危机1. 缓存穿透Cache Penetration定义查询一个根本不存在的数据缓存无DB 也无特点key 不存在于任何存储层危害数据库承受大量无效查询可被恶意利用进行 DoS 攻击✅ 解决方案空值缓存Null Cache布隆过滤器Bloom Filter✅ Java 示例布隆过滤器Guava 单机版ComponentpublicclassBloomFilterService{privateBloomFilterLonguserIdBloomFilterBloomFilter.create(Funnels.longFunnel(),1_000_000,0.01);PostConstructpublicvoidinit(){// 启动时加载所有合法用户 IDListLongallUserIdsuserMapper.selectAllIds();allUserIds.forEach(userIdBloomFilter::put);}publicbooleanmightExist(LonguserId){returnuserIdBloomFilter.mightContain(userId);}publicvoidaddUserToBloom(LonguserId){userIdBloomFilter.put(userId);}}// 使用示例ServicepublicclassSafeUserService{AutowiredprivateBloomFilterServicebloomFilterService;publicUsersafeGetUser(Longid){if(!bloomFilterService.mightExist(id)){returnnull;// 一定不存在直接返回}returnuserService.getUserById(id);// 走正常缓存流程}}⚠️ 注意Guava 是单机内存版。分布式环境建议使用RedisBloom 模块或自研分片布隆过滤器。2. 缓存雪崩Cache Avalanche定义大量缓存 key 在同一时间失效导致瞬时所有请求打到数据库特点多 key 集体失效缓存层“崩塌”危害数据库 QPS 瞬间飙升可能被打挂整体服务不可用✅ 解决方案设置随机 TTL热点数据永不过期逻辑过期多级缓存✅ Java 示例随机 TTL 逻辑过期// 随机 TTL通用longbaseTTL3600;longrandomTTLbaseTTLnewRandom().nextInt(300);redisTemplate.opsForValue().set(key,data,randomTTL,TimeUnit.SECONDS);// 逻辑过期封装类publicstaticclassLogicalCacheT{privateTdata;privatelongexpireTime;// 毫秒时间戳// getter/setter}// 写入逻辑过期缓存LogicalCacheUsercachenewLogicalCache();cache.setData(user);cache.setExpireTime(System.currentTimeMillis()3600_000);redisTemplate.opsForValue().set(hot:user:id,cache);// 读取配合后台刷新线程publicUsergetUserWithLogicalExpire(Longid){Stringkeyhot:user:id;LogicalCacheUsercache(LogicalCacheUser)redisTemplate.opsForValue().get(key);if(cache!null){if(System.currentTimeMillis()cache.getExpireTime()){refreshUserCacheAsync(id);// 异步刷新}returncache.getData();// 即使过期也返回旧值}returnloadFromDBAndSetCache(id);}3. 缓存击穿Cache Breakdown定义某个热点 key 在过期瞬间大量并发请求同时发现缓存失效全部查 DB特点单个 key 失效 高并发 → DB 瞬时压力✅ 解决方案互斥锁Mutex Lock热点 key 永不过期✅ Java 示例分布式互斥锁重建缓存publicUsergetUserWithMutex(Longid){Stringkeyuser:id;Useruser(User)redisTemplate.opsForValue().get(key);if(user!null)returnuser;StringlockKeylock:user:id;BooleanisLockedredisTemplate.opsForValue().setIfAbsent(lockKey,1,Duration.ofMillis(500));// 原子加锁500ms超时if(Boolean.TRUE.equals(isLocked)){try{// 双重检查user(User)redisTemplate.opsForValue().get(key);if(user!null)returnuser;useruserMapper.selectById(id);if(user!null){redisTemplate.opsForValue().set(key,user,3600,TimeUnit.SECONDS);}else{redisTemplate.opsForValue().set(key,,60,TimeUnit.SECONDS);}returnuser;}finally{redisTemplate.delete(lockKey);// 释放锁}}else{// 未获取锁短暂等待后重试try{Thread.sleep(50);returngetUserWithMutex(id);}catch(InterruptedExceptione){Thread.currentThread().interrupt();returnnull;}}}✅ 关键SET key value NX EX实现原子锁必须设超时防死锁。️ 附加多级缓存本地 RedisprivatefinalCacheLong,UserlocalCacheCaffeine.newBuilder().maximumSize(10_000).expireAfterWrite(10,TimeUnit.MINUTES).build();publicUsergetUserMultiLevel(Longid){// 1. 本地缓存UseruserlocalCache.getIfPresent(id);if(user!null!.equals(user))returnuser;// 2. RedisStringredisKeyuser:id;user(User)redisTemplate.opsForValue().get(redisKey);if(user!null){localCache.put(id,user);returnuser;}// 3. DBuseruserMapper.selectById(id);if(user!null){redisTemplate.opsForValue().set(redisKey,user,3600newRandom().nextInt(300),SECONDS);localCache.put(id,user);}else{redisTemplate.opsForValue().set(redisKey,,60,SECONDS);localCache.put(id,newUser());// 空对象标记}returnuser;}✅ 最佳实践总结问题推荐方案Java 实现要点缓存模型Cache Aside先 update DB → delete cache缓存穿透空值缓存 布隆过滤器Guava BloomFilter单机或 RedisBloom缓存雪崩随机 TTL / 逻辑过期new Random().nextInt()LogicalCache缓存击穿互斥锁setIfAbsent(..., Duration) 双重检查高可用多级缓存Caffeine Redis核心思想缓存不是银弹没有 100% 一致性。所有方案都是在一致性、可用性、性能之间做权衡。根据业务容忍度选择合适策略才是工程之道。作者不会写程序的未来程序员首发于 CSDN版权声明本文为原创文章转载请注明出处。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

阿里云 建网站攻略房地产网站方案

第一章:如何让AI自动写文档?Open-AutoGLM部署全流程深度解析 在自动化内容生成需求日益增长的今天,Open-AutoGLM 作为一款开源的智能文档生成框架,凭借其强大的自然语言理解与生成能力,成为企业级文档自动化的重要工具…

张小明 2026/1/5 22:40:18 网站建设

seo网站优化平台莱阳建设局网站

随着互联网使用日益普及,用户在浏览器地址栏中手动输入网址的行为看似简单,却正悄然演变为一场高风险操作。一项由全球网络安全公司Infoblox最新发布的研究报告揭示了一个令人震惊的事实:如今,超过90%的“停放域名”(p…

张小明 2026/1/5 22:42:26 网站建设

怎么进行网站关键词优化nike diy定制网站

Apollo配置中心性能优化终极实战指南:万级连接下的稳定性突破 【免费下载链接】apollo 项目地址: https://gitcode.com/gh_mirrors/ap/apollo 在分布式系统架构中,配置中心承载着应用配置的统一管理重任。当客户端节点从几千扩展到上万级别时&am…

张小明 2026/1/5 22:41:14 网站建设

国内适合个人做外贸的网站有哪些旅游类网站建设

EmotiVoice能否支持古诗词韵律朗读?平仄处理测试 在智能语音技术日益渗透日常生活的今天,我们已经习惯了导航中的温柔提示、有声书里的娓娓道来。但当面对“明月松间照,清泉石上流”这样的诗句时,机器能否读出其中的节奏与意境&am…

张小明 2026/1/5 22:40:19 网站建设

网站建设都动漫制作专业专升本考什么专业

Vue-Excel-Editor是一款专为Vue 2设计的开源表格编辑插件,它能在网页中完美复刻Excel的交互体验。无论你是需要开发数据录入系统、后台管理平台还是在线协作工具,这个插件都能让你用最少的代码实现最强大的功能。它支持实时双向数据绑定、智能过滤排序、…

张小明 2026/1/5 22:40:24 网站建设

上海市中学生典型事例网站品牌高端网站建设

第一章:Agent文档维护的现状与挑战在现代分布式系统和自动化运维场景中,Agent作为部署在终端节点上的核心组件,承担着数据采集、状态上报、指令执行等关键职责。然而,随着Agent功能不断扩展,其配套文档的维护却面临严峻…

张小明 2026/1/5 22:40:24 网站建设