Redisson学习专栏(三):高级特性与实战(Spring/Spring Boot 集成,响应式编程,分布式服务,性能优化)

news2025/6/1 23:05:40

文章目录

  • 前言
  • 一、Spring Boot深度整合实战
    • 1.1 分布式缓存管理
    • 1.2 声明式缓存
    • 1.3 响应式编程
  • 二、分布式服务治理
    • 2.1 服务端实现
    • 2.2 客户端调用
    • 2.3 高级特性
    • 2.4 服务治理功能
  • 三、分布式任务调度引擎
  • 四、连接池配置与网络参数调优
    • 4.1 连接池配置
    • 4.2 网络参数调优
    • 4.3 集群模式特殊配置
    • 最佳实践配置示例
  • 五、如何规避大Key
  • 总结


前言

在掌握了Redisson的基础功能后,我们已经能够熟练使用分布式集合、分布式锁、原子操作等核心功能来构建简单的分布式应用。然而,真实的生产环境往往面临着更复杂的挑战——如何将Redisson无缝融入Spring生态?如何应对高并发场景下的性能瓶颈?如何实现跨服务的协同调度?

这正是本专栏要重点探讨的内容。我们将从框架整合的实践出发,逐步深入到分布式系统设计的核心领域。通过Redisson与Spring Cache的深度集成,开发者可以轻松实现声明式的分布式缓存,而不再需要手动管理缓存逻辑。响应式API的引入则为高吞吐量系统提供了新的可能性,让我们能够以更优雅的方式处理异步数据流。


一、Spring Boot深度整合实战

在整合核心逻辑

1.1 分布式缓存管理

关键配置(application.yml):

spring:
  redis:
    redisson:
      config: |
        singleServerConfig:
          address: "redis://prod-redis:6379"  # 生产环境集群地址
          password: ${REDIS_PASSWORD}          # 从环境变量读取密码
          database: 0
          # 连接池黄金参数
          connectionPoolSize: 256              # 最大连接数 = (QPS * 平均耗时ms)/1000 * 1.5
          connectionMinimumIdleSize: 64         # 防止突发流量
          idleConnectionTimeout: 60000          # 空闲连接超时(ms)
          connectTimeout: 10000                 # 连接建立超时
          timeout: 3000                        # 命令执行超时
        threads: 32                             # 业务处理线程数
        nettyThreads: 16                        # I/O线程数

分布式Session实战:

  1. 启用配置类
@Configuration
@EnableRedissonHttpSession(
    maxInactiveIntervalInSeconds = 1800, // 30分钟会话超时
    redisNamespace = "prod:session"      // 生产环境命名空间
)
public class SessionConfig {
    
    @Bean
    public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
        // 关键:使用Redisson专用连接工厂
        return new RedissonConnectionFactory(redisson);
    }
}
  1. Session存储机制
  • 存储结构:Hash结构存储会话属性
HMSET prod:session:sid1 attribute1 "value1" attribute2 "value2"  
EXPIRE prod:session:sid1 1800
  • 优势:
    • 属性级修改(仅更新变更字段)
    • 自动续期机制(每次访问刷新TTL)
    • 会话变更事件监听(支持集群同步)
  1. 集群环境验证
@RestController
public class SessionController {

    @GetMapping("/session")
    public String testSession(HttpSession session) {
        // 写入会话
        session.setAttribute("lastAccess", Instant.now());
        
        // 跨服务读取验证
        return "Session ID: " + session.getId() + 
               " | Last Access: " + session.getAttribute("lastAccess");
    }
}

测试流程:
1. 请求服务A:GET /session → 返回SessionId: sid1
2. 请求服务B:携带Cookie JSESSIONID=sid1
3. 服务B正确返回服务A写入的时间戳

1.2 声明式缓存

核心注解全解

注解等效命令适用场景Redisson优化项
@CacheableGET + SET读多写少支持TTL与本地缓存联动
@CachePutSET强制更新缓存原子化写入保证一致性
@CacheEvictDEL数据变更时失效缓存支持模式匹配删除(keyPattern)
@Caching复合操作多缓存操作组合支持事务内执行

高级参数配置:

