百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

服务架构性能优化与Java实现

mhr18 2025-08-02 20:06 2 浏览 0 评论

服务架构性能优化大全(附Java代码实现)


一、缓存

核心思想:将高频访问数据存储在高速存储中,减少慢速存储(如数据库)访问
场景:读多写少的数据(用户信息、配置数据)
Java实现:使用Caffeine缓存

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

public class CacheExample {
    private static Cache<String, Object> cache = Caffeine.newBuilder()
            .maximumSize(10_000)
            .expireAfterWrite(10, TimeUnit.MINUTES)
            .build();

    // 获取数据(缓存未命中时从DB加载)
    public Object getData(String key) {
        return cache.get(key, k -> fetchFromDatabase(k));
    }

    private Object fetchFromDatabase(String key) {
        // 模拟数据库查询
        return "Data for " + key;
    }

    // 更新缓存
    public void updateData(String key, Object value) {
        writeToDatabase(key, value);
        cache.put(key, value);
    }
}

二、并行化处理

核心思想:将任务分解为子任务并行执行,利用多核CPU
场景:大数据处理、批量计算
Java实现:使用ForkJoinPool

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class ParallelSum extends RecursiveTask<Long> {
    private final long[] numbers;
    private final int start, end;
    private static final int THRESHOLD = 10_000;

    public ParallelSum(long[] numbers, int start, int end) {
        this.numbers = numbers;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        int length = end - start;
        if (length <= THRESHOLD) {
            return sequentialSum();
        }
        ParallelSum leftTask = new ParallelSum(numbers, start, start + length/2);
        ParallelSum rightTask = new ParallelSum(numbers, start + length/2, end);
        leftTask.fork();  // 异步执行
        return rightTask.compute() + leftTask.join();
    }

    private long sequentialSum() {
        long sum = 0;
        for (int i = start; i < end; i++) {
            sum += numbers[i];
        }
        return sum;
    }

    public static void main(String[] args) {
        long[] numbers = new long[20_000_000];
        // 初始化数组...
        ForkJoinPool pool = new ForkJoinPool();
        Long sum = pool.invoke(new ParallelSum(numbers, 0, numbers.length));
    }
}

三、批量化处理

核心思想:将零散操作合并为批量操作,减少I/O次数
场景:数据库写入、消息发送
Java实现:批量数据库插入

// 使用JDBC批处理
public class BatchInsert {
    public void batchInsert(List<User> users) throws SQLException {
        try (Connection conn = dataSource.getConnection();
             PreparedStatement ps = conn.prepareStatement(
                 "INSERT INTO users (id, name) VALUES (?, ?)")) {
            
            conn.setAutoCommit(false);  // 关闭自动提交
            
            for (User user : users) {
                ps.setInt(1, user.getId());
                ps.setString(2, user.getName());
                ps.addBatch();  // 加入批处理
            }
            
            ps.executeBatch();  // 批量执行
            conn.commit();      // 手动提交
        }
    }
}

// 使用MyBatis批处理
<insert id="batchInsert" parameterType="list">
    INSERT INTO users (id, name) VALUES
    <foreach item="user" collection="list" separator=",">
        (#{user.id}, #{user.name})
    </foreach>
</insert>

四、数据压缩

核心思想:减小网络传输和存储的数据体积
场景:API响应、消息队列
Java实现:GZIP压缩

import java.io.*;
import java.util.zip.GZIPOutputStream;

public class CompressionUtils {
    public static byte[] compress(String data) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try (GZIPOutputStream gzip = new GZIPOutputStream(bos)) {
            gzip.write(data.getBytes(StandardCharsets.UTF_8));
        }
        return bos.toByteArray();
    }

    // HTTP响应压缩示例(Spring Boot)
    @GetMapping("/data")
    public ResponseEntity<byte[]> getLargeData() throws IOException {
        String largeData = fetchDataFromSource();
        return ResponseEntity.ok()
                .header("Content-Encoding", "gzip")
                .body(compress(largeData));
    }
}

五、无锁化

核心思想:避免线程阻塞,使用CAS(Compare-And-Swap)操作
场景:计数器、状态标志
Java实现:AtomicLong vs Synchronized

// 无锁实现
public class LockFreeCounter {
    private final AtomicLong counter = new AtomicLong(0);
    
    public void increment() {
        counter.incrementAndGet();
    }
    
    public long getCount() {
        return counter.get();
    }
}

// 对比加锁实现
public class LockedCounter {
    private long counter = 0;
    
    public synchronized void increment() {
        counter++;
    }
    
