分类: 技术

16 篇文章

设计共享工作空间协作模块
永远不要试图用战术上的勤奋,去掩饰你战略上的懒惰。 ——雷军 背景 在设计团队协作存储模块时,我遇到了很多问题。 许多想法在我脑海中打架: 我想到非结构化的存储在 MinIO 中的文件,它们需要 MySQL 中涉及一个元数据表来进行维护吗? 如果需要,那么涉及到文件夹,文件夹这个抽象的概念又怎么引入这个表呢? 文件从属文件夹的设计又要怎么实现?在代…
最基础的传输控制
考虑至少要实现一个简单的并发控制吧亲! 使用的架构: Java 21 Redis MySQL 使用到的包: Hutool SecureUtil MD5 Java Spring Framework MutilPartFile/TransactionTemplate Redission Lock 使用的协议: HTTP 协议 对于一个使用最基础的 HT…
八股何以成其所是?
对于很多八股题来说,我现在考虑到,那么其实这是一个⌈场景⌋。 什么是场景?这是什么意思呢? 我想表达的是,虽然说现在大家都知道,如果要准备面试,肯定要先准备八股。而八股中会涉及到一些知识点的考察。 例如: MySQL 数据库可能会发生索引失效。为什么?怎么应对? Java 中的线程池有哪些核心参数?它如何调度任务?基于什么数据结构? Redis 的…
the King of 锁
麻雀虽小,五脏俱全。 多线程情况下。 基本锁升级 默认的锁升级情况如下: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 为什么要有锁升级?这是应对不同的并发场景的策略。因为 Java 设计团队通过研究后认为:大多数锁修饰的对象,生命周期中大多只有一个线程在竞争。在默认修饰了 synchronized 的情况下,如果资源竞争并不激烈,在一个线程…
线程池源码
你怎么理解线程池? 线程池的设计? 我去读源码,我要先看它的构造函数。我去考虑作者的设计,我去想:作者认为这几个参数是核心的参数,因此将它作为了这个类的构造函数。作者想:如果人们用了我这个类,他们可能需要这些灵活的配置。因此写下了这些构造函数。 我想,在学习编程语言的过程中总要有一种信念,就是:这样的设计一定有它的道理存在。除非我有足够的证据推翻它…
数据库黄埔军校 MySQL
学习一个经典的设计,有利于我们在未来有一个更加清晰的认识。这是我们迈出向一个全新视界和全新设计的第一步,我们将学习一个完整、自洽、优雅的数据库软件—— MySQL。 几个博主的文章比较好地介绍了这个入门https://www.cnblogs.com/novwind/p/17489997.html https://www.cnblogs.com/be…
对象模型和锁
我们这里研究的对象模型是线程操作的最基本的对象, 从最基础的代码开始。 在这个实验中,我们探究的主要是 Java 8 的特性,使用了 org.openjdk.jol 包。以无锁状态的对象在内存中的实际存储情况为例作首先的熟悉。 Java 对象在内存的布局分析 接下来根据具体的输出进行分析。 java.lang.Object object inter…
Spring Boot 集成 Redis
使用的框架 Spring Boot Spring Data Redis RedisTemplates 中封装了很多对象类,我们通过对于类的一个操作,能够实现数据的填充。如 @Override public ValueOperations<K, V> opsForValue() { return valueOps; } Redis 中的数…
数据服务层的热重载实现
背景 qData 数据服务层采用动态路由设计,将 API 配置持久化至数据库表 DS_API,程序启动时通过 StartedUpRunner 一次性加载并注册至 Spring 的 RequestMappingHandlerMapping 内部维护的 MappingRegistry 中,实现灵活的路由映射。 问题 该加载逻辑仅在应用启动时执行一次。当…
关于 qData 数据中台内存性能问题的分析论文报告
为了避免对于生产环境当前的部署情况以及压测时对于其他资源的侵占导致的可能出现的各种 bug,我选择在我自己的主机上重新部署 qData 的这个项目。 这个花费了一定的时间,但是也让我感受到了本地开发的 IDEA 的重要性,它有很直观的图形界面,也易于调试,只是稍微需要学习一下,并且不同的 Java 版本可以通过项目结构进行管理,不需要在环境变量里面…
数据服务层 API 具体源码实现
对于数据中台描述,我需要将情况讲清楚。 从一个具体的 Java 的 Data Object 对象的实现层面。 启动流程 qData 使用的是 Spring Boot 的框架。 在实现上,数据服务层的抽象使用 ApplicationRunner 接口实现,也就是说, DS API 的持续服务提供功能的初始启动状态是作为组件启动的。 具体情况中,我们的…
为什么我们需要序列化?
二次编辑: 在 Java 中,我们处理的内容大多是对象。这是我们作为用户层面所感知到的。进一步深究,对象在 JVM 中实际上是在栈中被指针引用,实际数据存储在堆中。也就是说,它是一个复杂的数据结构,有多层调用。 在传输数据的过程中,栈中的引用、指针实际上对于传输数据是没有什么作用的,而且它是一层抽象,仅仅是为了说明该引用实际数据存储的地址。要与硬件…
芋道代码解析-后端(1)-安全与鉴权
主要使用的框架:Spring Boot Security 前置基本术语和知识 网页服务器(Web Server)一词通常包含两个层面的意义: 硬件层面:指一台负责存放网站文件,并透过网络提供服务的电脑。它借由超文本传输协议(HTTP)与客户端(一般是指网页浏览器)进行资料交换。 软件层面:指一个运行于电脑上的服务器程序(如 Apache, Ngin…
芋道代码解析-后端篇(0)
江畔何人初见月?江月何年初照人? 人生代代无穷已,江月年年望相似。 不知江月待何人,但见长江送流水。 ——唐·张若虚《春江花月夜》 先不看所有的租户管理、安全管理和框架部分,先从一个完整的前端请求链路来看芋道中一个最典型的请求的完整后端行为。 Controller 部分 Controller 监听来自客户端的请求,也就是来自前端的 HTTP 请求(…