网站外链怎么发高级wordpress搜索引擎

张小明 2026/1/13 16:19:55
网站外链怎么发,高级wordpress搜索引擎,短网址网站,下载app前言 今天的内容主要是访问量提升对数据库访问性能影响问题的解决 —— 数据缓存。其中spring cache框架提供底层redis的实现。 缓存菜品 缓存套餐 添加购物车 查看购物车 清空购物车 《苍穹外卖day06》#xff1a;学生党学习笔记——黑马程序员Java项目实战《苍…前言今天的内容主要是访问量提升对数据库访问性能影响问题的解决 ——数据缓存。其中spring cache框架提供底层redis的实现。缓存菜品缓存套餐添加购物车查看购物车清空购物车《苍穹外卖day06》学生党学习笔记——黑马程序员Java项目实战《苍穹外卖》——Day06 HttpClient微信登录-CSDN博客视频学习链接黑马程序员Java项目实战《苍穹外卖》最适合新手的SpringBootSSM的企业级Java项目实战_哔哩哔哩_bilibili资料网盘链接1、黑马程序员Java项目《苍穹外卖》企业级开发实战_免费高速下载|百度网盘-分享无限制本人项目远程仓库sky-take-out: 黑马程序员Java项目实战《苍穹外卖》最适合新手的SpringBootSSM的企业级Java项目实战功能实现效果图缓存菜品问题说明用户端小程序展示的菜品数据都是通过查询数据库获得如果用户端访问量比较大数据库访问压力随之增大。结果系统响应慢、用户体验差实现思路通过Redis来缓存菜品数据减少数据库查询操作。在查询数据库前根据内存中是否缓存数据判断是否访问数据库从而减少数据库压力。缓存逻辑分析- 每个分类下的菜品保存一份缓存数据- 数据库中菜品数据有变更时清理缓存数据代码开发修改用户端接口DishController 的 list方法加入缓存处理逻辑Autowired private RedisTemplate redisTemplate; /** * 根据分类id查询菜品 * * param categoryId * return */ GetMapping(/list) ApiOperation(根据分类id查询菜品) public ResultListDishVO list(Long categoryId) { //构造redis中的key规则dish_分类id String key dish_ categoryId; //查询redis中是否存在菜品数据 ListDishVO list (ListDishVO) redisTemplate.opsForValue().get(key); if(list ! null list.size() 0){ //如果存在直接返回无须查询数据库 return Result.success(list); } //////////////////////////////////////////////////////// Dish dish new Dish(); dish.setCategoryId(categoryId); dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品 //如果不存在查询数据库将查询到的数据放入redis中 list dishService.listWithFlavor(dish); //////////////////////////////////////////////////////// redisTemplate.opsForValue().set(key, list); return Result.success(list); }为了保证数据库和Redis中的数据保持一致修改管理端接口 DishController的相关方法加入清理缓存逻辑。需要改造的方法- 新增菜品- 修改菜品- 批量删除菜品- 起售、停售菜品抽取清理缓存的方法在管理端DishController中添加注意java中操作redis删除key的delete方法不能用*匹配所以需要先用keys方法匹配要删除的key再删除Autowired private RedisTemplate redisTemplate; /** * 清理缓存数据 * param pattern */ private void cleanCache(String pattern){ Set keys redisTemplate.keys(pattern); redisTemplate.delete(keys); }调用清理缓存的方法保证数据一致性/** * 新增菜品 * * param dishDTO * return */ PostMapping ApiOperation(新增菜品) public Result save(RequestBody DishDTO dishDTO) { log.info(新增菜品{}, dishDTO); dishService.saveWithFlavor(dishDTO); //清理缓存数据 String key dish_ dishDTO.getCategoryId(); cleanCache(key); return Result.success(); } /** * 菜品批量删除 * * param ids * return */ DeleteMapping ApiOperation(菜品批量删除) public Result delete(RequestParam ListLong ids) { log.info(菜品批量删除{}, ids); dishService.deleteBatch(ids); //将所有的菜品缓存数据清理掉所有以dish_开头的key cleanCache(dish_*); return Result.success(); } /** * 修改菜品 * * param dishDTO * return */ PutMapping ApiOperation(修改菜品) public Result update(RequestBody DishDTO dishDTO) { log.info(修改菜品{}, dishDTO); dishService.updateWithFlavor(dishDTO); //将所有的菜品缓存数据清理掉所有以dish_开头的key cleanCache(dish_*); return Result.success(); } /** * 菜品起售停售 * * param status * param id * return */ PostMapping(/status/{status}) ApiOperation(菜品起售停售) public ResultString startOrStop(PathVariable Integer status, Long id) { dishService.startOrStop(status, id); //将所有的菜品缓存数据清理掉所有以dish_开头的key cleanCache(dish_*); return Result.success(); }缓存套餐Spring Cache介绍Spring Cache 是一个框架实现了基于注解的缓存功能只需要简单地加一个注解就能实现缓存功能。Spring Cache 提供了一层抽象底层可以切换不同的缓存实现例如- EHCache- Caffeine-Redis(常用)!-- 别忘了redis坐标哦~ -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-cache/artifactId version2.7.3/version /dependency常用注解在SpringCache中提供了很多缓存操作的注解常见的是以下的几个注解说明EnableCaching开启缓存注解功能通常加在启动类上Cacheable在方法执行前先查询缓存中是否有数据如果有数据则直接返回缓存数据如果没有缓存数据调用方法并将方法返回值放到缓存中CachePut将方法的返回值放到缓存中CacheEvict将一条或多条数据从缓存中删除在spring boot项目中使用缓存技术只需在项目中导入相关缓存技术的依赖包并在启动类上使用EnableCaching开启缓存支持即可。例如使用Redis作为缓存技术只需要导入Spring data Redis的maven坐标即可。实现思路实现步骤1). 导入Spring Cache和Redis相关maven坐标项目已导入2). 在启动类上加入EnableCaching注解开启缓存注解功能3). 在用户端接口SetmealController的 list 方法上加入Cacheable注解4). 在管理端接口SetmealController的 save、delete、update、startOrStop等数据库增删改方法上加入CacheEvict注解代码开发在用户端接口SetmealController的list方法上加入Cacheable注解cacheNameskey前缀名 key动态生成支持spel/** * 条件查询 * * param categoryId * return */ GetMapping(/list) ApiOperation(根据分类id查询套餐) Cacheable(cacheNames setmealCache,key #categoryId) //key: setmealCache::100 public ResultListSetmeal list(Long categoryId) { Setmeal setmeal new Setmeal(); setmeal.setCategoryId(categoryId); setmeal.setStatus(StatusConstant.ENABLE); ListSetmeal list setmealService.list(setmeal); return Result.success(list); }在管理端接口SetmealController的 save、delete、update、startOrStop等方法上加入CacheEvict注解/** * 新增套餐 * * param setmealDTO * return */ PostMapping ApiOperation(新增套餐) CacheEvict(cacheNames setmealCache,key #setmealDTO.categoryId)//key: setmealCache::100 public Result save(RequestBody SetmealDTO setmealDTO) { setmealService.saveWithDish(setmealDTO); return Result.success(); } /** * 批量删除套餐 * * param ids * return */ DeleteMapping ApiOperation(批量删除套餐) CacheEvict(cacheNames setmealCache,allEntries true) public Result delete(RequestParam ListLong ids) { setmealService.deleteBatch(ids); return Result.success(); } /** * 修改套餐 * * param setmealDTO * return */ PutMapping ApiOperation(修改套餐) CacheEvict(cacheNames setmealCache,allEntries true) public Result update(RequestBody SetmealDTO setmealDTO) { setmealService.update(setmealDTO); return Result.success(); } /** * 套餐起售停售 * * param status * param id * return */ PostMapping(/status/{status}) ApiOperation(套餐起售停售) CacheEvict(cacheNames setmealCache,allEntries true) public Result startOrStop(PathVariable Integer status, Long id) { setmealService.startOrStop(status, id); return Result.success(); }添加购物车需求分析和设计产品原型用户可以将菜品或者套餐添加到购物车。对于菜品来说如果设置了口味信息则需要选择规格后才能加入购物车;对于套餐来说可以直接点击将当前套餐加入购物车。在购物车中可以修改菜品和套餐的数量也可以清空购物车。接口设计说明添加购物车时有可能添加菜品也有可能添加套餐。故传入参数要么是菜品id要么是套餐id。代码开发//Controller层 /** * 购物车 */ RestController RequestMapping(/user/shoppingCart) Slf4j Api(tags C端-购物车接口) public class ShoppingCartController { Autowired private ShoppingCartService shoppingCartService; /** * 添加购物车 * param shoppingCartDTO * return */ PostMapping(/add) ApiOperation(添加购物车) public ResultString add(RequestBody ShoppingCartDTO shoppingCartDTO){ log.info(添加购物车{}, shoppingCartDTO); shoppingCartService.addShoppingCart(shoppingCartDTO); return Result.success(); } } //Service public interface ShoppingCartService { /** * 添加购物车 * param shoppingCartDTO */ void addShoppingCart(ShoppingCartDTO shoppingCartDTO); } //Service实现类 Service public class ShoppingCartServiceImpl implements ShoppingCartService { Autowired private ShoppingCartMapper shoppingCartMapper; Autowired private DishMapper dishMapper; Autowired private SetmealMapper setmealMapper; /** * 添加购物车 * * param shoppingCartDTO */ public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) { ShoppingCart shoppingCart new ShoppingCart(); BeanUtils.copyProperties(shoppingCartDTO, shoppingCart); //只能查询自己的购物车数据 shoppingCart.setUserId(BaseContext.getCurrentId()); //判断当前商品是否在购物车中 ListShoppingCart shoppingCartList shoppingCartMapper.list(shoppingCart); if (shoppingCartList ! null shoppingCartList.size() 1) { //如果已经存在就更新数量数量加1 shoppingCart shoppingCartList.get(0); shoppingCart.setNumber(shoppingCart.getNumber() 1); shoppingCartMapper.updateNumberById(shoppingCart); } else { //如果不存在插入数据数量就是1 //判断当前添加到购物车的是菜品还是套餐为购物车其余字段赋值 Long dishId shoppingCartDTO.getDishId(); if (dishId ! null) { //添加到购物车的是菜品 Dish dish dishMapper.getById(dishId); shoppingCart.setName(dish.getName()); shoppingCart.setImage(dish.getImage()); shoppingCart.setAmount(dish.getPrice()); } else { //添加到购物车的是套餐 Setmeal setmeal setmealMapper.getById(shoppingCartDTO.getSetmealId()); shoppingCart.setName(setmeal.getName()); shoppingCart.setImage(setmeal.getImage()); shoppingCart.setAmount(setmeal.getPrice()); } shoppingCart.setNumber(1); shoppingCart.setCreateTime(LocalDateTime.now()); shoppingCartMapper.insert(shoppingCart); } } } //Mapper Mapper public interface ShoppingCartMapper { /** * 条件查询 * * param shoppingCart * return */ ListShoppingCart list(ShoppingCart shoppingCart); /** * 更新商品数量 * * param shoppingCart */ Update(update shopping_cart set number #{number} where id #{id}) void updateNumberById(ShoppingCart shoppingCart); /** * 插入购物车数据 * * param shoppingCart */ Insert(insert into shopping_cart (name, user_id, dish_id, setmeal_id, dish_flavor, number, amount, image, create_time) values (#{name},#{userId},#{dishId},#{setmealId},#{dishFlavor},#{number},#{amount},#{image},#{createTime})) void insert(ShoppingCart shoppingCart); }mapper namespacecom.sky.mapper.ShoppingCartMapper select idlist parameterTypeShoppingCart resultTypeShoppingCart select * from shopping_cart where if testuserId ! null and user_id #{userId} /if if testdishId ! null and dish_id #{dishId} /if if testsetmealId ! null and setmeal_id #{setmealId} /if if testdishFlavor ! null and dish_flavor #{dishFlavor} /if /where order by create_time desc /select /mapper查看购物车需求分析和设计产品原型当用户添加完菜品和套餐后可进入到购物车中查看购物中的菜品和套餐。接口设计代码开发/** Controller * 查看购物车 * return */ GetMapping(/list) ApiOperation(查看购物车) public ResultListShoppingCart list(){ return Result.success(shoppingCartService.showShoppingCart()); } /** service * 查看购物车 * return */ ListShoppingCart showShoppingCart(); /** service实现类 * 查看购物车 * return */ public ListShoppingCart showShoppingCart() { return shoppingCartMapper.list(ShoppingCart. builder(). userId(BaseContext.getCurrentId()). build()); }清空购物车当点击清空按钮时会把购物车中的数据全部清空。接口设计代码开发/** Controller * 清空购物车商品 * return */ DeleteMapping(/clean) ApiOperation(清空购物车商品) public ResultString clean(){ shoppingCartService.cleanShoppingCart(); return Result.success(); } /** Service * 清空购物车商品 */ void cleanShoppingCart(); /** service实现类 * 清空购物车商品 */ public void cleanShoppingCart() { shoppingCartMapper.deleteByUserId(BaseContext.getCurrentId()); } /** mapper * 根据用户id删除购物车数据 * * param userId */ Delete(delete from shopping_cart where user_id #{userId}) void deleteByUserId(Long userId);
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

