偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

場(chǎng)景題:你項(xiàng)目有什么亮點(diǎn)?

開(kāi)發(fā)
在當(dāng)前嚴(yán)峻的就業(yè)形勢(shì)下,項(xiàng)目如果沒(méi)什么亮點(diǎn),可能連面試的機(jī)會(huì)都沒(méi)有,但實(shí)際工作中,大部分人所做的事就是 CRUD(增刪改查),那怎么才能即很好的體現(xiàn)我們的技術(shù)實(shí)力?又不會(huì)被面試官識(shí)破呢?

在當(dāng)前嚴(yán)峻的就業(yè)形勢(shì)下,項(xiàng)目如果沒(méi)什么亮點(diǎn),可能連面試的機(jī)會(huì)都沒(méi)有,但實(shí)際工作中,大部分人所做的事就是 CRUD(增刪改查),那怎么才能即很好的體現(xiàn)我們的技術(shù)實(shí)力?又不會(huì)被面試官識(shí)破呢?

所以,今天我這個(gè)給大家提供一些通用的項(xiàng)目亮點(diǎn),你學(xué)會(huì)之后可以應(yīng)用到自己的項(xiàng)目中,這樣這個(gè)棘手的問(wèn)題就可以搞定了。

亮點(diǎn)1:并發(fā)編程+任務(wù)編排

1.1 并發(fā)編程

并發(fā)編程通常用在處理大量數(shù)據(jù)或者執(zhí)行多個(gè)獨(dú)立任務(wù)時(shí),可以創(chuàng)建多個(gè)線程來(lái)并行處理,以提高效率和響應(yīng)速度。

并發(fā)編程常見(jiàn)案例:例如 BI(Business Intelligence,商業(yè)智能系統(tǒng))系統(tǒng),一種集成了數(shù)據(jù)倉(cāng)庫(kù)、查詢(xún)報(bào)表、數(shù)據(jù)分析、數(shù)據(jù)挖掘、數(shù)據(jù)可視化等多種功能的軟件工具,用于幫助企業(yè)從大量數(shù)據(jù)中提取有價(jià)值的商業(yè)信息,以支持決策制定。BI 系統(tǒng)通常需要從多個(gè)(微服務(wù))數(shù)據(jù)源并行導(dǎo)入大量數(shù)據(jù),這樣我們就可以利用多線程同時(shí)導(dǎo)入數(shù)據(jù),這樣可以顯著減少總的導(dǎo)入時(shí)間。

多線程具體實(shí)現(xiàn):在 Spring Boot 中定義全局線程池,實(shí)現(xiàn)代碼如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class ThreadPoolConfig {
    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(100000); // 任務(wù)隊(duì)列:10w
        taskExecutor.setThreadNamePrefix("my-threadpool-");
        // 自定義拒絕策略【1.記錄錯(cuò)誤信息。2.通知消息系統(tǒng),發(fā)送告警信息】
        taskExecutor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                // 1.記錄錯(cuò)誤信息
                // 2.通知消息系統(tǒng),發(fā)送告警信息
            }
        });
        taskExecutor.initialize();
        return taskExecutor;
    }
}

多線程使用代碼示例:

@Resource
private ThreadPoolTaskExecutor taskExecutor;

1.2 任務(wù)編排

任務(wù)編排常見(jiàn)案例和具體實(shí)現(xiàn):以上 BI 系統(tǒng)再抽取多個(gè)數(shù)據(jù)源之后,需要對(duì)數(shù)據(jù)進(jìn)行整合、處理和入庫(kù),在這種場(chǎng)景下就需要使用 CompletableFuture 來(lái)進(jìn)行任務(wù)編排。

任務(wù)編排具體實(shí)現(xiàn):使用 CompletableFuture,它是 JDK 8 提供的線程編排工具,它的常用方法有以下幾個(gè):

圖片圖片

例如,我們現(xiàn)在實(shí)現(xiàn)一個(gè)這樣的場(chǎng)景:

