Java North

Java 's Blog


  • 首页

  • 分类

  • 作者

  • 归档

  • 关于

从《黑客帝国》《西部世界》到如今的AI

发表于 2025-03-05 | 分类于 Java

哈喽,大家好,我是了不起。

阅读全文 »

使用SseEmitter实现服务端向客户端推送消息

发表于 2025-02-05 | 分类于 Java

哈喽,大家好,我是了不起。

阅读全文 »

使用SseEmitter实现服务端向客户端推送消息

发表于 2024-12-03 | 分类于 Java

哈喽,大家好,我是了不起。

Spring框架中可以使用SseEmitter实现服务端向客户端推送消息,今天盘一盘。

阅读全文 »

猴子都会内网穿透了!

发表于 2024-11-22 | 分类于 Java

哈喽,大家好,我是了不起。

最近把旧电脑搞成了NAS,就像折腾着搞一下内网穿透。看了好几个教程,发现都不是最新版本,根本无法使用。本次给大家分享猴子都能做到的内网穿透步骤。

阅读全文 »

知名开源项目官宣停更,太可惜了!-20240425

发表于 2024-11-21 | 分类于 Java

哈喽,大家好,我是了不起。

最近看到一个知名开源项目官宣停更,还是挺震惊的。

阅读全文 »

SseEmitter

发表于 2024-11-12 | 分类于 Java

哈喽,大家好,我是了不起。

最近看到一个知名开源项目官宣停更,还是挺震惊的。

阅读全文 »

几种更新库存的方法

发表于 2024-09-01 | 分类于 Java

哈喽,大家好,我是了不起。

最近项目上有类似库存更新的业务需求,顺便总结了一下库存更新的几种方式。

阅读全文 »

你认为写代码的乐趣在哪里?

发表于 2024-07-30 | 分类于 Java

哈喽,大家好,我是了不起。

最近一直处于项目管理的位置,没有什么时间写代码,有时候也会忽然思考一下,我们写代码的乐趣在哪里,有哪些乐趣呢?

阅读全文 »

你认为写代码的乐趣在哪里?

发表于 2024-07-30 | 分类于 Java

哈喽,大家好,我是了不起。

最近一直处于项目管理的位置,没有什么时间写代码,有时候也会忽然思考一下,我们写代码的乐趣在哪里,有哪些乐趣呢?

阅读全文 »

Java只有中国人在搞了吗?

发表于 2024-07-30 | 分类于 Java

哈喽,大家好,我是了不起。

最近项目团队找人,我面试了很多人,非常喜欢问一个问题,Java线程池为什么先入队列再增加线程数?

阅读全文 »

同事离职了,谁也没在提过他,就像他从没来过-20240717

发表于 2024-07-17 | 分类于 Java

哈喽,大家好,我是了不起。

今天在脉脉上看到一个有意思的话题,相信工作有一些年头的打工人一定深有感触。

阅读全文 »

推荐一款开源爬虫工具,不写代码就可爬?-20240607

发表于 2024-06-07 | 分类于 Java

哈喽,大家好,我是了不起。

爬虫,也被称为网络爬虫或网络蜘蛛,是一种自动化的网络机器人,其主要功能是按照一定的规则,自动浏览互联网并从网页中提取信息。

作为一个开发人员,相信大家都尝试过写一些爬虫,合理的利用一些爬虫工具,对于我们一些还是挺有帮助的。

比如自动化测试,使用爬虫技术对网站进行自动化测试,检查链接是否有效,确保网站内容的正确显示。

今天就给大家介绍一款开源的爬虫工具,不用写代码即可完成爬虫。

阅读全文 »

学习数据库,看这个开源项目就够了-20240604

发表于 2024-06-04 | 分类于 Java

哈喽,大家好,我是了不起。

作为一个后端开发人员,应该没有不接触数据库的,数据库操作优化也是后端面试人员的重点面试项目,那么如何学习数据库呢?

阅读全文 »

Spring Cloud Gateway中优化Netty线程池,提升系统性能

发表于 2024-06-03 | 分类于 Java

哈喽,大家好,我是了不起。

最近项目团队找人,我面试了很多人,非常喜欢问一个问题,Java线程池为什么先入队列再增加线程数?

阅读全文 »

Uptime Kuma 网站监控解决方案

发表于 2024-05-26 | 分类于 网站

在数字化高速发展的今天,确保在线服务的可靠性和可用性变得比以往任何时候都重要。这就需要一款强大的监控工具,以确保你的服务器、网站和API始终在线。

在众多监控工具中,Uptime Kuma作为一款开源、现代化的服务监控解决方案,正逐渐成为众多开发者和系统管理员的心头好。

本文将为您详细介绍Uptime Kuma的作用、特性以及如何轻松安装并使用它来守护您的在线业务。

Uptime Kuma的作用

