苍穹外卖5月31日 今日主要实现了微信小程序用户端的一些功能包括缓存菜品缓存套餐新增购物车查看购物车清空购物车。新技术缓存套餐使用了新的注解。一.缓存菜品使用redistemplate对象步骤代码GetMapping(/list) ApiOperation(根据分类id查询菜品) public ResultListDishVO list(Long categoryId) { //构造redis中的key String key dish_categoryId; //查看redis中是否有菜品 ListDishVO list (ListDishVO) redisTemplate.opsForValue().get(key); if(list!nulllist.size()0) { //如果有直接返回 return Result.success(list); } //没有查询数据库将数据保存到redis中 Dish dish new Dish(); dish.setCategoryId(categoryId); dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品 list dishService.listWithFlavor(dish); redisTemplate.opsForValue().set(key,list); return Result.success(list); }解决数据一致性在管理端进行新增修改删除操作时应把缓存中的数据删除。package com.sky.controller.admin; import com.sky.dto.DishDTO; import com.sky.dto.DishPageQueryDTO; import com.sky.entity.Dish; import com.sky.result.PageResult; import com.sky.result.Result; import com.sky.service.DishService; import com.sky.vo.DishVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Set; RestController RequestMapping(/admin/dish) Slf4j public class DishController { Autowired private DishService dishService; Autowired private RedisTemplate redisTemplate; PostMapping public Result save(RequestBody DishDTO dishDTO) { log.info(新增菜品参数{}, dishDTO); dishService.saveWithflavor(dishDTO); String key dish_ dishDTO.getCategoryId(); cleanCache( key); return Result.success(); } GetMapping(/page) public ResultPageResult page(DishPageQueryDTO dishPageQueryDTO) { log.info(分页查询{}, dishPageQueryDTO); PageResult pageResult dishService.pageQuery(dishPageQueryDTO); return Result.success(pageResult); } DeleteMapping public Result deleteById(RequestParam ListLong ids) { log.info(批量删除{}, ids); dishService.delete(ids); String key dish_*; cleanCache(key); return Result.success(); } GetMapping(/{id}) public ResultDishVO getById(PathVariable Long id) { log.info(根据id查询菜品信息{}, id); DishVO dishVO dishService.getByIdWithFlavor(id); return Result.success(dishVO); } PutMapping public Result update(RequestBody DishDTO dishDTO) { log.info(修改菜品信息{},dishDTO); dishService.update(dishDTO); String key dish_*; cleanCache(key); return Result.success(); } /** * 菜品起售停售 * param status * param id * return */ PostMapping(/status/{status}) public ResultString startOrStop(PathVariable Integer status, Long id){ dishService.startOrStop(status,id); String key dish_*; cleanCache(key); return Result.success(); } /** * 根据分类id查询菜品 * param categoryId * return */ GetMapping(/list) public ResultListDish list(Long categoryId){ ListDish list dishService.list(categoryId); return Result.success(list); } private void cleanCache(String pattern) { Set keys redisTemplate.keys(pattern); redisTemplate.delete(keys); } }二.缓存套餐使用注解注解说明EnableCaching开启缓存注解功能通常加在启动类上Cacheable在方法执行前先查询缓存中是否有数据如果有数据则直接返回缓存数据如果没有缓存数据调用方法并将方法返回值放到缓存中CachePut将方法的返回值放到缓存中CacheEvict将一条或多条数据从缓存中删除参数key的多种写法一般使用与函数形参名字一样的作为key如下面代码#setmealDTO.categoryId。也可使用#result.id result为函数返回值。更多用法可查看源码一般使用第一种即可更加清晰。代码PostMapping CacheEvict(cacheNames setmealCache, key #setmealDTO.categoryId) public Result save(RequestBody SetmealDTO setmealDTO) { setmealService.saveWithDish(setmealDTO); return Result.success(); }解决数据不一致性DeleteMapping CacheEvict(cacheNames setmealCache, allEntries true) public Result delete(RequestParam ListLong ids){ setmealService.deleteBatch(ids); return Result.success(); } PutMapping 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}) CacheEvict(cacheNames setmealCache, allEntries true) public Result startOrStop(PathVariable Integer status, Long id) { setmealService.startOrStop(status, id); return Result.success(); }新增购物车查看购物车清空购物车这部分代码见gitee采用规范controller层services层mapper层根据接口文档写出。