19k 18 分钟

# 苍穹外卖 - day07 # 课程内容 缓存菜品 缓存套餐 添加购物车 查看购物车 清空购物车 功能实现:缓存商品、购物车 效果图: # 缓存菜品 # 问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 结果: 系统响应慢、用户体验差 # 实现思路 通过 Redis 来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: 每个分类下的菜品保存一份缓存数据 数据库中菜品数据有变更时清理缓存数据 # 代码开发 修改用户端接口 DishController 的 list...
11k 10 分钟

# 前言:从繁琐 XML 到优雅注解的进化之路 还记得那些年我们写过的 XML 配置文件吗?成百上千行的配置,繁琐的标签嵌套,还有那永远记不住的属性名。作为一名 Java 开发者,我深深体会过 XML 配置时代的痛苦。每当项目启动失败,对着堆栈信息逐行排查配置错误时,总会想:难道就没有更优雅的方式吗? Spring 框架的注解驱动开发,就是这个问题的答案。它不仅仅是一种语法糖,更是开发理念的一次重大革新。从 Spring 2.5 开始引入注解支持,到 Spring 3.0 的完善,再到 Spring Boot 的全面注解化,这条路走了十几年,但每一步都值得。 今天,我想和大家分享我对...
20k 18 分钟

# Redis 集群与高可用架构 # 前言 随着业务规模的扩大,单机 Redis 已经无法满足高并发、大数据量的需求。Redis 提供了多种集群和高可用解决方案,包括主从复制、哨兵模式、集群模式等。本文将详细介绍 Redis 的各种架构模式、实现原理以及最佳实践。 # 1. Redis 主从复制 # 1.1 主从复制原理 Redis 主从复制是指将一台 Redis 服务器的数据复制到其他 Redis 服务器。前者称为主节点(Master),后者称为从节点(Slave)。 复制流程: 从节点向主节点发送 SYNC 命令 主节点收到 SYNC 后,执行 BGSAVE 生成 RDB 文件 主节点将...
25k 22 分钟

# 苍穹外卖 - day06 # 课程内容 HttpClient 微信小程序开发 微信登录 导入商品浏览功能代码 功能实现:微信登录、商品浏览 微信登录效果图: 商品浏览效果图: # HttpClient # 介绍 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 HttpClient 作用: 发送 HTTP 请求 接收响应数据 为什么要在 Java 程序中发送 Http 请求?有哪些应用场景呢? HttpClient...
33k 30 分钟

# 前言:从 Servlet 到 Spring MVC 的演进之路 还记得那些年我们写 Servlet 的日子吗?每个请求都要创建一个 Servlet 类,web.xml 中配置繁琐的映射关系,参数获取需要手动转换,异常处理分散在各个地方。我至今还记得第一次接触传统 Java Web 开发时的场景,那是一个简单的用户管理系统,光是处理表单提交就写了上百行代码。 更糟糕的是,随着业务逻辑的复杂化,Servlet 代码变得越来越难以维护。业务逻辑、数据访问、视图渲染全部混在一起,形成了典型的...
15k 13 分钟

# 苍穹外卖 day05 # 课程内容 Redis 入门 Redis 数据类型 Redis 常用命令 在 Java 中操作 Redis 店铺营业状态设置 功能实现:营业状态设置 效果图: 选择营业中,客户可在小程序端下单: 选择打烊中,客户无法在小程序端下单: # Redis 入门 # Redis 简介 Redis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网: https://redis.io 中文网: https://www.redis.net.cn/ key-value...
19k 17 分钟

# IoC、DI 和 AOP 思想 三种思想总结 1)IoC 控制反转,是将程序创建 Bean 的权利反转给第三方; 2)DI 依赖注入,某个完整 Bean 需要依赖于其他 Bean(或属性)的注入; 3)AOP 面向切面编程,用横向抽取方法(属性、对象等)思想,组装成一个功能性切面。 # 面试题:IoC 和 DI 的关系? 首先,先回答 IoC 和 DI 的是什么: IoC: Inversion of Control,控制反转,将 Bean 的创建权由原来程序反转给第三方 DI:Dependency Injection,依赖注入,某个 Bean 的完整创建依赖于其他...
12k 11 分钟

# 新增套餐 # 需求分析和设计 产品原型: 业务规则: 套餐名称唯一 套餐必须属于某个分类 套餐必须包含菜品 名称、分类、价格、图片为必填项 添加菜品窗口需要根据分类类型来展示菜品 新增的套餐默认为停售状态 接口设计(共涉及到 4 个接口): 根据类型查询分类(已完成) 根据分类 id 查询菜品 图片上传(已完成) 新增套餐 数据库设计: setmeal 表为套餐表,用于存储套餐的信息。具体表结构如下: 字段名 数据类型 说明 备注 id bigint 主键 自增 name varchar(32) 套餐名称 唯一 category_id bigint 分类...
18k 16 分钟

# Redis 分布式锁实现 # 前言 在分布式系统中,为了保证数据的一致性和并发控制,我们经常需要使用分布式锁。Redis 由于其高性能、原子性操作等特性,成为实现分布式锁的热门选择。本文将详细介绍 Redis 分布式锁的实现原理、多种实现方案以及最佳实践。 # 1. 分布式锁基础概念 # 1.1 什么是分布式锁 分布式锁是一种在分布式环境下控制多个进程 / 线程对共享资源访问的机制。它与本地锁(如 synchronized、ReentrantLock)的主要区别在于: 特性 本地锁 分布式锁 作用范围 单个 JVM 进程 多个 JVM 进程 / 多台机器 实现方式 JVM...
17k 15 分钟

# Redis 缓存穿透、击穿、雪崩解决方案 # 前言 在使用 Redis 作为缓存时,我们经常会遇到三个经典问题:缓存穿透、缓存击穿和缓存雪崩。这些问题会导致大量请求直接访问数据库,给数据库带来巨大压力,甚至可能导致系统崩溃。本文将详细分析这三个问题的成因、危害以及相应的解决方案。 # 1. 缓存穿透 # 1.1 什么是缓存穿透 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都没有命中。在这种情况下,每次请求都会直接打到数据库,导致数据库压力骤增。 # 1.2 缓存穿透的场景 12345678910111213141516// 典型的缓存穿透场景public User...