Uptime Kuma是一个开源监控工具,它允许你监控你的服务,并确保你是第一个知道它们何时下线的人。与传统的SaaS监控服务(如UptimeRobot)不同,Uptime Kuma提供了一个可完全控制和定制的环境。

它有以下主要特点:

  • 多种监控类型:它可以监控HTTP/S、TCP、HTTP(s) Keyword、Ping、DNS Record、Steam Game Server等。
  • 灵活的告警策略:当监控到的服务状态发生变化时,Uptime Kuma可以通过多种通知渠道,如Telegram、Discord、Slack、Email等提醒你。
  • 界面友好的仪表板:清晰直观地展示所有监控项目的当前状态、历史记录及响应时间统计,帮助您一目了然地掌握服务健康状况。
  • 高度可定制化: 支持自定义脚本监控、多语言界面以及丰富的主题选择,满足不同用户的个性化需求。
  • 开源免费: 作为开源软件,Uptime Kuma不仅免费使用,还允许用户根据自身需求进行二次开发和功能扩展。

安装方式

Docker(推荐)

Uptime Kuma提供了多种安装选项,以适应不同的用户需求。可以通过Docker容器快速安装,也可以从源代码构建。这里基本演示Docker的安装方法:

首先确保服务器已经安装了Docker: 如果你还没有Docker,首先需要安装它。根据你的操作系统,你可以从Docker官网下载合适的安装包。

  1. 拉取Uptime Kuma镜像: 使用以下命令从Docker Hub上拉取最新的Uptime Kuma镜像。
1
docker pull louislam/uptime-kuma
  1. 启动Uptime Kuma容器: 使用以下命令启动一个Uptime Kuma实例。
1
docker run -d --name uptime-kuma -p 3001:3001  -v ./uptime-kuma-data:/app/data louislam/uptime-kuma

上面的命令会创建一个新的Uptime Kuma容器,名为uptime-kuma,并且将容器的3001端口映射到主机的3001端口。

  1. 访问Uptime Kuma: 在你的浏览器中访问http://localhost:,你将看到Uptime Kuma的登录页面,按照初次启动向导完成安装过程。

Docker Compose(推荐)

1
2
3
4
5
6
7
8
9
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1.23.13
    container_name: uptime-kuma
    restart: always
    volumes:
      - ./data:/app/data
    ports:
      - 3001:3001

编写docker-compose.yaml文件,用docker compose up -d 启动即可。

初始化和配置和上述一致。

进一步的配置和定制教程可以在Uptime Kuma的GitHub文档中找到,包括如何添加监控项、配置通知方式等。

小结

Uptime Kuma是一个功能强大且易于使用的监控工具,它是为希望完全控制监控过程的团队和个人设计的。

它的自托管特性意味着没有外部依赖,你数据的隐私性和安全性得到了保证。

除此之外,它开源且完全免费,适合希望有成本效益解决方案的企业和开发者。如果你正在寻找一个灵活而且强大的监控工具,Uptime Kuma无疑是一个值得考虑的选择。

阅读全文 »

在Spring中同时使用了分布式锁和事务注解?-20240508

发表于 2024-05-03 | 分类于 Java

哈喽,大家好,我是了不起。

最近项目团队找人,我面试了很多人,非常喜欢问一个问题,就是Java线程池为什么先入队列再增加线程数?

阅读全文 »

Java线程池为什么先入队列再增加线程数?-20240506

发表于 2024-05-02 | 分类于 Java

哈喽,大家好,我是了不起。

最近项目团队找人,我面试了很多人,非常喜欢问一个问题,Java线程池为什么先入队列再增加线程数?

阅读全文 »

面试题:MySQL误删数据怎么办?-20240425

发表于 2024-04-21 | 分类于 Java

哈喽,大家好,我是了不起。

今天给大家介绍一个很常见的数据库面试题:MySQL误删数据怎么办?

阅读全文 »

为什么Java String哈希函数乘数为31?-20240421

发表于 2024-04-21 | 分类于 Java

哈喽,大家好,我是了不起。

今天给大家介绍一个底层数字问题——为什么Java String哈希函数乘数为31?

阅读全文 »

Stream.parallel():开启并行流处理之旅

发表于 2024-04-14 | 分类于 Java

Java 8 引入了强大的 Stream API,为处理集合数据提供了简洁、高效的解决方案。 其中,parallel() 方法为流处理引入了并行化能力,允许开发者充分利用多核处理器的优势,大幅提升大规模数据集的处理效率。

本篇文章将带你开启并行流处理之旅,认识 Java 8 Stream API 中的 parallel()。

什么是 parallel()

parallel() 是 Java 8 Stream API 中的一个方法,用于将一个顺序流转换为并行流。并行流是一种可以同时在多个线程上执行操作的流,它将流的元素分割成多个子集,每个子集在不同的线程上独立处理,最后将结果合并。使用 parallel() 方法可以轻松开启并行流处理模式,无需显式管理线程和同步。

