如何使用缓存优化系统性能?
如何使用缓存优化系统性能?一、本地缓存(浏览器端)平时使用 Fiddler 或浏览器 DevTools 时,我们经常会看到一些接口返回 304 状态码 + Not Modified: 如果不了解前端缓存技术,很容易对此感到困惑。浏览器的本地缓存主要分为两种机制:协商缓存和强缓存。 1.1 协商缓存 协商缓存,顾名思义就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。 实现方式有两种,原理相同: 方案 请求头 响应头 判断依据 基于时间 If-Modified-Since Last-Modified 文件最后修改时间 基于唯一标识 If-None-Match ETag 内容哈希值 推荐 ETag 方案——它可以更准确地判断文件内容是否被修改,避免时间篡改导致的不可靠问题。 完整流程(以 ETag 为例): 首次请求:服务器返回资源的同时,在 Response 头部加上 ETag 唯一标识(根据资源内容生成) 再次请求:浏览器在 Request 头部带上 If-None-Match: <上次ETag> 服务端比对: 值相等 → 返回 30...
Java 音频文件切割与合并
Java 音频文件切割与合并需求说明 操作 说明 示例 切割 按指定时间点截取音频,保留某时刻之后的数据 一个 2 分钟的 MP3,保留第 30 秒之后的部分 合并 将一段音频拼接到另一段音频之前 在歌曲播放前插入广告/前奏 技术选型本工具基于 JavaFX 8 快速实现本地化功能。根据操作类型选择不同的第三方库: 操作 格式 技术方案 原因 切割 MP3 JAudioTagger 直接读取 MP3 帧头信息(比特率、时长),按字节偏移截取 切割 WAV Java Sound API(javax.sound.sampled) WAV 是 PCM 无压缩格式,可按采样帧精确跳转 合并 MP3/WAV JavaCV(FFmpeg 封装) 处理格式转换、码率统一、元数据复制等复杂场景 环境准备Maven 依赖12345678910111213<!-- JAudioTagger:用于读取/写入 MP3 元数据和帧头信息 --><dependency> <groupId>net.jthi...
完美复刻电视剧《三分野》中的心形代码
your browser does not support the video tag 1 分析需求画出心形并放大缩小模拟跳动 心形外部围绕一圈粒子 内部粒子随机分布,越靠近外部边缘的粒子越明显,跳动幅度越大 2 先画一个跳动的心2.1 设置画布123456789const canvas = document.createElement('canvas');const width = window.innerWidth;const height = window.innerHeight;document.body.append(canvas);const ctx = canvas.getContext('2d');ctx.strokeStyle = '#EEAEEE'ctx.fillStyle = '#EEAEEE'//将画笔移动到画布中央ctx.translate(width / 2,height / 2); 2.2 先画个心形1234567891011121314151617181920...
MapStruct 对象转换用法全指南
官网地址:http://mapstruct.org/ MapStruct 对象转换用法MapStruct 是一个编译时代码生成器,专门用于简化 Java Bean 之间的对象映射。在实际开发中,DAO 层实体和 DTO(Data Transfer Object)之间大部分字段相同、只有少数不同——手写 getter/setter 既繁琐又容易出错,而 MapStruct 只需通过注解约定就能自动生成高效、类型安全的映射代码。 它作为 Java 编译器插件工作(基于注解处理器),可在命令行或 IDE 中使用。 一、开发环境搭建(Maven)MapStruct 由两部分组成: 坐标 作用 org.mapstruct:mapstruct-jdk8 提供 @Mapper、@Mapping 等必要注解。JDK ≥ 1.8 时推荐使用此坐标以利用 Java 8 特性 org.mapstruct:mapstruct-processor 注解处理器,在编译时根据接口定义自动生成实现类 1234567891011121314<org.mapstruct.vers...
ROS Topic 通讯方式详解
[TOC] ROS Topic 通讯方式一、Topic 通讯概念在 ROS 系统中,多个 Node(节点)都需要向 ROS Master 注册。每个 Node 完成各自的功能逻辑,当节点之间需要传递数据时,ROS 提供了基于发布-订阅模式的数据通信机制。 核心角色: 角色 英文 职责 发布者 Publisher 发送消息的一方 订阅者 Subscriber 接收消息的一方 主题 Topic 消息的中转通道 与点对点的直接传输不同,ROS 将消息发布到 Topic 中,任何需要该数据的节点都可以从 Topic 中取走消息——可以理解为”聚宝盆”,东西放进去后,不管有多少人来取,都能拿到完整数据。 二、Topic 通讯实现下面分别用 C++ 和 Python 实现完整的 Publisher 与 Subscriber。 2.1 C++ 实现Publisher(发布者)12345678910111213141516171819202122232425262728293031#include "ros/ros.h"#include <io...
Redis Cluster 集群模式
Redis Cluster 集群模式一、什么是 Redis 集群**集群(Cluster)**是一组相互独立的、通过高速网络互联的计算机,它们构成一个组,以单一系统的模式对外提供服务。 二、集群 vs 哨兵:核心区别这是最容易混淆的两个概念,先理清定位: 维度 Sentinel 哨兵 Cluster 集群 解决什么问题 高可用 —— 主库宕机自动故障转移 数据分片 + 高可用 —— 超大数据集水平扩展 数据分布 所有节点保存全量数据 数据打散到各节点,每个节点只存子集 容量上限 受限于单机内存 理论上无限水平扩展 最小部署 1 主 + N 从 + M 哨兵 至少 6 个节点(3 主 3 从) 中心节点 有(Master 角色) 无中心结构,所有节点地位平等 通信协议 哨兵 → 主从:PING/PUBLISH 节点之间:Gossip 协议 简单记忆: 只要数据量单机能装下,只需要高可用 → 用 Sentinel 数据量太大单机装不下 → 必须用 Cluster 三、Redis Cluster 核心特性3.1 架构概述 版本要求...
redis-sentinel
Redis Sentinel为Redis提供了高可用解决方案。实际上这意味着使用Sentinel可以部署一套Redis,在没有人为干预的情况下去应付各种各样的失败事件。 Redis Sentinel同时提供了一些其他的功能,例如:监控、通知、并为client提供配置。 下面是Sentinel的功能列表: 监控(Monitoring):Sentinel不断的去检查你的主从实例是否按照预期在工作。 通知(Notification):Sentinel可以通过一个api来通知系统管理员或者另外的应用程序,被监控的Redis实例有一些问题。 自动故障转移(Automatic failover):如果一个主节点没有按照预期工作,Sentinel会开始故障转移过程,把一个从节点提升为主节点,并重新配置其他的从节点使用新的主节点,使用Redis服务的应用程序在连接的时候也被通知新的地址。 配置提供者(Configuration provider):Sentinel给客户端的服务发现提供来源:对于一个给定的服务,客户端连接到Sentinels来寻找当前主节点的地址。当故障转移发生的时候,Sent...
Rust 基本语法特性
Rust 基本语法特性本文梳理了 Rust 中一些常用但容易忽略的语法特性,涵盖格式化宏、编译期函数执行、闭包捕获语义、复合数据类型、泛型分发机制、引用借用规则以及常用字符串方法。 一、println! 格式化宏println! 宏支持丰富的格式化占位符,下表列出了常用的格式化形式: 占位符 含义 示例 输出说明 {} / nothing Display trait println!("{}", 2) 常规输出 {?} Debug trait println!("{:?}", 2) 调试格式 {o} 八进制 println!("{:o}", 2) → 2 {x} 十六进制(小写) println!("{:x}", 255) → ff {X} 十六进制(大写) println!("...
