目录十六、缓存菜品1. 问题说明2. 实现思路3. 代码开发3.1 缓存菜品数据3.2 清理缓存数据4. 功能测试十七、缓存套餐1. Spring Cache2. 实现思路3. 代码开发4. 功能测试十八、添加购物车1. 需求分析和设计2. 代码开发3. 功能测试十九、查看购物车1. 需求分析和设计2. 代码开发3. 功能测试二十、清空购物车1. 需求分析和设计2. 代码开发3. 功能测试二十一、小tip十六、缓存菜品1. 问题说明用户端小程序展示的菜品数据都是通过查询数据库获得的 如果用户端访问量比较大 数据库访问压力随之增大 如果对数据库的压力过大 就会造成数据库的查询性能下降→系统响应慢 用户体验差2. 实现思路通过redis来缓存菜品数据 减少数据库查询操作redis是基于内存来保存数据的 数据库是基于磁盘io来保存数据的内存的操作相对于磁盘io的操作 性能要高很多注优先读取缓存数据 缓存数据存在→直接使用 缓存数据不存在→查询数据库 把对应结构载入缓存缓存逻辑分析每个分类下的菜品保存一份缓存数据数据库中菜品数据有变更时 清理缓存数据3. 代码开发3.1 缓存菜品数据注缓存到redis中后 再进行查询 没有sql语句执行3.2 清理缓存数据当数据库中菜品数据发生变更时 需要及时将缓存数据清理掉如果不清理缓存 会造成数据库和redis中数据的不一致修改管理端接口DishController的相关方法 加入清理缓存的逻辑 需要改造的方法新增菜品修改菜品批量删除菜品启售、停售菜品因为修改菜品如果修改分类 那影响的就是两份缓存数据被修改的这个菜品数据和菜品被修改分类的那个分类下的数据、批量删除菜品影响的可能不只一份缓存数据 所以可以直接清理所有缓存数据启售/停售菜品查询菜品id对应的菜品数据插入/查询菜品id对应的菜品数据删除 会额外增加查询操作 所以可以直接清理所有数据4. 功能测试十七、缓存套餐1. Spring CacheSpring Cache是Spring提供的一个缓存框架 实现了基于注解的缓存功能 只需要简单地加一个注解 就能实现缓存功能Spring Cache底层是基于代理技术实现的 一旦加入这个注解 就会为当前类创建一个代理对象 那么在请求类中某个方法之前 其实是先进入那个代理对象 去查询redis 查到则直接返回 没查到就会通过反射调用到真正的目标方法Spring Cache提供了一层抽象 底层可以切换不同的缓存实现 如EHCacheCaffeineRedis导入Maven坐标想使用哪个缓存实现 就导入该缓存的maven坐标注Cacheable既可以将数据放入缓存 也可以在缓存中读取数据CachePut只能将数据放入缓存注流程数据先插入到数据库 插入完成后id就有值了 然后再去操作缓存数据使用Spring Cache缓存数据 key的生成cacheNames::keySpELspring的表达式语言可以动态地计算key#user.id user与形参名相同#result.id result代表方法的返回值 这种写法也叫对象导航 result得到的是一个user对象 user里面还有对应的属性#p0.id p0是指当前方法的第一个形参 标号从0开始 p0也可写作a0#root.args[0].id root.args[0]是指当前方法的第一个形参 标号从0开始注通过:进行分隔 会形成树形结构注Cacheable没有result关键字的使用方法注加上CacheEvict注解 实际是由Spring Cache框架为当前Controller创建代理对象 在代理对象中把key动态地计算出来 计算出来后 通过代理对象来操作redis 最终把缓存数据清理掉cacheNamesuserCache allEntriestrue→删除userCache下的所有缓存数据2. 实现思路导入Spring Cache和Redis相关的maven坐标在启动类上加入EnableCaching注解 开启缓存注解功能在用户端接口SetmealController的list方法上加入Cacheable注解在管理端接口SetmealController的save、delete、update、startOrStop等方法上加入CacheEvict注解3. 代码开发4. 功能测试十八、添加购物车1. 需求分析和设计业务规则如果是相同的商品 只需将商品数量1数据库设计作用暂时存放所选商品的地方选的什么商品每个商品都买了几个不同用户的购物车需要区分开注冗余字段→在其他表中已经拥有 在此表却再设计一遍→使多表查询变为单表查询 可以提高查询速度 冗余字段不能大量使用 且冗余字段应该是相对稳定、不易变化的2. 代码开发添加购物车时 先判断当前商品在购物车中是否已经存在→存在 只需执行修改操作 将商品数量1 不存在 执行插入操作 来插入一条数据不同的用户有自己的购物车→在查询购物车当中商品时 需要把用户id作为条件去查询3. 功能测试十九、查看购物车1. 需求分析和设计2. 代码开发3. 功能测试二十、清空购物车1. 需求分析和设计2. 代码开发3. 功能测试二十一、小tipredis是基于内存来保存数据的 数据库是基于磁盘io来保存数据的优先读取缓存数据 缓存数据存在→直接使用 缓存数据不存在→查询数据库 把对应结构载入缓存Spring Cache底层是基于代理技术实现的 一旦加入这个注解 就会为当前类创建一个代理对象 那么在请求类中某个方法之前 其实是先进入那个代理对象 去查询redis 查到则直接返回 没查到就会通过反射调用到真正的目标方法Cacheable既可以将数据放入缓存 也可以在缓存中读取数据CachePut只能将数据放入缓存Cacheable没有result关键字的使用方法冗余字段→在其他表中已经拥有 在此表却再设计一遍→使多表查询变为单表查询 可以提高查询速度 冗余字段不能大量使用 且冗余字段应该是相对稳定、不易变化的不同的用户有自己的购物车→在查询购物车当中商品时 需要把用户id作为条件去查询