@Cacheable(
    value = "financialReports", 
    key = "#year + '_' + #quarter",
    condition = "#year >= 2020",  // 满足条件才缓存
    unless = "#result == null || #result.isSensitive()",  // 结果过滤
    cacheManager = "secureCacheManager"  // 指定加密缓存管理器
)
public Report getAnnualReport(int year, String quarter) {
    return reportService.generate(year, quarter);
}

缓存数据结构设计
Redisson存储格式:

# String结构(简单类型)
SET cacheName:key value EX 3600

# Hash结构(对象类型)
HSET cacheName:key 
    field1 value1 
    field2 value2
EXPIRE cacheName:key 3600

动态TTL控制

  1. 时间维度策略
@Cacheable(
    value = "seasonalProducts",
    key = "#productId",
    cacheManager = "dynamicTTLCacheManager"
)
public Product getProduct(String productId) {
    return productService.findById(productId);
}

// 动态TTL配置
@Bean
public CacheManager dynamicTTLCacheManager(RedissonClient redisson) {
    return new RedissonSpringCacheManager(redisson) {
        @Override
        protected CacheConfig createDefaultConfig() {
            return new CacheConfig(
                TimeUnit.HOURS.toMillis(1),  // 默认1小时
                TimeUnit.MINUTES.toMillis(30)
            ) {
                @Override
                public long getTTL() {
                    // 旺季延长缓存时间
                    return isPeakSeason() ? 
                        TimeUnit.DAYS.toMillis(7) : 
                        super.getTTL();
                }
            };
        }
    };
}
  1. 热点数据识别
@Cacheable(
    value = "hotItems",
    key = "#itemId",
    cacheManager = "adaptiveCacheManager"
)
public Item getItem(String itemId) {
    return itemService.load(itemId);
}

// 自适应缓存配置
public class AdaptiveCacheManager extends RedissonSpringCacheManager {
    private final HotKeyDetector hotKeyDetector;

    @Override
    protected CacheConfig getCacheConfig(String cacheName, String key) {
        CacheConfig config = super.getCacheConfig(cacheName);
        if (hotKeyDetector.isHotKey(key)) {
            config.setMaxIdleTime(TimeUnit.HOURS.toMillis(24)); // 热点数据延长
        }
        return config;
    }
}

1.3 响应式编程

Reactive API实战流处理
注入响应式客户端:

@Autowired 
private RedissonReactiveClient reactiveClient; 

订单流处理示例:

public Flux<Order> getHotOrders() { 
    RScoredSortedSetReactive<Order> orderSet =  
        reactiveClient.getScoredSortedSet("hot_orders"); 

    return orderSet.entryRangeReversed(0, 9) 
        .flatMap(entry -> orderRepository.findById(entry.getValue())) 
        .onErrorResume(e -> Metrics.recordFailure("hot_orders")); 
} 

背压机制天然支撑10万+/秒订单流处理,延迟低于50ms。

二、分布式服务治理

Redisson的分布式远程服务(Remote Service)功能提供了一种简单高效的方式来实现跨JVM的Java方法调用,使得开发者可以像调用本地方法一样调用远程服务,主要基于Redis的发布/订阅机制实现,下面给出架构图。
Redisson RPC架构

2.1 服务端实现

基本服务注册:

// 获取远程服务实例
RRemoteService remoteService = redisson.getRemoteService();

// 服务实现类
public class MyServiceImpl implements MyService {
    @Override
    public String doSomething(String param) {
        return "Processed: " + param;
    }
}

// 注册服务
MyService serviceImpl = new MyServiceImpl();
remoteService.register(MyService.class, serviceImpl);

注册带有超时设置的服务:

// 设置服务超时时间为5秒
remoteService.register(MyService.class, serviceImpl, 5);

异步服务注册:

// 异步执行的服务实现
public class MyAsyncServiceImpl implements MyAsyncService {
    @Override
    public RFuture<String> doSomethingAsync(String param) {
        // 返回Redisson的RFuture对象
        return RedissonPromise.newSucceededFuture("Async: " + param);
    }
}

// 注册异步服务
remoteService.register(MyAsyncService.class, new MyAsyncServiceImpl());

2.2 客户端调用

同步调用:

RRemoteService remoteService = redisson.getRemoteService();
MyService service = remoteService.get(MyService.class);

// 同步调用
String result = service.doSomething("test");
System.out.println(result); // 输出: Processed: test

异步调用:

