济南想建设网站服装网站建设任务表

张小明 2025/12/29 2:09:17
济南想建设网站,服装网站建设任务表,网站备案内容,西安千叶网站建设总结#xff1a;本文系统介绍了Redis缓存的原理、应用场景及常见问题的解决方案。缓存通过数据交换缓冲区提高读写效率#xff0c;降低后端负载#xff0c;但会带来数据一致性和运维成本问题。文章详细阐述了缓存穿透、雪崩和击穿三大问题的成因及解决方案#xff1a;缓存穿…总结本文系统介绍了Redis缓存的原理、应用场景及常见问题的解决方案。缓存通过数据交换缓冲区提高读写效率降低后端负载但会带来数据一致性和运维成本问题。文章详细阐述了缓存穿透、雪崩和击穿三大问题的成因及解决方案缓存穿透可通过空对象缓存或布隆过滤器解决缓存雪崩可通过随机TTL和集群部署缓解缓存击穿可采用互斥锁或逻辑过期策略处理。同时文章提供了Java代码示例说明如何实现商户缓存查询和更新操作并比较了不同缓存更新策略的优劣为开发者提供了实用的Redis缓存实践指南。Redis的缓存缓存缓存cache就是数据交换的缓冲区是存贮临时数据的地方读写性能较高。在整个web开发阶段都可以添加缓存多级缓存浏览器缓存访问那些静态资源、应用层tomcat缓存直接在缓存里查到数据返回给前端、数据库缓存mysql会给id创建索引我们可以给索引缓存查询时候就可以在内存里快速检索、CPU缓存、磁盘缓存。缓存的作用降低后端负载提高读写效率降低响应时间缓存的成本数据一致性成本在读取数据时虽然从缓存里面读取很快但要是数据变更会导致数据库的数据还是旧的要解决一致性成本问题就会导致代码复杂度提高很多以后维护成本提高还有为了避免缓存雪崩等保证缓存的高可用缓存往往会搭建成集群模式提高了运维成本。添加Redis商户缓存客户端发起请求先在redis缓存中查找如果未命中则往数据库查找将其写到redis缓存中确保下次查询能在redis缓存中找到如果直接命中则将数据直接返回给客户端。Resource private StringRedisTemplate stringRedisTemplate; Override public Result queryById(Long id){ String key “cache:shop:”id; //1.从redis查询商铺缓存 String shopJson stringRedisTemplate.opsForValue().get(key); //2.判断是否存在 If(StrUtil.isNotBlank(shopJson)){ //3.存在直接返回 Shop shop JSONUtil.toBean(shopJson , Shop.class); return Result.ok(shop); } //4.不存在根据id查询数据库 Shop shop getById(id); //5.不存在返回错误信息 if(shopnull){ return Result.fail(“店铺不存在”); } //6.存在写入redis stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop), timeout:30L , TimeUnit.MINUTES); //7.返回 return Result.ok(shop); }缓存更新策略内存淘汰、超时剔除、主动更新。低一致性需求使用内存淘汰使用Redis自带的内存淘汰机制。高一致性需求使用主动更新并以超时剔除作为兜底方案。主动更新策略有3种最常用的是cache aside pattern由缓存的调用者在更新数据库的同时更新缓存。操作缓存和数据库时需要考虑的3个问题1.删除缓存还是更新缓存删除缓存。更新数据库时删掉让缓存失效查询时再更新缓存。2.如何保证缓存和数据库的操作同时成功或失败单体系统将缓存和数据库操作放在一个事务分布式系统利用TCC等分布式事务方案3.先操作缓存还是数据库不论是先删除缓存再操作数据还是先操作数据库再删除缓存更优都可以而且它们都存在线程安全问题。但是先操作数据库再删除缓存出现线程安全问题的可能性更低因为操作缓存的速度是远远大于操作数据库的假设在查询缓存时可能缓存刚好失效未命中会往数据库查询查询数据库后在将数据写入缓存时另一个线程对数据库进行了更新操作然后删除缓存这时候可能本来查的是旧数据却可能查到新数据然后缓存中写入了更新后的数据但是出现这种线程安全问题概率很低所以先操作数据库再删除缓存出现安全问题更低。虽然这个可能性很低但是还是要解决这个安全问题的需要加上缓存超时时间即可。先更新再删除缓存操作步骤Override Transactional public Result update(Shop shop){ Long id shop.getId(); if(idnull){ return Result.fail(”商铺id不能为空”); } updateById(shop); stringRedisTemplate.delete(keyid); return Result.ok(); }Redis常见缓存问题缓存穿透缓存穿透指客户端请求的数据在缓存和数据库中都不存在的情况这样缓存永远都不会生效这些请求都会打到数据库。那有些人会恶意反复请求不存在的数据导致数据库崩溃常见的缓存穿透两种解决方案1.缓存空对象2.布隆过滤1、缓存空对象redis缓存和数据库都为空时请求到数据库后将null写入缓存。优点实现简单维护方便。缺点1.额外的内存消耗每请求一个就写一个null可以通过设置TTL生存时间来解决。2.可能造成短期的不一致写入null后这时传入一个有效的数据但是TTL还没过期就会导致读到的还是null可以通过设置足够短的TTL来缓解或者缓存修改写入一个数据就覆盖原本数据来解决。2、布隆过滤在客户端和redis之间会有一个布隆过滤器如果请求的数据存在则放行不存在则拒绝布隆过滤器其实算是算法是根据哈希的计算出数据库二进制来判断请求的数据是否存在如果是不存在那么一定不存在如果存在却不一定存在。优点内存占用少没有多余的key。缺点1.实现复杂2.存在误判的可能。所以呢开发过程中一般使用缓存空对象来的解决缓存穿透的问题。然后这两种方案其实是属于被动方案也就是已经穿透你了然后来想办法弥补。事实上呢不止这两种方案还可以采取主动方案来解决1.可以增加id的复杂度来避免被猜测id规律加强做好数据的基础格式校验2.加强用户权限校验3.做好热点参数的限流。缓存雪崩缓存雪崩指在同一时段大量的缓存key同时失效或者redis服务端宕机导致大量请求到达数据库带来巨大压力。缓存雪崩针对key同时失效的解决方案给不同的key的TTL添加随机值。缓存雪崩针对redis宕机的解决方案1.利用redis集群提高服务的可用性2.给缓存业务添加降级限流策略比如当整个服务全崩了请求是服务失败而不是全部压到数据库3.给业务添加多级缓存可以给nginx添加缓存、jvm建立缓存缓存击穿缓存击穿也叫热点key就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了无数的请求访问会在瞬间给数据库带来巨大压力。缓存击穿的解决方案1.互斥锁 2.逻辑过期1、互斥锁一个线程查询缓存未命中然后获取互斥锁来锁住这时如果别的线程也要来查询就会获取锁失败从而查询失败可能需要休眠过一会重试只有当拥有这个锁的线程在数据库查询完写入缓存后才会释放锁然后别的线程才可以访问缓存。互斥锁的优点1.没有额外的内存消耗、2.保持一致性、3.实现简单互斥锁的缺点1.线程需要等待性能受影响、2.可能有死锁的风险互斥锁是需要自己定义的锁它不同于synchronized Lock同步锁同步锁是按规定好的执行顺序执行比如要执行CA和B必须要先执行完才能执行C。而互斥锁是如A访问了数据别的就不能访问数据必须等A访问完释放锁。简单说就是互斥是通过竞争资源彼此不知道对方的存在是乱序的而同步锁是协调多个进程合作完成任务彼此知道对方的存在是有序的。互斥锁的实现获取锁使用redis的String类型的setnx命令就可以了原理是一样的比如setnx lock 1因为setnx就是当它设置的lock已经存在了值1是不能改变成别的值只有当它的值删了才能加进来也就是释放了锁才能进来新的线程。所以自定义互斥锁可以用setnx。为了严谨还要给锁设置有效期要是正常释放锁那就正常要是之间服务出问题没法正常释放如果没有有效期那锁就一直锁住是有问题的。2、逻辑过期一个线程查询缓存发现逻辑时间过期了然后获取互斥锁来锁住为了避免等待锁的过程太久会开启新的线程由这个线程来查询数据库重建缓存数据然后写入缓存重置过期时间释放锁。那么原本的那个线程做什么呢它就直接返回旧的数据。那么也就是说这个新的线程锁住了在更新数据这时要是再来一个线程来访问获取锁失败它就知道哎这个线程在更新数据那我就佛系一点就先用查到的旧数据。逻辑过期的优点1.线程无需等待、性能好逻辑过期的缺点1.不保证一致性、2.有额外的内存消耗、3.实现复杂逻辑过期的实现设置逻辑过期的实现方法假设缓存命中然后才能判断缓存是否过期将json反序列化为对象判断是否过期未过期直接返回对象过期需要缓存重建获取互斥锁判断是否获取锁成功如果成功开启独立线程实现缓存重建释放锁不论成功或失败都是返回过期的商铺信息。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

