深圳网站设计公司招聘农产品信息网站建设方案

张小明 2026/3/2 22:57:50
深圳网站设计公司招聘,农产品信息网站建设方案,建站公司最新报价,网站服务合同范本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进行投诉反馈,一经查实,立即删除!

网站必须做电子认证吗石家庄市建设工程信息网

不确定性量化中的实验设计抽样方法 在不确定性量化领域,抽样方法是至关重要的工具。不同的抽样方法具有各自的特点和适用场景,下面将详细介绍几种常见的抽样方法。 1. 准蒙特卡罗抽样(Quasi - Monte Carlo Sampling,QMCS) 1.1 原理 QMCS 也被称为准随机低差异序列(Qu…

张小明 2025/12/31 3:48:49 网站建设

天津建站公司模板推广公司主要做什么

FaceFusion镜像安装与实战:跨平台AI人脸替换技术深度解析 在短视频、虚拟内容和数字人技术迅猛发展的今天,一个普通创作者是否也能轻松实现电影级的“换脸”特效?答案是肯定的——借助 FaceFusion 镜像,即便是没有深度学习背景的…

张小明 2025/12/31 4:02:58 网站建设

重庆网站建设优化牡丹江免费信息网

当人工智能视频生成技术从实验室走向大众应用时,一个关键瓶颈逐渐显现:如何在保持专业级画质的同时,将创作门槛降至消费级硬件可承受的范围?WAN2.2-14B-Rapid-AllInOne模型的出现,为这一难题提供了创新性解决方案。该模…

张小明 2025/12/31 3:48:52 网站建设

商城网站备案创意网站 案例 下载

大模型微调不再烧钱:Llama-Factory QLoRA 实现单卡训练的工程实践 在今天,一个中小团队想基于大语言模型做点定制化应用——比如给客服系统加个智能问答模块、为医疗报告生成做个专用模型——听起来不难,但真正动手时往往会卡在一个现实问题…

张小明 2025/12/31 3:48:53 网站建设

商务网站建设教程威海哪家网站做的好

你是否也有过这样的经历: 眼看着一只股票涨停,犹豫要不要追。 追进去的,第二天直接闷杀; 没敢追的,却走成了连板妖股,直接翻倍。 到底什么样的涨停板值得打?主力的资金到底更青睐低价股还是高价…

张小明 2026/1/7 16:34:36 网站建设

四川省建设厅网站在线申报共享办公都有哪些公司

安全隐患为何总在沉默中爆发?只因多数管理忘了沟通的本质!英国管理学家威尔德的“始于聆听,终于回答”定理,恰是破解之道。当 AI 智能算法聆听设备隐患数据,当安全管理团队倾听一线心声,听与答的双向闭环便…

张小明 2026/3/2 17:20:59 网站建设