    public synchronized long getCount() {
        return counter;
    }
}

六、顺序写

核心思想:磁盘顺序写入速度远高于随机写入
场景:日志存储、消息队列(Kafka)
Java实现:顺序写文件

public class SequentialWriter {
    private final FileChannel channel;
    
    public SequentialWriter(String filePath) throws IOException {
        RandomAccessFile file = new RandomAccessFile(filePath, "rw");
        this.channel = file.getChannel();
    }
    
    public void append(byte[] data) throws IOException {
        channel.write(ByteBuffer.wrap(data), channel.size());
    }
    
    // Kafka日志追加伪代码
    public void appendToPartition(TopicPartition partition, byte[] data) {
        File logFile = getPartitionLogFile(partition);  // 获取分区对应文件
        writeSequentially(logFile, data);               // 顺序追加
    }
}

七、分片化

核心思想:将大数据集分割为独立分区(Shard)分散压力
场景:数据库分库分表、分布式缓存
Java实现:分片路由

public class ShardManager {
    private List<DataSource> shards; // 分片数据源列表

    // 根据分片键路由
    public DataSource getShard(String shardKey) {
        int shardIndex = Math.abs(shardKey.hashCode()) % shards.size();
        return shards.get(shardIndex);
    }

    // 分片写入示例
    public void insertUser(User user) {
        DataSource shard = getShard(user.getUserId());
        try (Connection conn = shard.getConnection()) {
            // 在分片DB执行插入
        }
    }
}

八、避免请求

核心思想:减少不必要的网络交互
实现方案

  1. 客户端缓存:HTTP缓存头(Cache-Control)
  2. 预测执行:预先加载可能使用的数据
  3. 空结果缓存:缓存查询无结果的响应
  4. 布隆过滤器:快速判断数据是否存在

Java实现:布隆过滤器(Guava)

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class BloomFilterExample {
    private BloomFilter<String> bloomFilter = BloomFilter.create(
            Funnels.stringFunnel(), 
            100_000, 
            0.01  // 误判率1%
    );

    public void processRequest(String key) {
        if (!bloomFilter.mightContain(key)) {
            // 肯定不存在,直接返回
            return;
        }
        // 可能存在,继续查询DB
        fetchFromDB(key);
    }

    public void addKey(String key) {
        bloomFilter.put(key);
        writeToDB(key);
    }
}

九、池化

核心思想:复用昂贵资源(线程/连接),避免重复创建
场景:数据库连接、线程管理
Java实现:HikariCP连接池

// 配置连接池
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost/db");
config.setUsername("user");
config.setPassword("password");
config.setMaximumPoolSize(20);  // 最大连接数

HikariDataSource dataSource = new HikariDataSource(config);

// 获取连接
try (Connection conn = dataSource.getConnection()) {
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM users");
    // 处理结果...
}

十、异步处理

核心思想:非阻塞调用,资源释放给其他任务
场景:I/O密集型操作、通知类逻辑
Java实现:CompletableFuture

public class AsyncProcessor {
    private final ExecutorService executor = Executors.newFixedThreadPool(4);

    public CompletableFuture<Void> processAsync() {
        return CompletableFuture.runAsync(() -> {
            // 异步执行耗时操作
            heavyCalculation();
        }, executor);
    }

    // 链式调用
    public void pipeline() {
        CompletableFuture.supplyAsync(this::fetchData, executor)
                .thenApply(this::transformData)
                .thenAccept(this::sendNotification)
                .exceptionally(ex -> {
                    System.err.println("Error: " + ex.getMessage());
                    return null;
                });
    }
}

十一、总结

优化手段

适用场景

关键技术

缓存

读多写少,热点数据

Caffeine/Redis

并行化

CPU密集型任务

ForkJoinPool/并行流

批量化

高频小数据操作

JDBC Batch/缓冲队列

数据压缩

网络传输大数据

GZIP/Protobuf

无锁化

高并发计数场景

CAS/Atomic类

顺序写

日志/消息存储

文件顺序追加

分片化

海量数据存储

分库分表/一致性哈希

避免请求

无效查询过滤

布隆过滤器/本地缓存

池化

昂贵资源复用

连接池/线程池

异步处理

I/O阻塞操作

CompletableFuture/RxJava

综合建议

  1. 优先使用异步和非阻塞IO(如Netty)
  2. 80%性能问题可通过缓存+批量化解决
  3. 分布式场景采用分片化+无状态设计
  4. 监控先行:量化优化效果(Latency/Throughput/Error率)
  5. 避免过度优化:复杂度与收益需平衡

相关推荐