1
2
3
4
5
6
7
List<Integer> numbers = ...; // 假设有一个包含大量元素的列表

numbers.stream() // 创建顺序流
    .parallel() // 转换为并行流
    .filter(n -> n % 2 == 0) // 并行过滤偶数
    .map(n -> n * 2) // 并行映射为原数的两倍
    .forEach(System.out::println); // 并行打印结果

在这个示例中,parallel() 方法将顺序流转换为并行流,后续的 filter()、map() 和 forEach() 操作将在多个线程上并行执行,从而加速数据处理。

并行流的工作原理

并行流处理背后的核心机制主要包括以下几个方面:

  1. 分割与合并
  2. 自动流水线化
  3. 适应性执行策略

并行流根据数据集的大小、处理器核心数等因素动态调整并行度和任务划分策略。对于小规模数据集或不适合并行化的操作,Java 8 会自动退化为顺序流处理,避免不必要的线程开销。

总之,parallel() 方法通过将原始列表拆分成多个子任务,并在独立线程上并行执行流操作链的各个阶段,最后合并处理结果,实现了对列表数据的高效并行处理。 具体的拆分策略和并行执行细节由 JVM 自动管理,开发者无需关心底层实现,只需关注流式编程的高层抽象。

实战应用

适合parallel()并行流的应用场景有:

  1. 大规模数据集处理
  2. CPU 密集型操作
  3. 可并行化的中间操作,如 filter()、map()、flatMap()、sorted()等。

示例1:大规模数据集处理

场景:在一个数据分析项目中,需要对一个包含百万条记录的数据集进行复杂过滤和计算。使用并行流可以显著加快处理速度,充分利用多核处理器资源。 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ParallelDataProcessingExample {
    public static void main(String[] args) {
        List<DataRecord> records = generateLargeDataRecords(); // 假设生成包含百万条记录的数据集

        List<DataRecord> filteredAndProcessedRecords = records.parallelStream()
                .filter(record -> record.isValid()) // 并行过滤有效记录
                .map(record -> record.computeComplexMetric()) // 并行计算复杂度量
                .collect(Collectors.toList());

        // ... 使用 filteredAndProcessedRecords 进行后续分析 ...
    }

}

public class DataRecord {
    // ... 数据记录的字段、方法等 ...

    public boolean isValid() {
        // ... 判断记录是否有效的逻辑 ...
    }

    public DataRecord computeComplexMetric() {
        // ... 计算复杂度量的逻辑 ...
    }
}

示例2

场景: 假设有一个电商系统需要批量更新大量商品的价格,每个商品的更新过程涉及网络请求到不同服务获取最新价格信息,然后保存到数据库。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Service
@RequiredArgsConstructor
public class ProductService {

    private final PriceService priceService;
    private final ProductRepository productRepository;
    private final Executor asyncExecutor;


    /**
	 * 批量更新商品价格
	 *
	 * @param productIds 商品ID列表
	 */
	public void batchUpdatePrices(List<Integer> productIds) {
		CompletableFuture<Void> allDbUpdates = CompletableFuture.allOf(productIds.stream()
				.parallel()
				.map(productId -> CompletableFuture.supplyAsync(() -> priceService.getLatestPrice(productId), asyncExecutor)
						.thenAcceptAsync(newPrice -> productRepository.updatePrice(productId, newPrice), asyncExecutor))
				.toArray(CompletableFuture[]::new));

		// 等待所有数据库更新完成
		allDbUpdates.join();
	}
}

在这个示例中:

  • 首先,我们创建了一个包含100个商品ID的列表,并对其应用了 parallel() 流操作,使得后续的 map() 操作能并行执行。
  • 为每个商品ID创建一个 CompletableFuture,通过 supplyAsync() 异步调用 PriceService 获取最新价格。
  • 进一步使用 thenAcceptAsync() 异步操作。在获取到最新价格之后更新数据库。
  • 最终,使用 CompletableFuture.allOf() 等待所有数据库更新操作完成。

小结

Java 8 Stream API 中的 parallel() 方法为处理集合数据提供了便捷的并行化途径。 在复杂的异步处理场景中,可以结合 CompletableFuture 与并行流,进一步提升程序的并发性和响应能力。 通过合理使用并行流,开发者可以显著提升大规模数据集处理的性能,充分发挥现代多核处理器的潜力。 然而,使用并行流时也应注意避免数据依赖、状态共享等问题,适时进行性能评估与调整。

阅读全文 »
1 2 … 19
Java Geek Tech

Java Geek Tech

一群热爱 Java 的技术人

379 日志
126 分类
56 作者
RSS
GitHub 知乎
Links
  • 纯洁的微笑
© 2019 - 2025 Java Geek Tech
由 Jekyll 强力驱动
主题 - NexT.Mist