圖片圖片

     任務(wù)描述:任務(wù)一執(zhí)行完之后執(zhí)行任務(wù)二,任務(wù)三和任務(wù)一和任務(wù)二一起執(zhí)行,所有任務(wù)都有返回值,等任務(wù)二和任務(wù)三執(zhí)行完成之后,再執(zhí)行任務(wù)四,它的實(shí)現(xiàn)代碼如下:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
    public static void main(String[] args) {
        // 任務(wù)一:返回 "Task 1 result"
        CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
            try {
                // 模擬耗時(shí)操作
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
            return "Task 1 result";
        });
        // 任務(wù)二:依賴(lài)任務(wù)一,返回 "Task 2 result" + 任務(wù)一的結(jié)果
        CompletableFuture<String> task2 = task1.handle((result1, throwable) -> {
            try {
                // 模擬耗時(shí)操作
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
            return "Task 2 result " + result1;
        });
        // 任務(wù)三:和任務(wù)一、任務(wù)二并行執(zhí)行,返回 "Task 3 result"
        CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> {
            try {
                // 模擬耗時(shí)操作
                Thread.sleep(800); // 任務(wù)三可能比任務(wù)二先完成
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
            return "Task 3 result";
        });
        // 任務(wù)四:依賴(lài)任務(wù)二和任務(wù)三,等待它們都完成后執(zhí)行,返回 "Task 4 result" + 任務(wù)二和任務(wù)三的結(jié)果
        CompletableFuture<String> task4 = CompletableFuture.allOf(task2, task3).handle((res, throwable) -> {
            try {
                // 這里不需要顯式等待,因?yàn)?allOf 已經(jīng)保證了它們完成
                return "Task 4 result with " + task2.get() + " and " + task3.get();
            } catch (InterruptedException | ExecutionException e) {
                throw new RuntimeException(e);
            }
        });
        // 獲取任務(wù)四的結(jié)果并打印
        String finalResult = task4.join();
        System.out.println(finalResult);
    }
}

亮點(diǎn)2:多級(jí)緩存

定義:多級(jí)緩存是指在系統(tǒng)中設(shè)置多個(gè)層次的緩存,每個(gè)層次的緩存具有不同的特性,它們協(xié)同工作來(lái)滿足系統(tǒng)對(duì)數(shù)據(jù)訪問(wèn)速度和存儲(chǔ)容量等多方面的需求。

圖片圖片

使用多級(jí)緩存可以從離用戶請(qǐng)求最近的地方優(yōu)先獲取緩存信息,從而保證了更高的查詢(xún)效率,多級(jí)緩存包括以下這些:

  • 分布式緩存:例如,Redis、MemCached 等。
  • 本地緩存:例如,Caffeine、Google Guava Cache、Spring Cache、Ehcache 等。
  • Nginx 緩存:在 Nginx 中配置并開(kāi)啟緩存功能。
  • CDN 緩存:是一種通過(guò)在離用戶更近的位置存儲(chǔ)數(shù)據(jù)副本,以提供更快速、高效地內(nèi)容交付的技術(shù)。CDN緩存使用分布式網(wǎng)絡(luò)和邊緣節(jié)點(diǎn)來(lái)緩存和分發(fā)靜態(tài)和動(dòng)態(tài)內(nèi)容,以減少用戶請(qǐng)求的響應(yīng)時(shí)間和帶寬消耗。
  • 瀏覽器緩存:它的實(shí)現(xiàn)主要依靠 HTTP 協(xié)議中的緩存機(jī)制,當(dāng)瀏覽器第一次請(qǐng)求一個(gè)資源時(shí),服務(wù)器會(huì)將該資源的相關(guān)緩存規(guī)則(如 Cache-Control、Expires 等)一同返回給客戶端,瀏覽器會(huì)根據(jù)這些規(guī)則來(lái)判斷是否需要緩存該資源以及該資源的有效期。

亮點(diǎn)3:緩存和數(shù)據(jù)庫(kù)一致性問(wèn)題解決

