盐城做网站网站建设维护概括总结

张小明 2025/12/30 3:07:22
盐城做网站,网站建设维护概括总结,产品开发流程表,微信小程序制作工具平台#x1f4da; 目录#xff08;点击跳转对应章节#xff09; 一、基础线程优化#xff1a;不使用注解的手动缓存实现 1.1 传统MySQL查询性能瓶颈分析1.2 手动Redis缓存实现方式1.3 线程安全问题及解决方案 二、SpringBoot Cache线程优化注解详解 2.1 Spring Cache核心注解介… 目录点击跳转对应章节一、基础线程优化不使用注解的手动缓存实现1.1 传统MySQL查询性能瓶颈分析1.2 手动Redis缓存实现方式1.3 线程安全问题及解决方案二、SpringBoot Cache线程优化注解详解2.1 Spring Cache核心注解介绍2.2 Spring Cache注解使用三、苍穹外卖项目中的实际应用案例3.1 项目中的实际使用3.2 ai给出的额外配置优化3.3 注意事项四、总结一、基础线程优化不使用注解的手动缓存实现1.1 传统MySQL查询性能瓶颈分析1.1.1直接数据库访问的性能问题数据库查询性能问题以下是苍穹外卖小程序端进行菜品套餐类查询时访问数据库的操作情景缓存引入的必要性以上的数据库操作还只是单人进行数据库查询的情况当数据库访问量增大时数据库查询性能问题就会成为问题而缓存引入则是为了解决这个问题。1.2 手动Redis缓存实现方式缓存查询逻辑手动编码AutowiredprivateRedisTemplateredisTemplate;/** * 根据分类id查询菜品 * * param categoryId * return */GetMapping(/list)ApiOperation(根据分类id查询菜品)publicResultListDishVOlist(LongcategoryId){//构造redis中的key规则dish_分类idStringkeydish_categoryId;//查询redis中是否存在菜品数据ListDishVOlist(ListDishVO)redisTemplate.opsForValue().get(key);if(list!nulllist.size()0){//如果存在直接返回无须查询数据库returnResult.success(list);}DishdishnewDish();dish.setCategoryId(categoryId);dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品//如果不存在查询数据库将查询到的数据放入redis中listdishService.listWithFlavor(dish);redisTemplate.opsForValue().set(key,list);returnResult.success(list);}以上关于redis的java操作可以去看这篇文章有详细讲解https://blog.csdn.net/yyzytx5201314/article/details/155777981?spm1001.2014.3001.5502经过优化后再次进行原来的查询操作时当进行数据库查询时数据库会进行查询并返回查询结果返回结果会进行缓存下次再进行相同的查询操作时会直接从缓存中获取数据从而大大提高查询效率1.3 线程安全问题及解决方案出现的问题当mysql数据库中的数据改变时而redis中缓存的数据未得到改变就会出现数据不一致的问题因此我们要进行手动添加处理的方法这是进行的测试解决方法//在要解决缓存不一致的地方加入如上的操作AutowiredprivateRedisTemplateredisTemplate;/** * 清理缓存数据 * param pattern */privatevoidcleanCache(Stringpattern){SetkeysredisTemplate.keys(pattern);redisTemplate.delete(keys);}新增菜品优化/** * 新增菜品 * * param dishDTO * return */PostMappingOperation(summary新增菜品)publicResultsave(RequestBodyDishDTOdishDTO){log.info(新增菜品{},dishDTO);dishService.saveWithFlavor(dishDTO);//清理缓存数据Stringkeydish_dishDTO.getCategoryId();cleanCache(key);returnResult.success();}菜品批量删除优化/** * 批量删除菜品 * * param ids * return */DeleteMappingOperation(summary批量删除菜品)publicResultdelete(RequestParamListLongids){log.info(批量删除菜品{},ids);dishService.deleteBatch(ids);//清理缓存数据cleanCache(dish_*);returnResult.success();}修改菜品优化/** * 修改菜品 * * param dishDTO * return */PutMappingApiOperation(修改菜品)publicResultupdate(RequestBodyDishDTOdishDTO){log.info(修改菜品{},dishDTO);dishService.updateWithFlavor(dishDTO);//清理缓存数据cleanCache(dish_*);returnResult.success();}菜品起售停售优化/** * 菜品起售停售 * * param status * param id * return */PostMapping(/status/{status})ApiOperation(菜品起售停售)publicResultStringstartOrStop(PathVariableIntegerstatus,Longid){dishService.startOrStop(status,id);//清理缓存数据cleanCache(dish_*);returnResult.success();}二、SpringBoot Cache线程优化注解详解2.1 Spring Cache核心注解介绍Cacheable缓存查询结果CachePut更新缓存CacheEvict清除缓存Caching组合多个缓存操作2.2 Spring Cache注解使用在启动类中添加EnableCaching注解开启缓存注解功能packagecom.itheima;importlombok.extern.slf4j.Slf4j;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cache.annotation.EnableCaching;Slf4jSpringBootApplicationEnableCaching//开启缓存注解功能publicclassCacheDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(CacheDemoApplication.class,args);log.info(项目启动成功...);}}Cacheable注解/** * Cacheable在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据 * 调用方法并将方法返回值放到缓存中 * value缓存的名称每个缓存名称下面可以有多个key * key缓存的key */GetMappingCacheable(cacheNamesuserCache,key#id)publicUsergetById(Longid){UseruseruserMapper.getById(id);returnuser;}key的扩展可以使用SpEL表达式来动态生成key例如key“#user.id”表示根据user对象的id属性作为keyCachePut注解/** * CachePut在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据 * 调用方法并将方法返回值放到缓存中 * value缓存的名称每个缓存名称下面可以有多个key * key缓存的key */PutMappingCachePut(cacheNamesuserCache,key#user.id)publicUserupdate(RequestBodyUseruser){userMapper.update(user);returnuser;}CacheEvict注解/** * CacheEvict在方法执行前spring先查看缓存中是否有数据如果有数据则直接返回缓存数据若没有数据 * 调用方法并将方法返回值放到缓存中 * value缓存的名称每个缓存名称下面可以有多个key * key缓存的key */DeleteMappingCacheEvict(cacheNamesuserCache,key#id)publicResultdelete(Longid){userMapper.delete(id);returnResult.success();}三、苍穹外卖项目中的实际应用案例3.1 项目中的实际使用service层的具体缓存应用场景// DishServiceImpl.java - 菜品业务层实现类节选关键缓存相关代码ServicepublicclassDishServiceImplimplementsDishService{// ... 其他代码 .../** * 新增菜品和对应的口味 * * param dishDTO */TransactionalCacheEvict(valuedishCache,key#dishDTO.categoryId)OverridepublicvoidsaveWithFlavor(DishDTOdishDTO){// ... 实现代码 ...}/** * 菜品批量删除 * * param ids */TransactionalCacheEvict(valuedishCache,allEntriestrue)OverridepublicvoiddeleteBatch(ListLongids){// ... 实现代码 ...}/** * 根据id修改菜品的基本信息和对应的口味信息 * param dishDTO */TransactionalCacheEvict(valuedishCache,allEntriestrue)OverridepublicvoidupdateWithFlavor(DishDTOdishDTO){// ... 实现代码 ...}/** * 菜品的起售和停售关联套餐进行操作 * param status * param id */OverrideCacheEvict(valuedishCache,allEntriestrue)publicvoidstartOrStop(Integerstatus,Longid){// ... 实现代码 ...}/** * 条件查询菜品和口味 * param dish * return */OverrideCacheable(valuedishCache,key#dish.categoryId)publicListDishVOlistWithFlavor(Dishdish){// ... 实现代码 ...}// ... 其他代码 ...}3.2 ai给出的额外配置优化// RedisConfiguration.java - Redis缓存配置类ConfigurationSlf4jpublicclassRedisConfiguration{// ... 其他代码 ...BeanpublicCacheManagercacheManager(RedisConnectionFactoryredisConnectionFactory){RedisCacheConfigurationcacheConfigurationRedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1))// 设置缓存过期时间为1小时.disableCachingNullValues();// 不缓存空值returnRedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build();}}3.3 注意事项推荐将缓存操作加在到service层而不是controller层黑马的课中写在了controller层但是w 我经过查询发现service层更合适这样service层与dao层之间的数据交互更清晰controller层只负责接收请求与返回响应使每个层职责更单一更清晰更易维护。也更符合单一职责原则。四、总结在苍穹外卖项目中通过引入 Redis 缓存显著优化了高频菜品查询的性能从手动编码的“先查缓存、后查数据库、更新时主动清理”模式到更优雅的 Spring Cache 注解方式Cacheable CacheEvict有效解决了数据库压力大和缓存一致性问题。核心收益查询效率大幅提升。数据库负载降低系统并发能力增强。代码更简洁、可维护性更强推荐 Service 层使用注解。最佳实践建议优先使用 Spring Cache 注解实现声明式缓存。对于精细化控制场景可结合手动 Redis 操作。始终关注缓存一致性更新/删除操作及时清除相关缓存并合理设置过期时间。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

