Redis最佳实践——性能优化技巧之Pipeline 批量操作
Redis Pipeline批量操作在电商应用中的性能优化技巧
一、Pipeline核心原理与性能优势
1. 工作机制对比:
sequenceDiagramtitle 常规请求 vs Pipeline请求# 常规模式Client->>Redis: 命令1Redis-->>Client: 响应1Client->>Redis: 命令2Redis-->>Client: 响应2Client->>Redis: 命令3Redis-->>Client: 响应3# Pipeline模式Client->>Redis: 命令1Client->>Redis: 命令2 Client->>Redis: 命令3Redis-->>Client: 响应1Redis-->>Client: 响应2 Redis-->>Client: 响应3
2. 性能提升要素:
- 网络延迟减少:N次RTT → 1次RTT
- IO消耗降低:减少Socket上下文切换
- 吞吐量提升:单连接处理能力最大化
3. 性能测试数据:
操作规模 | 常规模式耗时 | Pipeline模式耗时 | 性能提升 |
---|---|---|---|
100次 | 120ms | 15ms | 8x |
1000次 | 980ms | 85ms | 11.5x |
10000次 | 9.2s | 720ms | 12.8x |
二、电商典型应用场景
1. 购物车批量更新
public void batchUpdateCart(String userId, Map<String, Integer> items) {try (Jedis jedis = jedisPool.getResource()) {Pipeline pipeline = jedis.pipelined();String cartKey = "cart:" + userId;items.forEach((skuId, quantity) -> {if (quantity > 0) {pipeline.hset(cartKey, skuId, quantity.toString());} else {pipeline.hdel(cartKey, skuId);}});pipeline.sync();}
}
2. 商品详情批量获取
public Map<String, Product> batchGetProducts(List<String> productIds) {Map<String, Product> result = new HashMap<>();try (Jedis jedis = jedisPool.getResource()) {Pipeline pipeline = jedis.pipelined();List<Response<Map<String, String>>> responses = new ArrayList<>();productIds.forEach(id -> {responses.add(pipeline.hgetAll("product:" + id));});pipeline.sync();for (int i = 0; i < productIds.size(); i++) {Map<String, String> data = responses.get(i).get();if (!data.isEmpty()) {result.put(productIds.get(i), convertToProduct(data));}}}return result;
}
3. 订单状态批量更新
public void batchUpdateOrderStatus(List<Order> orders) {try (Jedis jedis = jedisPool.getResource()) {Pipeline pipeline = jedis.pipelined();orders.forEach(order -> {String key = "order:" + order.getId();pipeline.hset(key, "status", order.getStatus().name());pipeline.expire(key, 7 * 86400); // 7天过期});pipeline.sync();}
}
三、Java客户端实现细节
1. Jedis Pipeline核心API:
public class PipelineDemo {// 创建PipelinePipeline pipeline = jedis.pipelined();// 异步执行命令(不立即获取响应)pipeline.set("key1", "value1");Response<String> response = pipeline.get("key1");// 同步执行并获取所有响应List<Object> responses = pipeline.syncAndReturnAll();// 异步执行(仅发送命令)pipeline.sync(); // 关闭资源(重要!)pipeline.close();
}
2. Lettuce批量操作实现:
public void lettucePipelineDemo() {RedisClient client = RedisClient.create("redis://localhost");StatefulRedisConnection<String, String> connection = client.connect();RedisAsyncCommands<String, String> async = connection.async();async.setAutoFlushCommands(false); // 禁用自动提交List<RedisFuture<?>> futures = new ArrayList<>();for (int i = 0; i < 1000; i++) {futures.add(async.set("key-" + i, "value-" + i));}async.flushCommands(); // 批量提交LettuceFutures.awaitAll(10, TimeUnit.SECONDS, futures.toArray(new RedisFuture[0]));connection.close();client.shutdown();
}
四、高级优化技巧
1. 批量规模控制:
// 分批次处理(每批500条)
int batchSize = 500;
List<List<String>> batches = Lists.partition(productIds, batchSize);batches.forEach(batch -> {try (Pipeline pipeline = jedis.pipelined()) {batch.forEach(id -> pipeline.hgetAll("product:" + id));pipeline.sync();}
});
2. 混合命令类型处理:
public void mixedCommandsDemo() {try (Jedis jedis = jedisPool.getResource()) {Pipeline pipeline = jedis.pipelined();// 不同类型命令混合Response<String> r1 = pipeline.get("user:1001:name");Response<Map<String, String>> r2 = pipeline.hgetAll("product:2001");Response<Long> r3 = pipeline.zcard("leaderboard");pipeline.sync();System.out.println("用户名:" + r1.get());System.out.println("商品详情:" + r2.get()); System.out.println("排行榜数量:" + r3.get());}
}
3. 异常处理机制:
public void safePipelineDemo() {try (Jedis jedis = jedisPool.getResource()) {Pipeline pipeline = jedis.pipelined();try {// 添加多个命令IntStream.range(0, 1000).forEach(i -> {pipeline.set("temp:" + i, UUID.randomUUID().toString());});List<Object> results = pipeline.syncAndReturnAll();// 处理结果} catch (Exception e) {pipeline.discard(); // 丢弃未提交命令throw new RedisException("Pipeline执行失败", e);}}
}
五、性能调优参数
1. 客户端配置优化:
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(100); // 最大连接数
poolConfig.setMaxIdle(20); // 最大空闲连接
poolConfig.setMinIdle(5); // 最小空闲连接
poolConfig.setTestOnBorrow(true); // 获取连接时验证
poolConfig.setTestWhileIdle(true); // 空闲时定期验证JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
2. 服务端关键配置:
# redis.conf
maxmemory 24gb # 内存限制
maxclients 10000 # 最大客户端数
tcp-backlog 511 # TCP队列长度
client-output-buffer-limit normal 0 0 0 # 禁用输出缓冲限制
六、监控与诊断
1. Pipeline使用指标:
// 集成Micrometer监控
public class PipelineMonitor {private final Counter successCounter;private final Timer pipelineTimer;public PipelineMonitor(MeterRegistry registry) {successCounter = Counter.builder("redis.pipeline.ops").tag("result", "success").register(registry);pipelineTimer = Timer.builder("redis.pipeline.latency").publishPercentiles(0.95, 0.99).register(registry);}public void executePipeline(Runnable operation) {pipelineTimer.record(() -> {try {operation.run();successCounter.increment();} catch (Exception e) {// 错误计数}});}
}
2. 慢查询分析:
# 查看慢查询日志
redis-cli slowlog get 10# 输出示例:
1) 1) (integer) 14 # 唯一ID2) (integer) 1697025661 # 时间戳3) (integer) 21500 # 耗时(微秒)4) 1) "PIPELINE" # 命令2) "SYNC"
七、生产环境最佳实践
1. 黄金法则:
- 每批次命令控制在500-1000条
- 避免在Pipeline中执行耗时命令(如KEYS)
- 混合读写操作时注意执行顺序
- 生产环境必须添加超时控制
2. 事务型Pipeline实现:
public void transactionalPipeline() {try (Jedis jedis = jedisPool.getResource()) {jedis.watch("inventory:1001");int currentStock = Integer.parseInt(jedis.get("inventory:1001"));if (currentStock > 0) {Pipeline pipeline = jedis.pipelined();pipeline.multi();pipeline.decr("inventory:1001");pipeline.lpush("order_queue", "order:1001");pipeline.exec();List<Object> results = pipeline.syncAndReturnAll();// 处理事务结果}jedis.unwatch();}
}
3. 集群环境处理:
public void clusterPipeline() {Map<String, List<String>> slotMap = new HashMap<>();// 按slot分组命令productIds.forEach(id -> {String key = "product:" + id;int slot = JedisClusterCRC16.getSlot(key);slotMap.computeIfAbsent(String.valueOf(slot), k -> new ArrayList<>()).add(id);});// 按slot分组执行slotMap.forEach((slot, ids) -> {try (Jedis jedis = getConnectionBySlot(Integer.parseInt(slot))) {Pipeline pipeline = jedis.pipelined();ids.forEach(id -> pipeline.hgetAll("product:" + id));pipeline.sync();}});
}
八、性能压测数据
测试环境:
- Redis 6.2.6 集群(3主3从)
- 16核32G服务器
- 1000并发线程
测试场景:
- 批量获取1000个商品详情
- 批量更新500个购物车记录
- 混合读写操作(200读+200写)
性能指标:
测试场景 | 常规模式QPS | Pipeline QPS | 提升倍数 | 平均延迟降低 |
---|---|---|---|---|
商品详情批量获取 | 4,200 | 38,500 | 9.1x | 88% |
购物车批量更新 | 3,800 | 41,200 | 10.8x | 91% |
混合操作 | 2,500 | 22,100 | 8.8x | 86% |
九、常见问题解决方案
1. 内存溢出预防:
// 分页处理大结果集
public void processLargeResult() {String cursor = "0";ScanParams scanParams = new ScanParams().count(100);do {ScanResult<String> scanResult = jedis.scan(cursor, scanParams);List<String> keys = scanResult.getResult();try (Pipeline pipeline = jedis.pipelined()) {keys.forEach(key -> pipeline.dump(key));List<Object> results = pipeline.syncAndReturnAll();// 处理结果}cursor = scanResult.getCursor();} while (!"0".equals(cursor));
}
2. 连接泄漏排查:
// 资源追踪装饰器
public class TrackedJedis extends Jedis {private final String creatorStack;public TrackedJedis(HostAndPort host) {super(host);this.creatorStack = Arrays.stream(Thread.currentThread().getStackTrace()).map(StackTraceElement::toString).collect(Collectors.joining("\n"));}@Overridepublic void close() {super.close();// 记录关闭日志}
}
十、总结与扩展
最佳实践总结:
- 合理分批次:控制每批命令数量
- 连接复用:使用连接池避免频繁创建
- 结果处理:异步获取响应减少阻塞
- 监控告警:关键指标实时监控
- 容错设计:异常处理和重试机制
扩展优化方向:
- Redis6特性:配合RESP3协议提升性能
- 多路复用:结合Reactor模式实现
- 混合存储:搭配本地缓存形成多级缓存
- 智能批处理:基于机器学习的动态批次调整
通过合理应用Pipeline技术,电商系统可获得:
- 10倍+吞吐量提升
- 毫秒级响应保障
- 百万级QPS处理能力
- 资源利用率优化30%+
更多资源:
https://www.kdocs.cn/l/cvk0eoGYucWA
本文发表于【纪元A梦】,关注我,获取更多免费实用教程/资源!
相关文章:
Redis最佳实践——性能优化技巧之Pipeline 批量操作
Redis Pipeline批量操作在电商应用中的性能优化技巧 一、Pipeline核心原理与性能优势 1. 工作机制对比: sequenceDiagramtitle 常规请求 vs Pipeline请求# 常规模式Client->>Redis: 命令1Redis-->>Client: 响应1Client->>Redis: 命令2Redis--&g…...
Redis 集群(Cluster)
1. Redis 集群概述 Redis 集群是一种分布式架构,旨在提供数据分区和高可用性。它能够通过将数据分散到多个节点上来扩展 Redis,使其能够处理更多的数据量和更高的并发请求。Redis 集群实现了自动分片、故障转移和复制等功能。 Redis 集群与传统的单节点…...
XSS 跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本
#MXSS : https://www.fooying.com/the-art-of-xss-1-introduction/ #UXSS : Universal Cross-Site Scripting(一般是浏览器自身的问题) UXSS 是利用浏览器或者浏览器扩展漏洞来制造产生 XSS 并执行代码的一种攻击类型。 MICR…...
数据库主从延迟全解析:原因、影响与解决之道
目录 一、引言:理解数据库主从架构 二、数据库主从延迟的定义与测量 2.1 主从延迟的技术定义 2.2 如何测量主从延迟 2.3 主从延迟对系统的影响 三、主从延迟的常见原因分析 3.1 网络延迟因素 3.1.1 网络质量与带宽限制 3.1.2 地理位置分布造成的延迟 3.2 …...
BERT、T5、ViT 和 GPT-3 架构概述及代表性应用
BERT、T5、ViT 和 GPT-3 架构概述 1. BERT(Bidirectional Encoder Representations from Transformers) 架构特点 基于 Transformer 编码器:BERT 使用多层双向 Transformer 编码器,能够同时捕捉输入序列中每个词的左右上下文信息…...
第十七天 - Jenkins API集成 - 流水线自动化 - 练习:CI/CD流程优化
前言 在DevOps实践中,持续集成与持续交付(CI/CD)是现代软件工程的核心支柱。作为业界使用最广泛的自动化服务器,Jenkins凭借其强大的插件生态和灵活的流水线配置能力,成为企业级CI/CD落地的首选工具。本文将深入解析J…...
SageAttention2
“SageAttention2: Efficient Attention with Thorough Outlier Smoothing and Per-thread INT4 Quantization”由Jintao Zhang等人撰写。文章提出SageAttention2,通过线程级INT4量化、Q矩阵平滑、两级累加策略等技术,在提升注意力计算效率的同时保持精度…...
.NET WPF 可视化树(Visual Tree)
.NET WPF 可视化树(Visual Tree) WPF 的可视化树(Visual Tree)是描述用户界面元素层级关系的核心概念之一,它与逻辑树(Logical Tree)共同构成了 WPF 的 UI 架构。以下是关于 WPF 可视化树的详细…...
磁盘存储下红黑树、B 树与 B + 树的原理、操作及对比
前置知识 磁盘 在计算机系统中,数据存储与检索效率深刻影响着整体性能。磁盘作为大容量数据的主要载体,其独特的 I/O 特性与树状数据结构的结合,催生出 B 树与 B 树这两种经典方案。了解它们如何适配磁盘存储,是揭开数据库、文…...
kubernetes》》k8s》》Volume 数据卷 PVC PV NFS
为啥需要数据卷 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重…...
支持多格式且免费的图片转换工具推荐
软件介绍 今天要给大家推荐一款超好用的开源图片格式转换工具。这款工具完全免费,没有广告的干扰,让用户在使用过程中极为舒心。 ImageConverter图片格式转换 这款工具使用起来相当便捷,无需进行安装操作,只要轻轻双击图标&…...
DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额—操作篇
专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读396次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...
K8S-证书更新时-误删除组件-
K8S 证书更新时-吴删除组件 [rootmaster ~] eth0 172.17.64.32 # docker rm -f docker ps | grep -E apiserver|scheduler|controller-manager| awk {print$1} 7856f2a3068e 2e1a6956d8a1 e9e3cb7870a9 31b19f4e2b22 c028146f88a5 abe4207808a3 [rootmaster ~] eth0 172.17.…...
第二章 Python爬虫篇—数据解析与提取
目录 一.数据解析概述 二.re解析和正则表达式 三.bs4解析-HTML语法 四.Xpath解析 此章节主要讲解:数据解析概述、re模块、bs4解析-html语法、xpath解析以及正则表达式。其中正则表达式我已经写过相关笔记,这里浅略叙述,如果不懂请看我笔记…...
数据仓库标准库模型架构相关概念浅讲
数据仓库与模型体系及相关概念 数据仓库与数据库的区别可参考:数据库与数据仓库的区别及关系_数据仓库和数据库-CSDN博客 总之,数据库是为捕获数据而设计,数据仓库是为分析数据而设计 数据仓库集成工具 在一些大厂中,其会有自…...
【区块链+ 人才服务】特范云区块链教学管理平台 | FISCO BCOS 应用案例
北京特范云科技有限公司利用大数据与人工智能等核心技术优势, 构建了“学、练、赛、评”一体化智慧体育课堂,促进教育技术、体育科学、IT 技术与体育教学的深度融合。公司首次提出了“体育动作积木”的教学概念, 通过区块链技术将学生的体测体…...
第一节:React 基础篇-React虚拟DOM原理及Diff算法优化策略
必考点:虚拟DOM树对比(同级比较、Key的作用、组件类型判断) 延伸:React 18中并发更新对Diff算法的影响 React虚拟DOM原理及Diff算法优化策略 虚拟DOM核心原理 概念: • 虚拟DOM(Virtual DOM)…...
MQTT的构成、使用场景、工作原理介绍
一、MQTT内容简介 MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议【适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的…...
idea光标变成白色方块的解决方法
在使用 IDEA 进行编程时,你可能会遇到这样一个情况:原本纤细的光标突然变成了白色粗块,这不仅影响视觉体验,还可能在输入时带来困扰。别担心,本文将为你详细剖析该问题出现的原因,并提供有效的解决办法。…...
python manimgl数学动画演示_微积分_线性代数原理_ubuntu安装问题[已解决]
1.背景 最近调研python opencv, cuda加速矩阵/向量运算, 对于矩阵的线性变换, 秩, 转秩, 行列式变化等概概念模糊不清. 大概课本依旧是天书, 于是上B站搜索线性代数, 看到 3Blue1Brown 线性变换本质 视频, 点击观看. 惊为天人 --> 豁然开朗 --> 突然顿悟 --> 开心不已…...
如何为C++实习做准备?
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
Linux 安装 vscode
使用包管理器安装(推荐) 对于基于 Debian 的系统(如 Ubuntu): sudo apt update sudo apt install software-properties-common apt-transport-https wget -qO- https://packages.microsoft.com/keys/microsoft.asc …...
淘宝商品数据实时抓取 API 开发指南:从接口申请到数据解析实战
一、引言 在当今电商蓬勃发展的时代,淘宝作为国内电商巨头,其平台上汇聚了海量商品信息。对于电商从业者、数据分析爱好者以及众多依赖淘宝商品数据开展业务的企业而言,能够实时获取淘宝商品数据具有极高价值。例如,电商运营者…...
明远智睿SSD2351核心板在物联网领域的应用实践
物联网作为当今科技发展的热门领域,将无数设备连接在一起,实现数据的采集、传输与共享,构建起一个智能化的世界。在这庞大的物联网体系中,核心板扮演着至关重要的角色,明远智睿SSD2351核心板以其独特优势,在…...
这种情况是应为VScode的版本太新了,更新到1.86版本后要求远程连接服务器的内核版本不符合条件
这种情况是应为VScode的版本太新了,更新到1.86版本后要求远程连接服务器的内核版本不符合条件 解决方法 vscode降级,使用1.86以前的版本。亲测这种方法成功解决 首先关闭VSCode自动更新 Windows下载1.85版本链接:https://update.code.visua…...
996引擎-源码学习:PureMVC Lua 中的 Facade 类
996引擎-源码学习:PureMVC Lua 中的 Facade 类 1. 核心概念1.1 外观模式1.2 多例模式2. 关键组件NotificationController:ModelView3. 主要功能4. 初始化流程5. 通信机制6. 生命周期管理1. Facade 初始化流程图2. 发送通知时序图中介者 PlayerBestRingLayerMediatorOpenLayer …...
前端学习10—Ajax
1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML 通过 AJAX 可以在浏览器中向服务器发送异步请求,最大优势为:无刷新获取数据 AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方…...
python的多线程和多进程程序编程
CPU密集型使用多进程,IO密集型使用多线程 查看进程ID和线程ID的命令分别是os.getpid()和threading.current_thread() 多进程使用multiprocessing就可以了,通常使用进程池来完成操作,阻塞主进程使用join方法 多线程使用threading模块&#…...
Python代码解释
文章目录 代码解析执行过程等价写法其他类似操作 这段代码使用了 Python 的 map() 函数和 lambda 表达式来对列表中的每个元素进行平方运算。让我详细解释一下: 代码解析 numbers [1, 2, 3, 4] squared list(map(lambda x: x**2, numbers))numbers [1, 2, 3, …...
DNS正反向解析复习,DNS主从服务,转发服务及DNS和nginx联合案例(不断更新)
正向解析 1、配置主机名 [rootlocalhost ~]# dnf install bash-completion -y #一个按tap键补全的软件 [rootlocalhost ~]# hostnamectl hostname dns #改主机名为dns [rootlocalhost ~]# exit ssh root你的IP地址 要重启才会生效2、安装bind [rootdns ~]# dnf install b…...
甜心速达智慧潮流精选超市、即时零售新业态,打造可持续发展商业模式
四川甜心速达科技有限公司、现公司运营高管团队均为美团高级运营师,公司高管团队人均获得“全国工商联人才交流服务中心”创业指导师、市场营销师等、公司致力于优化线上店铺人效比和资源匹配等问题,已经实现了对即时零售行业的资源整合,并融…...
大白话聊MySQL覆盖索引
目录 一、什么是覆盖索引?二、使用了覆盖索引 vs 没使用覆盖索引的区别三、例子说明四、总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗! …...
C++ inline和define(宏)
文章目录 Inline 函数是什么意思?C中哪些函数不能声明为inline?内联(inline)函数和 #define(宏) Inline 函数是什么意思? inline是内联的意思,可以定义比较小的函数。因为函数频繁调用会占用很多的栈空间,…...
Python中的eval()函数详解
文章目录 Python中的eval()函数详解基本语法基本用法安全性问题安全使用建议实际应用场景与exec()的区别性能考虑总结 Python中的eval()函数详解 eval()是Python的一个内置函数,用于执行字符串形式的Python表达式并返回结果。它是一个强大但需要谨慎使用的函数。 …...
rancher 解决拉取dashboard-shell镜像失败的问题
问题背景 在 Kubernetes 集群中部署 Rancher 后,点击右上角的 "Shell" 按钮时,Rancher 会动态创建一个 dashboard-shell-xxxxx Pod,用于提供 Web 终端功能。然而,由于默认镜像 rancher/shell:v0.1.21 托管在 Docker Hu…...
在Ubuntu服务器上安装Docker(支持Ubuntu 20.04/22.04等版本):
1. 卸载旧版本(如有) 如果系统曾安装过旧版Docker,先清理残留: sudo apt remove docker docker-engine docker.io containerd runc2. 添加Docker官方仓库 安装依赖工具 sudo apt update sudo apt install -y ca-certificates …...
【Linux 进程控制】—— 进程亦生生不息:起于鸿蒙,守若空谷,归于太虚
欢迎来到一整颗红豆的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由一整颗红豆原创✍️,感谢支持❤️!请尊重原创…...
K8s常用基础管理命令(一)
基础管理命令 基础命令kubectl get命令kubectl create命令kubectl apply命令kubectl delete命令kubectl describe命令kubectl explain命令kubectl run命令kubectl cp命令kubectl edit命令kubectl logs命令kubectl exec命令kubectl port-forward命令kubectl patch命令 集群管理命…...
WebChat 一款非常好用的浏览器侧边栏 AI 问答插件
文章目录 使用方法及效果展示划线引用自定义工具自定义模型设置 主要功能1. 划线引用功能2. 自定义划线工具3. 聊天功能4. 历史记录管理5. 界面特性 安装方法方法一:直接安装发布版本(推荐)方法二:从源码构建安装(开发…...
kubernetes入门篇之创建一个nginx容器
上几篇讲了部署master和worker node 及网络插件calico, 现在开始实际运行一个容器。 1. 新建nginx.yaml文件 方式1:直接创建一个pod 和一个 service,一般不直接这样创建,该方式仅适用于测试或学习 apiVersion: v1 kind: Pod …...
回顾 | 2025香港Web3嘉年华:CertiK以创新技术定义安全未来
4月6日至9日,Web3安全巨头CertiK亮相2025香港Web3嘉年华。活动期间,CertiK不仅设立独立展位与广大Web3生态参与者深入互动,更通过高层次的技术交流与前沿研究成果展示,成为本届盛会备受瞩目的焦点。 耶鲁大学计算机科学系教授、C…...
HTML5的笔记
文章目录 1.HTML的概念1.1HTML的基本骨架 2.标签语法2.1标签的关系 3.标签3.1双标签3.1.1标题标签<h1~h6>3.1.2段落标签<p>3.1.3文本格式化标签3.1.4超链接标签<a>3.1.5音频和视频标签audio和<vedio>3.1.6列表标签3.1.7表格标签 3.2单标签3.2.1换行标签…...
LeetCode.2843. 统计对称整数的数目
统计对称整数的数目 题目解题思路思路1.v1Code 思路优化1.v2Code 思路优化1.v3Code复杂度分析 题目 2843. 统计对称整数的数目 给你两个正整数 low 和 high 。 对于一个由 2 * n 位数字组成的整数 x ,如果其前 n 位数字之和与后 n 位数字之和相等,则认…...
Java常用工具算法-6--秘钥托管云服务3--微软zure Key Vault
Azure Key Vault是微软Azure提供的一项服务,旨在帮助用户安全地存储和管理敏感信息,如加密密钥、证书和密码等。它提供了一个集中的位置来保护这些重要资产,并且通过细粒度的访问控制和审计日志来确保安全性。 1、主要功能 (1&a…...
表格开启聚光灯,查看数据不错行-Excel易用宝
面对如此庞大的一个表格,每次找数据就像走迷宫一样,有时看到了数据,眼神不好的小丽小手一抖还会选择到其他数据上,我问她个数据,她经常给我报个错的数据,我说怎么数据总是对不上号。 对于大表格防看错行这…...
解决java使用easyexcel填充模版后,高度不一致问题
自定义工具,可以通过获取上一行行高设置后面所以行的高度 package org.springblade.modules.api.utils;import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.wr…...
【25软考网工笔记】第二章 数据通信基础(1)信道特性 奈奎斯特 香农定理
一、信道特性 1. 数据通信概念 1)通信系统的基本元素 通信目的: 传递信息。 信源: 产生和发送信息的一端,即信息发送的源头。 信宿: 接收信息的一端,即信息的目的地。 信道: 信源和信宿之间的通信线路,用于传输信息。 信号变换:…...
2024年React最新高频面试题及核心考点解析,涵盖基础、进阶和新特性,助你高效备战
以下是2024年React最新高频面试题及核心考点解析,涵盖基础、进阶和新特性,助你高效备战: 一、基础篇 React虚拟DOM原理及Diff算法优化策略 • 必考点:虚拟DOM树对比(同级比较、Key的作用、组件类型判断) …...
【Code】《代码整洁之道》笔记-Chapter11-系统
第11章 系统 “复杂要人命。它消磨开发者的生命,让产品难以规划、构建和测试。” 11.1 如何建造一个城市 你能自己掌管一切细节吗?大概不行。即便是管理一个既存的城市,也是靠单人能力无法做到的。不过,城市还是在运转&#…...
MySQL数据库编程总结
MySQL数据库编程总结 一、数据库概述 数据库定义 • 数据库是管理数据的软件系统,用于高效存储、管理和检索数据,减少冗余。 • 核心功能:通过SQL语言定义、操作数据,维护完整性和安全性。 常见数据库 • MySQL、Oracle、SQL Ser…...