23k 21 分钟

# 前言:事务管理的艺术与哲学 在我多年的开发经历中,事务管理一直是一个既熟悉又陌生的话题。熟悉的是,几乎每个项目都需要用到事务;陌生的是,真正理解事务本质的人却寥寥无几。我见过太多因为事务使用不当而导致的系统故障,也见证过优秀的事务设计如何让系统更加健壮。 记得有一次,我接手了一个电商系统,发现订单处理逻辑中存在严重的事务问题:用户下单时,库存扣减和订单创建不在同一个事务中,导致超卖现象频发。这个问题不仅造成了经济损失,更严重影响了用户体验。通过重新设计事务边界,我们彻底解决了这个问题。 Spring 的事务管理机制是 Java...
30k 27 分钟

# 苍穹外卖 - day03 # 课程内容 公共字段自动填充 新增菜品 菜品分页查询 删除菜品 修改菜品 功能实现 菜品管理 # 公共字段自动填充 # 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发,在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段,也就是也就是在我们的系统中很多表中都会有这些字段,如下: 序号 字段名 含义 数据类型 1 create_time 创建时间 datetime 2 create_user 创建人...
18k 16 分钟

# 前言:从面向对象到面向切面的思维跃迁 在我刚开始接触 AOP(面向切面编程)的时候,内心充满了疑惑:为什么需要这种奇怪的编程方式?面向对象不是已经足够强大了吗?直到有一天,我面对一个典型的企业级应用场景,才真正理解了 AOP 的价值。 想象一下这个场景:你有一个包含 50 个 Service 类的系统,现在需要在每个 Service 方法执行前后记录日志、检查权限、监控性能、处理事务... 按照传统的 OOP 方式,你需要在每个方法中都重复编写这些代码。这不仅让代码变得臃肿,更违反了 DRY(Don't Repeat Yourself)原则。 AOP...
32k 29 分钟

# day02 项目内容 新增员工 员工分页查询 启用禁用员工账号 编辑员工 导入分类模块功能代码 # 新增员工 # 需求分析和设计 # 产品原型 一般在做需求分析时,往往都是对照着产品原型进行分析,因为产品原型比较直观,便于我们理解业务。 后台系统中可以管理员工信息,通过新增员工来添加后台系统用户。 当填写完表单信息,点击 "保存" 按钮后,会提交该表单的数据到服务端,在服务端中需要接受数据,然后将数据保存至数据库中。 注意事项: 账号必须是唯一的 手机号为合法的 11 位手机号码 身份证号为合法的 18 位身份证号码 密码默认为...
36k 33 分钟

# Spring 的 get 方法 方法定义 返回值 参数 Object getBean(String beanName) Object beanName T getBean(Class type) Class type type T getBean(String beanName, Class type) Class type beanName , type 第一行的方法定义是 Object getBean(String beanName) 。该方法根据 beanName 从容器中获取 Bean 实例,要求容器中 Bean 唯一。返回值为 Object...
8.5k 8 分钟

# 项目整体功能概览 定位:专门为餐饮企业(餐厅、饭店)定制的一款软件产品 # 项目开发流程 # 角色分工 # 功能架构 # 产品原型 产品原型:用于展示项目的业务功能,一般由产品经理进行设计 进入文件夹后直接打开 html 文件即可查看原型内容,“登录” html 为入口,这里不做过多展示,不是我们的重点方向。 # 技术选型 技术选型:展示项目中使用到的技术框架和中间件等 # 开发环境搭建 # 整体结构 # 前端环境搭建 这里项目前端代码和 nginx 已经构建完毕,我们直接运行 nginx 即可。 [!NOTE] Nginx...
8k 7 分钟

# Redis 事务与 Lua 脚本 # 概述 在 Redis 中,事务和 Lua 脚本是实现原子性操作的重要机制。它们可以确保一组命令要么全部执行,要么全部不执行,从而保证数据的一致性。 本文将详细介绍 Redis 事务的机制、Lua 脚本的编程方法,以及它们在实际应用中的使用场景。 # Redis 事务 # 什么是 Redis 事务 Redis 事务是一组命令的集合,这些命令会按照顺序执行,并且在执行过程中不会被其他客户端的命令打断。Redis 事务通过以下命令实现: MULTI :标记事务开始 EXEC :执行事务中的所有命令 DISCARD :取消事务 WATCH :监视一个或多个...
5k 5 分钟

# Redis 持久化机制详解 # 概述 Redis 是一个内存数据库,数据存储在内存中。如果服务器进程退出,服务器中的数据也会丢失。为了解决这个问题,Redis 提供了两种持久化机制: RDB(Redis Database):定时快照方式 AOF(Append Only File):日志追加方式 本文将详细介绍这两种持久化机制的原理、配置和使用场景。 # RDB 持久化 # 什么是 RDB RDB 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。它生成的文件是一个经过压缩的二进制文件,Redis 可以通过这个文件来恢复数据。 # RDB 工作原理 12345graph TD...
6.3k 6 分钟

几种常用的 Redis 的 java 客户端: Jedis : 以 Redis 命令作为方法名称,学习成本低,简单实用。但是 Jedis 实例是线程不安全的,多线程环境下需要基于连接池来使用 Lettuce : Lettuce 是基于 Netty 实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持 Redis 的哨兵模式、集群模式和管道模式。 Redisson : Redisson 是一个基于 Redis 实现的分布式、可伸缩的 Java 数据结构集合。包含了诸如 Map、Queue、Lock、 Semaphore、AtomicLong 等强大功能 #...
3.1k 3 分钟

# Redis 数据结构的艺术:从工具到思维的跃迁 # 前言:从会用到用好 刚开始接触 Redis 的时候,我和很多人一样,觉得它就是个缓存工具。SET 一下,GET 一下,完事了。但随着在项目中踩的坑越来越多,我慢慢意识到 Redis 远不止于此。 今天想聊聊 Redis 数据结构背后的一些思考,不是简单的命令罗列,而是我在实际项目中的一些感悟和经验总结。 # String:最简单的却最容易被误用 String 是 Redis 最基础的数据结构,但也是最容易被滥用的。我见过很多项目把复杂的 JSON 对象直接序列化成 String...