6黄页网站建设seo sem

2025代码托管平台深度评测:本土化与全球化解决方案全景解析 本土化服务的标杆:Gitee如何重塑国内开发体验 在数字化转型加速的2025年,代码托管平台的选择直接关系到开发团队的协作效率与合规安全。作为国内领先的一站式代码托管服务&#xff…

张小明 2025/12/26 5:22:04 网站建设

php用什么做网站服务器吗小程序商城怎么开发

XposedRimetHelper是一款基于Xposed框架开发的钉钉辅助模块,专门用于实现模拟位置功能,让用户在任何地点都能完成钉钉打卡。这款工具理论上支持钉钉4.2.0以上所有版本,为远程办公和灵活考勤提供了全新解决方案。 【免费下载链接】XposedRimet…

张小明 2025/12/26 5:22:05 网站建设

百度上做网站推广网站做好了怎么做后台

河北东方学院本科毕业论文(设计)中期检查报告题目:基于深度学习的农情灾情分析与预测学院:人工智能学院专业:数据科学与大数据技术班级:大数据技术21-2学生姓名:Xx学 号:xx指导教…

张小明 2025/12/26 5:22:08 网站建设

企业公司网站拼多多网站的类型

基于SSM的一站式酒店管理系统设计与实现 一、系统开发背景与核心价值 随着旅游业与商务出行的持续升温,酒店行业迎来规模化发展的同时,也面临着管理效率低、服务流程不规范、客户体验参差不齐等问题。传统酒店管理模式依赖人工记录订单、统计房源、核对账…

张小明 2025/12/26 5:22:09 网站建设

网站服务器租用价格 贴吧手机网站设计报告模板

160亿参数撬动700亿效能:Ling-mini-2.0重新定义轻量级AI推理 【免费下载链接】Ling-mini-2.0 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/Ling-mini-2.0 导语 当大模型还在比拼千亿参数时,蚂蚁集团百灵团队开源的Ling-mini-2.0用…

张小明 2025/12/26 5:22:10 网站建设

分析苏宁易购网站内容建设织梦cms 做视频网站

STM32-S369-存取柜光敏灯光消毒取件码二维码语音播报存件手机号录入后台数据4舵机OLED屏按键(无线方式选择)产品功能描述:本系统由STM32F103C8T6单片机核心板、OLED屏、(无线蓝牙/无线WIFI/无线视频监控/联网云平台模块-可选择)、键盘部分、语…

张小明 2025/12/29 19:23:12 网站建设