MyAsyncService asyncService = remoteService.get(MyAsyncService.class);

// 异步调用
RFuture<String> future = asyncService.doSomethingAsync("asyncTest");
future.onComplete((result, exception) -> {
    if (exception != null) {
        exception.printStackTrace();
    } else {
        System.out.println(result); // 输出: Async: asyncTest
    }
});

带超时的调用:

// 设置调用超时时间为3秒
MyService service = remoteService.get(MyService.class, 3);

try {
    String result = service.doSomething("timeoutTest");
} catch (RemoteServiceTimeoutException e) {
    // 处理超时异常
    e.printStackTrace();
}

2.3 高级特性

负载均衡:

// 获取带有负载均衡的服务
MyService service = remoteService.get(MyService.class, 
    new RoundRobinLoadBalancer()); // 轮询策略

// 可用的负载均衡器:
// - RandomLoadBalancer (随机)
// - RoundRobinLoadBalancer (轮询)
// - WeightedRoundRobinLoadBalancer (加权轮询)

服务Ack确认:

// 注册服务时设置需要ack确认
remoteService.register(MyService.class, serviceImpl, true);

// 客户端调用
MyService service = remoteService.get(MyService.class);
service.doSomething("ackTest"); // 会等待服务端确认收到请求

自定义编解码器:

// 实现自定义编解码器
public class CustomCodec implements Codec {
    // 实现encode和decode方法
}

// 使用自定义编解码器注册服务
remoteService.register(MyService.class, serviceImpl, new CustomCodec());

// 客户端使用相同编解码器获取服务
MyService service = remoteService.get(MyService.class, new CustomCodec());

2.4 服务治理功能

服务发现:

// 获取所有已注册的服务名称
Collection<String> services = remoteService.getRegisteredServices();

// 获取特定服务的所有实例
Collection<RemoteServiceServer> servers = remoteService.getNodes(MyService.class);
for (RemoteServiceServer server : servers) {
    System.out.println("Server: " + server.getAddr());
}

服务调用统计:

// 获取服务调用统计信息
RemoteServiceStats stats = remoteService.getStats(MyService.class);
System.out.println("Total calls: " + stats.getTotalCalls());
System.out.println("Failed calls: " + stats.getFailedCalls());
System.out.println("Average time: " + stats.getAverageTime());

写到这里是不是感觉Redisson的功能很强大,但是实际大型项目还是建议使用Dubbo等大型框架去进行RPC调用,主是因为Dubbo 基于 Netty,性能比 Redisson(基于 Redis PUB/SUB)更高,适合高并发场景。还有就是Dubbo 提供 熔断动态路由权重调整 等能力,Redisson 没有这些功能。Redisson提供的分布式治理功能大家感兴趣可以自己玩玩。

三、分布式任务调度引擎

Redisson的分布式任务调度引擎特别适合需要在分布式环境下执行定时任务、延迟任务和并行任务的场景,能够有效解决传统单机任务调度器在分布式环境下的局限性。
核心组件:

  1. RScheduler
    调度器接口,主要方法包括:
// 调度一次性任务
ScheduledFuture<?> schedule(Runnable task, long delay, TimeUnit unit);

// 调度固定延迟的周期性任务
ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, 
                                        long initialDelay, 
                                        long delay, 
                                        TimeUnit unit);

// 使用CRON表达式调度任务
ScheduledFuture<?> schedule(String cronExpression, Runnable task);
  1. RExecutorService
    分布式执行服务,用于执行已提交的Runnable或Callable任务。
  2. ScheduledFuture
    表示异步调度的结果,可用于取消任务或检查任务状态。

基本使用:

// 创建Redisson客户端
RedissonClient redisson = Redisson.create(config);

// 获取调度器实例
RScheduler scheduler = redisson.getExecutorService("myScheduler").getScheduler();

// 调度一个10秒后执行的一次性任务
scheduler.schedule(() -> {
    System.out.println("Task executed at: " + new Date());
}, 10, TimeUnit.SECONDS);

// 调度一个每分钟执行一次的周期性任务
scheduler.scheduleWithFixedDelay(() -> {
    System.out.println("Periodic task executed at: " + new Date());
}, 0, 1, TimeUnit.MINUTES);

// 使用CRON表达式调度任务
scheduler.schedule("0 0/5 * * * ?", () -> {
    System.out.println("CRON task executed at: " + new Date());
});