項(xiàng)目中使用緩存時(shí)會(huì)有 4 大經(jīng)典的問(wèn)題(雪崩、穿透、擊穿、數(shù)據(jù)一致性),其中一個(gè)就是【緩存和數(shù)據(jù)庫(kù)一致性問(wèn)題】,所以在實(shí)際工作中解決了這個(gè)經(jīng)典問(wèn)題,也是一大亮點(diǎn)。

緩存和數(shù)據(jù)庫(kù)一致性問(wèn)題的常見(jiàn)解決方案有兩個(gè):

  1. 使用延遲雙刪+MQ
  2. Canal 監(jiān)聽(tīng) MySQL Binlog 保證數(shù)據(jù)一致性:Canal 監(jiān)聽(tīng) binlog,再將數(shù)據(jù)庫(kù)更新到 MQ(如 Kafka)中,再通過(guò)監(jiān)聽(tīng)消息更新 Redis 緩存,Canal 執(zhí)行流程如下:

圖片圖片

亮點(diǎn)4:自定義注解解決冪等性問(wèn)題

使用了自定義注解實(shí)現(xiàn)了一些通用功能,例如,使用自定義注解實(shí)現(xiàn)冪等性處理、使用自定義注解實(shí)現(xiàn)了統(tǒng)一數(shù)據(jù)權(quán)限的驗(yàn)證等。

亮點(diǎn)5:分庫(kù)分表技術(shù)

如項(xiàng)目中使用了分庫(kù)分表技術(shù)增加數(shù)據(jù)庫(kù)的并發(fā)處理性能,典型的技術(shù)實(shí)現(xiàn)有 MyCat 和 ShardingSphere。

分庫(kù)分表技術(shù)介紹

首先來(lái)說(shuō),“分庫(kù)分表”不是一個(gè)技術(shù),而是多個(gè)技術(shù)實(shí)現(xiàn):

  1. 分庫(kù)

a.垂直分庫(kù)

b.水平分庫(kù)

  1. 分表

       a.垂直分表

       b.水平分表

① 垂直分庫(kù)

垂直分庫(kù)是按照業(yè)務(wù)將不同的表拆分到不同的數(shù)據(jù)庫(kù)中。例如,在一個(gè)電商數(shù)據(jù)庫(kù)中的用戶表和訂單表分別存放到不同的數(shù)據(jù)庫(kù)中,如下圖所示:

圖片圖片

② 水平分庫(kù)

水平分庫(kù)是將數(shù)據(jù)按照一定的規(guī)則(如用戶 ID 取模、哈希等)分布到不同的數(shù)據(jù)庫(kù)中。比如,根據(jù)用戶 ID 對(duì) 10 取模,將用戶數(shù)據(jù)分布到 10 個(gè)不同的數(shù)據(jù)庫(kù)中,每個(gè)數(shù)據(jù)庫(kù)都保存著完整的數(shù)據(jù)表結(jié)構(gòu),如下圖所示:

圖片圖片

③ 垂直分表

分表:

圖片圖片

垂直分表:垂直分表是將一張表按照列的相關(guān)性拆分成多張表。例如,將一個(gè)包含大量字段的用戶表,拆分為用戶基本信息表和用戶擴(kuò)展信息表,如下圖所示:

圖片圖片

④ 水平分表

水平分表是將一張表的數(shù)據(jù)按照行進(jìn)行拆分。例如按照用戶 ID 的范圍或者哈希值將數(shù)據(jù)拆分到不同的表中。

圖片圖片

在實(shí)際業(yè)務(wù)中,各種分庫(kù)分表技術(shù)可以混合使用。

MyCat VS Sharding Sphere

分庫(kù)分表的主流實(shí)現(xiàn)技術(shù)有以下兩種:

  1. MyCat
  2. Apache Sharding Sphere