泰安网站建设工作室建设工程合同司法解释2021

第一章:Dify多模态数据处理优化概述Dify 作为新一代低代码 AI 应用开发平台,支持文本、图像、音频和结构化数据的统一处理。其核心优势在于对多模态数据流的高效调度与语义融合能力。通过引入动态数据管道机制,Dify 能够自动识别输入数据类型…

张小明 2026/1/10 8:22:26 网站建设

做网站考什么赚钱百度手机助手最新版下载

题目简介 在高校迎新工作规模化、智能化需求升级的背景下,传统迎新存在 “流程繁琐、信息核验慢、数据统计滞后” 的痛点,基于 SpringBoot 构建的高校迎新管理系统,适配学校迎新办、各院系、新生及家长等多角色,实现迎新全流程&am…

张小明 2026/1/10 8:22:27 网站建设

苏州外贸网站网站建设的多吗

我发现公司的网关项目里有很多的轮子,几乎每个人接手这个项目开发,都会自定义过滤器,导致有非常非常多的过滤器,修改其中一个,指不定就会影响其他的人功能,非常的恼火。其实在 Spring Cloud Gateway 本身内…

张小明 2026/1/10 8:22:27 网站建设

英语作文网站海南专业做网站的公司

前言 在 Java 后端开发中,数据持久层是连接业务逻辑与数据库的核心桥梁。MySQL 作为开源关系型数据库的标杆,凭借稳定、高效、易用的特性成为主流选择;MyBatis 作为半 ORM 框架,通过 XML / 注解灵活映射 SQL 与 Java 对象&#x…

张小明 2026/1/10 8:22:28 网站建设

没备案的网站可以做淘客uniapp开源商城源码

Rizin是一款功能强大的UNIX-like逆向工程框架和命令行工具集,专为二进制分析、反汇编和调试设计。对于安全研究人员、软件开发者以及逆向工程爱好者而言,Rizin提供了完整的工具链,让复杂的二进制分析变得简单高效。 【免费下载链接】rizin UN…

张小明 2026/1/12 15:28:51 网站建设

企业型商务网站制作做法一般用网站服务器

Jellyfin Android TV客户端重复播放功能完整修复指南 【免费下载链接】jellyfin-androidtv Android TV Client for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-androidtv Jellyfin作为一款优秀的开源媒体服务器,其Android TV客户端为用…

张小明 2026/1/11 9:35:34 网站建设