分布式Worker示例:

public class DistributedWorker {
    public static void main(String[] args) {
        Config config = new Config();
        config.useClusterServers()
              .addNodeAddress("redis://127.0.0.1:7000");
        
        RedissonClient redisson = Redisson.create(config);
        RExecutorService executor = redisson.getExecutorService("myExecutor");
        
        // 提交任务
        executor.submit(() -> {
            System.out.println("Distributed task executed by worker");
            return "result";
        });
        
        // 关闭客户端(不会立即关闭,会等待任务完成)
        redisson.shutdown();
    }
}

高级特性:

  1. 任务重试
    Redisson支持任务执行失败时的自动重试机制:
RScheduledExecutorService executor = redisson.getExecutorService("myExecutor");
executor.registerWorkers(WorkerOptions.defaults()
    .retryAttempts(3)  // 重试次数
    .retryInterval(5, TimeUnit.SECONDS)  // 重试间隔
);
  1. 任务拦截器
    可以通过实现TaskListener接口来监听任务生命周期事件:
executor.addListener(new TaskListener() {
    @Override
    public void onStarted(String taskId) {
        System.out.println("Task started: " + taskId);
    }
    
    @Override
    public void onComplete(String taskId) {
        System.out.println("Task completed: " + taskId);
    }
    
    @Override
    public void onError(String taskId, Throwable exception) {
        System.out.println("Task failed: " + taskId);
    }
});
  1. 任务分片
    对于大数据量处理,可以使用任务分片:
RScheduledExecutorService executor = redisson.getExecutorService("myExecutor");
executor.schedule(new RunnableTask() {
    @Override
    public void run() {
        // 任务逻辑
    }
    
    @Override
    public List<Object> getTasks() {
        // 返回分片列表
        return Arrays.asList("shard1", "shard2", "shard3");
    }
}, new CronSchedule("0 0/5 * * * ?"));

集群环境定时任务
任务定义:

public class DataCleanTask implements Runnable, Serializable { 
    @Override 
    public void run() { 
        log.info("Cleaning expired data at {}", Instant.now()); 
        dataService.cleanExpired(); 
    } 
} 

分布式调度:

RScheduledExecutorService executor =  
    redisson.getExecutorService("globalCleaner"); 

executor.scheduleAtFixedRate( 
    new DataCleanTask(), 
    TimeUnit.DAYS.toMillis(1),  // 初始延迟 
    TimeUnit.DAYS.toMillis(1)   // 执行间隔 
); 

Redisson的分布式任务调度引擎为分布式系统提供了强大而灵活的任务调度能力,是构建可靠分布式应用的理想选择。

四、连接池配置与网络参数调优

4.1 连接池配置

  1. 核心连接池参数
    在Redisson配置中,连接池主要通过以下参数控制:
Config config = new Config();
config.useSingleServer()
      // 连接池参数
      .setConnectionPoolSize(64)          // 最大连接数
      .setConnectionMinimumIdleSize(24)   // 最小空闲连接数
      .setIdleConnectionTimeout(10000)    // 空闲连接超时时间(毫秒)
      .setConnectTimeout(1000)            // 连接超时时间(毫秒)
      .setTimeout(3000)                   // 命令等待超时时间(毫秒)
      .setRetryAttempts(3)                // 命令失败重试次数
      .setRetryInterval(1500);            // 命令重试间隔时间(毫秒)
  1. 连接池参数详解
参数名默认值说明推荐值(生产环境)
connectionPoolSize64最大连接数根据QPS调整,一般50-500
connectionMinimumIdleSize24最小空闲连接数最大连接数的1/3到1/2
idleConnectionTimeout10000空闲连接超时时间(ms)60000-120000
connectTimeout10000连接建立超时时间(ms)1000-3000
timeout3000命令执行超时时间(ms)根据业务调整
retryAttempts3命令重试次数2-5
retryInterval1500命令重试间隔(ms)1000-3000
  1. 连接池配置原则
  • 连接数计算:理想连接数 ≈ QPS × 平均响应时间(秒),例如:QPS=1000,平均响应时间=10ms,理论需要10个连接,实际应留有余量,建议设置为理论值的1.5-2倍。
  • 空闲连接设置:应避免频繁创建/销毁连接,生产环境建议最小空闲连接数不低于10。
  • 超时设置:连接超时应小于服务超时,命令超时应根据业务容忍度设置。

4.2 网络参数调优

  1. 网络相关核心参数
config.useSingleServer()
      // 网络参数
      .setKeepAlive(true)                 // 启用TCP Keepalive
      .setTcpNoDelay(true)                // 启用TCP_NODELAY
      .setPingConnectionInterval(30000)   // PING命令间隔(ms)
      .setSslEnableEndpointIdentification(true) // SSL端点验证
      .setSslProvider(SslProvider.JDK)    // SSL实现
      .setSslTruststorePassword("password") // SSL信任库密码
      .setSslKeystorePassword("password");  // SSL密钥库密码
  1. 网络参数详解
参数名默认值说明优化建议
keepAlivefalseTCP Keepalive生产环境建议true
tcpNoDelaytrue禁用Nagle算法保持true
pingConnectionInterval30000PING命令间隔(ms)60000
sslEnableEndpointIdentificationtrueSSL端点验证生产环境必须true
sslProviderJDKSSL实现高性能场景可用OPENSSL
  1. 高级网络配置
    Netty参数调优:
    Redisson底层使用Netty,可通过以下方式调优:
config.setTransportMode(TransportMode.NIO)  // 传输模式
      .setNettyThreads(32)                 // Netty线程数
      .setEventLoopGroup(new NioEventLoopGroup()) // 自定义EventLoopGroup
      .setUseLinuxNativeEpoll(true);        // 启用Epoll(Linux)

优化建议:

  • Linux环境开启Epoll:setUseLinuxNativeEpoll(true)
  • Netty线程数建议设置为CPU核心数的2-4倍
  • 高吞吐场景可使用TransportMode.EPOLL(Linux)或TransportMode.KQUEUE(Mac)

DNS监控:

config.setDnsMonitoringInterval(5000); // DNS监控间隔(ms)

4.3 集群模式特殊配置

  1. 集群连接池配置
config.useClusterServers()
      .setMasterConnectionPoolSize(64)     // 主节点连接池大小
      .setSlaveConnectionPoolSize(64)     // 从节点连接池大小
      .setMasterConnectionMinimumIdleSize(24) // 主节点最小空闲
      .setSlaveConnectionMinimumIdleSize(24)  // 从节点最小空闲
      .setScanInterval(2000);             // 集群状态扫描间隔(ms)
  1. 读写分离配置
config.useClusterServers()
      .setReadMode(ReadMode.SLAVE)        // 优先从从节点读取
      .setSubscriptionMode(SubscriptionMode.SLAVE); // 订阅从从节点

最佳实践配置示例

Config config = new Config();
config.useClusterServers()
      .addNodeAddress("redis://127.0.0.1:7000")
      // 连接池配置
      .setMasterConnectionPoolSize(128)
      .setSlaveConnectionPoolSize(128)
      .setMasterConnectionMinimumIdleSize(32)
      .setSlaveConnectionMinimumIdleSize(32)
      // 超时配置
      .setConnectTimeout(2000)
      .setTimeout(5000)
      .setIdleConnectionTimeout(60000)
      // 重试配置
      .setRetryAttempts(3)
      .setRetryInterval(1000)
      // 网络配置
      .setKeepAlive(true)
      .setTcpNoDelay(true)
      .setPingConnectionInterval(60000)
      // 集群配置
      .setScanInterval(3000)
      // Netty配置
      .setNettyThreads(48);
      
if (Linux.isLinux()) {
    config.setTransportMode(TransportMode.EPOLL)
          .setUseLinuxNativeEpoll(true);
}

通过以上详细的连接池配置和网络参数调优,可以显著提升Redisson的性能和稳定性,适应不同的生产环境需求。实际配置应根据具体业务场景、硬件配置和性能测试结果进行调整。

五、如何规避大Key

大Key问题是指Redis中存储的某些Key对应的Value过大,导致内存占用高、操作阻塞、网络负载大等问题。以下是Redisson处理大Key问题的几种策略:

  • 分片存储策略
// 用户标签分片存储 
public void addUserTag(Long userId, String tag) { 
    int shard = userId % 16; 
    RSet<String> tagSet = redisson.getSet("user_tags:" + shard); 
    tagSet.add(tag); 
} 
  • 使用过期时间:为可能变大的Key设置过期时间