Sharding Sphere 相比于 MyCat 來(lái)說(shuō),它的優(yōu)勢(shì)是:

  1. 功能更多:除了讀寫(xiě)分離和分庫(kù)分表之外,還提供了數(shù)據(jù)加密、流量質(zhì)量、數(shù)據(jù)遷移等功能。
  2. 社區(qū)更活躍度和生態(tài)更好:Sharding Sphere 擁有活躍的社區(qū)和豐富的文檔,生態(tài)系統(tǒng)較為完善,有更多的用戶和開(kāi)發(fā)者參與。
  3. 靈活性和擴(kuò)展性:Sharding Sphere 靈活性更高,擴(kuò)展性也更好,它可以方便地與其他技術(shù)集成,這方便 MyCat 支持的比較有限。

亮點(diǎn)6:項(xiàng)目中使用多種設(shè)計(jì)模式

例如以下這些設(shè)計(jì)模式:

  1. 責(zé)任鏈模式:在請(qǐng)求進(jìn)入后端項(xiàng)目之后,會(huì)經(jīng)過(guò)多個(gè)責(zé)任鏈攔截器(或過(guò)濾器),先鑒權(quán)、黑白名單效驗(yàn)、參數(shù)效驗(yàn)、敏感詞過(guò)濾等操作之后,才能進(jìn)行后續(xù)的訪問(wèn)和操作。
  2. 策略模式:支付功能會(huì)根據(jù)用戶不同的選擇,使用對(duì)應(yīng)的支付代碼實(shí)現(xiàn)支付功能。
  3. 模版方法模式:支付功能實(shí)現(xiàn)上,首先在接口中定義支付的基本流程,而具體的支付方式(如信用卡支付、三方平臺(tái)支付等)則由子類(lèi)實(shí)現(xiàn)。
  4. 裝飾器模式:在不更改原功能的基礎(chǔ)上,添加新的功能。例如,項(xiàng)目中方法的統(tǒng)計(jì),不更改原來(lái)的方法執(zhí)行,在方法執(zhí)行前后添加了執(zhí)行統(tǒng)計(jì)記錄功能。
  5. 代理模式:日志代理功能的實(shí)現(xiàn),在執(zhí)行目標(biāo)對(duì)象的方法前后記錄日志,用于監(jiān)控和調(diào)試。
  6. 生產(chǎn)者消費(fèi)者模式:使用 MQ 實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者模式,處理異步任務(wù)。
  7. 建造者模式:實(shí)現(xiàn)類(lèi)對(duì)象的創(chuàng)建和初始化。
  8. 單例模式:項(xiàng)目中的數(shù)據(jù)源、線程池等都使用了單例模式保證了資源的高效使用。
責(zé)任編輯:武曉燕 來(lái)源: 磊哥和Java
相關(guān)推薦

2025-04-01 00:00:00

項(xiàng)目CRUD單例模式

2023-12-08 08:29:53

SpringAOP日志

2019-08-12 16:22:07

Python線程場(chǎng)景

2024-10-25 16:31:17

Redis數(shù)據(jù)預(yù)處理線程

2022-10-17 00:27:20

二叉樹(shù)數(shù)組索引

2016-07-04 10:39:19

Swift 3亮點(diǎn)

2023-12-26 09:42:41

存儲(chǔ)數(shù)據(jù)庫(kù)

2022-07-24 21:56:38

元宇宙

2014-05-26 16:18:23

全球軟件技術(shù)峰會(huì)WOT201451CTO

2020-01-27 10:48:55

Linux終端技巧

2021-03-16 06:47:47

Python

2012-11-14 16:55:53

TOP500Titan超級(jí)計(jì)算機(jī)

2025-01-03 08:46:20

場(chǎng)景元素函數(shù)

2015-07-16 11:23:05

微軟CRMAzure云服務(wù)

2024-09-03 09:31:41

微服務(wù)面試官系統(tǒng)

2023-11-28 08:20:25

2024-08-30 17:14:34

2011-04-21 11:07:58

jQuery

2016-03-03 14:20:02

ZD至頂網(wǎng)軟件頻道

2020-11-23 09:21:09

開(kāi)源項(xiàng)目
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)