外贸独立站卡成PPT?你可能用错了对象缓存!

最近帮一个上海的电子元器件客户优化网站,发现他的WooCommerce后台操作要等5秒才能响应——查了下服务器日志,MySQL查询每秒炸出200+次!原来他的"高性能"主机根本没用对象...

搭建N8N

一、概述n8n是一款强大的工作流自动化工具,它允许用户通过可视化界面创建自动化工作流,无需编写复杂代码。作为一个开源的自动化平台,N8N支持连接各种服务和应用程序,实现数据流转和任务自动化。核心特点...

性能优化!7个策略,让Spring Boot 处理每秒百万请求

首先,我需要确定这个问题的背景。可能用户是在处理高并发的系统,或者正在设计一个需要应对大流量的应用。他们的身份可能是后端开发工程师,或者是系统架构师,对性能优化有较高需求。接下来,我要想,处理百万级的...

定时任务优化总结(从半个小时优化到秒级)

整体优化思路:1.按需查询、2.分小批次游标查询、3.JED场景下按数据库分片分组更新、4.精准定位要处理的数据、5.负载均衡业务背景:站外广告投放平台在做推广管理状态优化重构的时候,引入了...

跨境电商建站隐藏技巧:Redis缓存,让站点“记住”用户更高效

用户登录后,每次刷新页面都要重新验证身份,有时候还会出现“会话丢失”,用户不得不重新登录,体验很差找我们帮忙后,我们建议用Redis缓存会话数据。简单来说,Redis就像站点的“临时记事本”,用户登...

服务架构性能优化与Java实现

服务架构性能优化大全(附Java代码实现)一、缓存核心思想:将高频访问数据存储在高速存储中,减少慢速存储(如数据库)访问场景:读多写少的数据(用户信息、配置数据)Java实现:使用Caffeine缓存...

百万并发不是梦!Nginx高并发优化配置与性能调优全解

Nginx的最大转发能力受硬件、配置和系统参数影响,处理超高并发请求时需多维度优化和扩展。以下是具体分析和解决方案:一、Nginx最大转发能力的关键因素硬件资源CPU:Nginx依赖多核CPU,...

面试官:工作中优化MySQL的手段有哪些?

MySQL是面试中必问的模块,而MySQL中的优化内容又是常见的面试题,所以本文来看“工作中优化MySQL的手段有哪些?”。工作中常见的MySQL优化手段分为以下五大类:索引优化:确保高频查...

万字长文|RAG优化全攻略:微服务部署+动态权重策略,代码级详解

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在官网-聚客AI学院大模型应用开发微调项目实践课程学习平台从理论到实践,全面解析RAG性能瓶颈与高阶优化方案。一、RAG核心架...

在Windows环境下,本地部署和启动开源项目Ragflow的源代码

在当前AI领域中,基于检索增强生成(RAG)的应用备受关注,而开源项目RAGFlow因其灵活性和功能性成为了一个热门选择。不过,由于其快速的版本迭代,可能会存在一些Bug,并且在实际项目落地时通常需要...

这款 .NET 9 + React 后台权限管理系统太强了!支持多租户、按钮权限(简单易用且文档齐全)

前言在数字化转型浪潮中,高效且安全的权限管理是后台系统的核心基石。传统方案或依赖臃肿的三方框架,或难以满足细粒度权限需求。今天推荐一款完全独立开发、基于前沿技术栈开发的RBAC权限系统。它摒弃了现成A...

开源声明:只是一个随便写写的管理系统(认真脸)

最近微信公众号和技术博客都断更了,最近2了两周时间撸了一套管理系统的脚手架。原因是因为最近项目需要用到,但是找了一圈Github或者Gitee,基本都不合适。要么有前端,配套后端是Node而...

「第七期」深信服go实习一面二面HR面

一面面试时长:1h自我介绍channel知识点协程goroutinemysql的两种存储引擎InnoDB索引redis使用单线程还是多线程?有多少个库?redis持久化有哪些?各自优势?谁更常用?P...

Go中使用sync.Map实现线程安全的缓存

不依赖外部库,在Go中实现自己的线程安全缓存照片来源:PossessedPhotography在Unsplash缓存是优化现代应用程序性能的关键方面。它允许您存储并快速检索昂贵操作的结果或经常访...

Redis中RedisTemplate 和 StringRedisTemplate

前言:RedisTemplate和StringRedisTemplate都是Spring提供的操作Redis的模板类,但它们之间在序列化方式和使用场景上有显著区别。序列化方式不同Redi...

取消回复欢迎 发表评论: