# Sky-Takeaway-Project **Repository Path**: yu-jun-wang/Sky-Takeaway-Project ## Basic Information - **Project Name**: Sky-Takeaway-Project - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-26 - **Last Updated**: 2026-02-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Sky-Takeaway-Project ## 项目简介 本项目是一款仿美团外卖的校园订餐配送平台,基于**Spring Boot**进行开发。管理端可通过后台系统实现对菜品套餐的维护和对订单数据的查看分析,用户端可通过小程序实现浏览、下单和催单功能。 ## 工作内容 - 使用**Spring AOP切面编程**实现功能增强,完成公共字段的自动填充。 - 对于高频访问的店铺状态、菜品等数据,采用**Redis缓存**技术提高并发响应能力。 - 通过**webSocket**实现客户端和服务端的长连接,实现来单提醒和催单功能。 - 采用**SpringTask**实现订单状态的定时管理,超时自动取消订单。 ## 关于项目细节和场景问题的总结 ### 关于 Spring AOP 切面编程的理解 AOP是面向切面编程,将与业务无关,却为业务模块所共同调用的逻辑封装,减少系统的重复代码,降低多个模块之间的耦合度。 **Spring AOP** 是基于**动态代理**的,如果要代理的对象,实现了某个接口,那么 Spring AOP 就会使用 JDK Proxy,去创建代理对象;对于没有实现接口的对象,就无法使用 **JDK Proxy** 去进行代理。此时,Spring AOP 就会使用 Cglib 去生成一个被代理对象的子类来作为代理。 在 **AOP** 中有如下几个概念: - AspectJ:切面,这是一个概念,也是 Join Point、Advice、PointCut的统称 - Join Point:连接点,指的是程序执行过程中的一个点。比如说:方法调用、异常处理等。在 Spring AOP 中,仅仅支持方法级别的连接点 - Advice:通知,也就是我们定义的切面中的横切逻辑,有“Around”,“before”,“after”这三个类型 - PointCut:切点,用于匹配连接点。一个 AspectJ 中包含哪些 Join Point,需要由 PointCut 进行筛选 Spring AOP 主要想**解决什么问题**呢?它的目的是对于**面向对象思维**的一种补充,是一种对于不支持多继承的弥补。除开对象的主要特征(强共性)被抽象为一条继承链路,对于一些“弱共性”,AOP 可以统一对其进行抽象和集中处理。 ### Redis缓存原理,为什么这么快? > 我们需要明确的是: > Redis的**单线程**指的是Redis的网络 IO 以及键值对指令读写是由同一个线程来执行的。对于Redis的持久化、集群数据同步、异步删除等,都是由其他线程执行。 - 纯内存操作,一般是简单的内存存取操作。线程占用时间很少,时间花费主要在IO操作上,所以读取速度很快。 - 采用**单线程**模型:保证了每个操作的原子性,也减少了线程的上下文切换和竞争。 - 使用**IO多路复用模型**:非阻塞IO,使用单线程来轮询描述符,将数据库的开、关、读、写都转换成事件。Redis采用自己实现的事件分离器,效率比较高。 - Redis的数据结构效率很高,对数据操作较为便捷 ### 关于 Redis 的缓存淘汰机制(策略) About envicition 这边策略太多了,主要是要理解两个算法 **LRU**:Least Recently Used **最近最少使用** volatile-lru:从Redis中选取设置过**过期时间**的key中,选取最少使用的进行淘汰 **LFU**:Least Frequently Used **最不经常使用** volatile-lfu:从设置了过期时间的key中,选取某段时间内使用频次最少的键值对清除掉