RMapCache<String, String> map = redisson.getMapCache("myMap");
map.put("key", "value", 10, TimeUnit.MINUTES); // 10分钟后过期
  • 分布式集合:对于大型集合,Redisson提供了分布式实现
RSetCache<String> distributedSet = redisson.getSetCache("mySet");
RList<String> distributedList = redisson.getList("myList");

总结

通过本专栏,您已掌握Redisson在复杂分布式系统中的工业化应用。当这些技术组合发力时,Redis将不再是简单的缓存,而是成为分布式系统的核心中枢。接下来,我们将在专栏四中展现Redisson实战应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2393444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为欧拉系统中部署FTP服务与Filestash应用:实现高效文件管理和共享

华为欧拉系统中部署FTP服务与Filestash应用:实现高效文件管理和共享 前言一、相关服务介绍1.1 Huawei Cloud EulerOS介绍1.2 Filestash介绍1.3 华为云Flexus应用服务器L实例介绍二、本次实践介绍2.1 本次实践介绍2.2 本次环境规划三、检查云服务器环境3.1 登录华为云3.2 SSH远…

基于Docker和YARN的大数据环境部署实践最新版

基于Docker和YARN的大数据环境部署实践 目的 本操作手册旨在指导用户通过Docker容器技术&#xff0c;快速搭建一个完整的大数据环境。该环境包含以下核心组件&#xff1a; Hadoop HDFS/YARN&#xff08;分布式存储与资源调度&#xff09;Spark on YARN&#xff08;分布式计算…

【大模型】Bert

一、背景与起源 上下文建模的局限&#xff1a;在 BERT 之前&#xff0c;诸如 Word2Vec、GloVe 等词向量方法只能给出静态的词表示&#xff1b;而基于单向或浅层双向 LSTM/Transformer 的语言模型&#xff08;如 OpenAI GPT&#xff09;只能捕捉文本从左到右&#xff08;或右到…

3 分钟学会使用 Puppeteer 将 HTML 转 PDF

需求背景 1、网页存档与文档管理 需要将网页内容长期保存或归档为PDF,确保内容不被篡改或丢失,适用于法律文档、合同、技术文档等场景。PDF格式便于存储和检索。 2、电子报告生成 动态生成的HTML内容(如数据分析报告、仪表盘)需导出为PDF供下载或打印。PDF保留排版和样…

速通《Sklearn 与 TensorFlow 机器学习实用指南》

1.机器学习概览 1.1 什么是机器学习 机器学习是通过编程让计算机从数据中进行学习的科学。 1.2 为什么使用机器学习&#xff1f; 使用机器学习&#xff0c;是为了让计算机通过数据自动学习规律并进行预测或决策&#xff0c;无需显式编程规则。 1.3 机器学习系统的类型 1.…

Ubuntu 下搭建ESP32 ESP-IDF开发环境,并在windows下用VSCode通过SSH登录Ubuntu开发ESP32应用

Ubuntu 下搭建ESP32 ESP-IDF开发环境&#xff0c;网上操作指南很多&#xff0c;本来一直也没有想过要写这么一篇文章。因为我其实不太习惯在linux下开发应用&#xff0c;平时更习惯windows的软件操作&#xff0c;只是因为windows下开发ESP32的应用编译时太慢&#xff0c;让人受…

NodeMediaEdge接入NodeMediaServer

如何使用NME接入NMS 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 通过云平台协议注册到NodeMediaServer后&#xff0c;可以同NodeMediaServer结合使用。使用图形化的管理…

【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤

在Java开发的世界里&#xff0c;选择一个强大的集成开发环境&#xff08;IDE&#xff09;是迈向高效编程的第一步。而IntelliJ IDEA无疑是Java开发者中最受欢迎的选择之一。它以其强大的功能、智能的代码辅助和简洁的用户界面&#xff0c;帮助无数开发者快速构建和部署Java项目…

PHP7+MySQL5.6 查立得源码授权系统DNS验证版

# PHP7MySQL5.6 查立得源码授权系统DNS验证版 ## 一、系统概述 本系统是一个基于PHP7和MySQL5.6的源码授权系统&#xff0c;使用DNS TXT记录验证域名所有权&#xff0c;实现对软件源码的授权保护。 系统支持多版本管理&#xff0c;可以灵活配置不同版本的价格和下载路径&#…