正规的网站建设企业网站制作上海工商局企业查询

40亿参数撬动工业级AI:Qwen3-VL-4B如何重塑多模态落地格局 【免费下载链接】Qwen3-VL-4B-Thinking 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-VL-4B-Thinking 导语 阿里通义千问团队2025年10月推出的Qwen3-VL-4B-Thinking模型,以…

张小明 2025/12/25 3:09:12 网站建设

新楼盘网站模板现在哪些做进口商品的电商网站

文章目录一、异常处理机制的核心架构二、异常处理五大核心机制1. 异常捕获与传递链2. 资源自动管理(try-with-resources)3. 多异常捕获(Java 7)4. 自定义异常体系5. 异常日志最佳实践三、项目实战中的异常处理模式1. 分层异常处理…

张小明 2025/12/25 3:08:11 网站建设

wordpress开启多站点九一赣州人才网招聘

Winston Taylor将秉承共同的愿景与文化,携手打造在重大诉讼、关键交易、战略性知识产权及私人财富领域具备全球影响力的跨大西洋法律服务平台 Winston & Strawn与Taylor Wessing旗下以英国为主导的业务今日宣布,双方拟推进合并,并将以全新…

张小明 2025/12/25 3:06:06 网站建设

网站前台功能介绍wordpress手机全部显示图片

PyBlueZ快速上手指南:5分钟掌握Python蓝牙编程核心技术 【免费下载链接】pybluez Bluetooth Python extension module 项目地址: https://gitcode.com/gh_mirrors/py/pybluez PyBlueZ作为Python生态中功能最完整的蓝牙编程扩展模块,为开发者提供了…

张小明 2025/12/25 3:05:04 网站建设

网站建设后的团队总结四会市网站建设

Java 大视界 -- Java 大数据机器学习模型在舆情分析中的情感倾向判断与话题追踪 引言:正文:一、舆情分析的现状与挑战1.1 舆情分析的重要性1.2 面临的挑战 二、Java 大数据机器学习模型在舆情分析中的技术支撑2.1 大数据存储与管理2.2 机器学习算法基础 …

张小明 2025/12/25 3:04:02 网站建设