【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack (下)

1.目标 网址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 我们知道了 sign P(n.data)&#xff0c;其中n.data是明文的请求参数 2.webpack生成data加密参数 那么 L(n.data)就是密文的请求参数。返回一个Promise {<pending>}&#xff0c;所以L(n.data) 是一个异步函数…

3D虚拟工厂

1、在线体验 3D虚拟工厂在线体验 vue3three.jsblender 2、功能介绍 1. 全屏显示功能2. 镜头重置功能3. 企业概况信息模块4. 标签隐藏/显示功能5. 模型自动旋转功能6. 办公楼分层分解展示7. 白天/夜晚 切换8. 场景资源预加载功能9. 晴天/雨天/雾天10. 无人机视角模式11. 行人…

http传输协议的加密

创建目录存放签证 [rootserver100 ~]# mkdir /etc/nginx/certs [rootserver100 ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/nginx/certs/timinglee.org.key -x509 -days 365 -out /etc/nginx/certs/timinglee.org.crt ..................................…

半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司

半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司 微振控制在现行国家标准《电子工业洁净厂房设计规范》GB50472中有关微振控制的规定主要有&#xff1a;洁净厂房的微振控制设施的设计分阶段进行&#xff0c;应包括设计、施工和投产等各阶段的微振测试、厂房建…

常见压缩算法性能和压缩率对比 LZ4 LZO ZSTD SNAPPY

网传压缩算法对比表 算法压缩率压缩速度解压速度支持流式压缩适用场景LZ4低极快极快是实时数据压缩、日志压缩、内存缓存等Zstandard高快快是文件压缩、网络传输、数据库备份等Brotli很高中等快是静态资源压缩&#xff08;HTML、CSS、JS&#xff09;等LZO低极快快是嵌入式系统…

Spring Boot 应用中实现配置文件敏感信息加密解密方案

Spring Boot 应用中实现配置文件敏感信息加密解密方案 背景与挑战 &#x1f6a9;一、设计目标 &#x1f3af;二、整体启动流程 &#x1f504;三、方案实现详解 ⚙️3.1 配置解密入口&#xff1a;EnvironmentPostProcessor3.2 通用解密工具类&#xff1a;EncryptionTool 四、快速…

【TTS】基于GRPO的流匹配文本到语音改进:F5R-TTS

论文地址&#xff1a;https://arxiv.org/abs/2504.02407v3 摘要 我们提出了F5R-TTS&#xff0c;这是一种新颖的文本到语音(TTS)系统&#xff0c;它将群体相对策略优化(GRPO)集成到基于流匹配的架构中。 通过将流匹配TTS的确定性输出重新表述为概率高斯分布&#xff0c;我们的方…

动态规划-152.乘积最大子数组-力扣(LeetCode)

一、题目解析 根据示例nums数组中存在负数&#xff0c;下面分析时需注意 二、算法原理 1、状态表示 此时f[i]表示&#xff1a;以i位置为结尾的所有子数组中的最大乘积&#xff0c;但是由于nums中存在负数&#xff0c;所以还需要g[i]表示&#xff1a;以i位置为结尾的所有子数组…

1-1 初探Dart编程语言

Dart 是 Google 最初开发的一种开源编程语言&#xff0c;适用于客户端与服务端开发。它配套提供 Dart SDK&#xff0c;其中包含 Dart 编译器、Dart 虚拟机&#xff08;Dart VM&#xff09;以及一个名为 dart2js 的工具&#xff0c;可将 Dart 脚本转换为 JavaScript&#xff0c;…

搭建最新版开源监控平台SigNoz踩的坑

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权并注明出处。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 一、前言 SigNoz 是一款开源应用程序性能监控工具&#xff0c;在往期相关文章&#xff08;文末有链接&#xff09;中…

无人机多人协同控制技术解析

一、运行方式 无人机多人点对点控制通常采用以下两种模式&#xff1a; 1. 主从控制模式 指定一个主控用户拥有最高优先级&#xff0c;负责飞行路径规划、紧急操作等关键指令&#xff1b;其他用户作为观察者&#xff0c;仅能查看实时画面或提交辅助指令&#xff0c;需经主…