当前位置: 首页 > news >正文

缓存使用纪要

一、本地缓存:Caffeine

1、简介

Caffeine是一种高性能、高命中率、内存占用低的本地缓存库,简单来说它是 Guava Cache 的优化加强版,是当下最流行、最佳(最优)缓存框架。

Spring5 即将放弃掉 Guava Cache 作为缓存机制,而改用 Caffeine 作为新的本地 Cache 的组件,这对于 Caffeine 来说是一个很大的肯定。为什么 Spring 会这样做呢?其实在 Caffeine 的Benchmarks[3]里给出了极具说服力的数据,对于读和写的场景,和其他几个缓存工具进行了比较,Caffeine 的性能都表现很突出。

https://zhuanlan.zhihu.com/p/610410926

从上图可以看出Caffine性能远超其他本地缓存框架,所以本地缓存用它准没错~~
Caffeine其性能突出表现得益于采用了W-TinyLFU(LUR和LFU的优点结合)开源的缓存技术,缓存性能接近理论最优,同时借鉴了 Guava Cache 大部分的概念(诸如核心概念Cache、LoadingCache、CacheLoader、CacheBuilder等等,几乎可以保证开发人员从Guava Cache 到Caffeine的无缝切换,Caffeine可谓是站在巨人肩膀上呱呱落地的,并且做到了精益求精。

2、用法

Caffeine借鉴了 Guava Cache 大部分的概念(诸如核心概念Cache、LoadingCache、CacheLoader、CacheBuilder)等等,所以数据加载方式都是一个套路

1)缓存类型

Caffeine提供了多种缓存类型:
从同步、异步的角度来说有

#	1、同步加载的缓存:Cache
Cache<Object, Object> cache = Caffeine.newBuilder().maximumSize(10).expireAfterWrite(1, TimeUnit.SECONDS).build();cache.put("1","张三");
System.out.println(cache.getIfPresent("1"));#	2、异步加载的缓存:AsnyncCache
AsyncCache<String, User> asyncCache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(5, TimeUnit.MINUTES).buildAsync();// 手动提交异步加载任务
CompletableFuture<User> future = asyncCache.get("user1", key -> userDao.getUserAsync(key));
future.thenAccept(user -> System.out.println("异步加载完成:" + user));

从手动加载、自动加载的角度来说有

#	1、手动加载的:Cache、AsnyncCache#	2、自动加载的:LoadingCache、LoadingAsnyncCache
LoadingCache<String, String> dictionaryCache = Caffeine.newBuilder().maximumSize(500).expireAfterWrite(60 * 12, TimeUnit.MINUTES).removalListener(new DictionaryRemovalListener()).recordStats().build(new DictionaryLoader());
-- 或者 --
AsyncLoadingCache<String, String> asyncLoadingCache = Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.SECONDS).maximumSize(10).buildAsync(key -> {Thread.sleep(1000);return new Date().toString();});//异步缓存返回的是CompletableFuture
CompletableFuture<String> future = asyncLoadingCache.get("1");
future.thenAccept(System.out::println);

2)常用的缓存属性

缓存初始容量

initialCapacity :整数,表示能存储多少个缓存对象。
为什么要设置初始容量呢?
因为如果提前能预估缓存的使用大小,那么可以设置缓存的初始容量,以免缓存不断地进行扩容,致使效率不高。

最大容量

maximumSize :最大容量,如果缓存中的数据量超过这个数值,Caffeine 会有一个异步线程来专门负责清除缓存,按照指定的清除策略来清除掉多余的缓存
注意,清除多余缓存不会立即执行,需要时间;比如最大容量为3,当添加第4个缓存后立即获取缓存数量可能发现是4,因为此时Caffeine的异步线程还没来得及根据策略清除多余的缓存,等待一段时间再查就变成3了。

最大权重(比较少用)

maximumWeight :最大权重,可以为存入缓存的每个元素都设置一个权重值,当缓存中所有元素的权重值超过最大权重时,就会触发异步清除。

static class Student{Integer age;String name;
}Caffeine<String, Student> caffeine = Caffeine.newBuilder().maximumWeight(30).weigher((String key, Student value)-> value.getAge()).build();cache.put("one", new Student(12, "one"));
cache.put("two", new Student(18, "two"));
cache.put("three", new Student(1, "three"));
TimeUnit.SECONDS.sleep(10);
System.out.println(cache.estimatedSize());  // 2
System.out.println(cache.getIfPresent("two")); // null#	如上示例,以缓存对象的age为权重值,并设置最大权重为30
#	当放入缓存对象的age之和超过30时,会执行异步清除(需要时间)
#	应该是依次清除占比最大的,直到低于最大权重值
过期策略

expireAfterAccess: 根据最后一次访问时间和当前时间间隔,超过指定值触发清除,注意:这里访问包括读取和写入

expireAfterWrite: 某个数据在多久没有被更新后,就过期。

refreshAfterWrite: 写操作完成后多久才将数据刷新进缓存中,即通过LoadingCache.refresh(K)进行异步刷新, 如果想覆盖默认的刷新行为, 可以实现CacheLoader.reload(K, V)方法

上面是基于时间实现过期清除的,Cadfeine也提供基于软/弱引用实现过期,但是比较复杂、我没搞懂

清除、更新监听

removalListener: 当缓存中的数据发送更新,或者被清除时,就会触发监听器:
removalListener 方法的参数是一个 RemovalListener 对象,但是可以函数式传参,当数据被更新或者清除时,会给监听器提供三个内容,(键,值,原因)分别对应代码中的三个参数,(键,值)都是更新前,清除前的旧值, 这样可以了解到清除的详细了

清除的原因有 5 个,存储在枚举类 RemovalCause 中:
EXPLICIT : 表示显式地调用删除操作,直接将某个数据删除。
REPLACED:表示某个数据被更新。
EXPIRED:表示因为生命周期结束(过期时间到了),而被清除。
SIZE:表示因为缓存空间大小受限,总权重受限,而被清除。
COLLECTED : 英文意思“冷静”,这个不明白。

public class CaffeineCacheRemovalListener implements RemovalListener<Object, Object> {@Overridepublic void onRemoval(@Nullable Object k, @Nullable Object v, @NonNull RemovalCause cause) {log.info("[移除缓存] key:{} reason:{}", k, cause.name());// 超出最大缓存if (cause == RemovalCause.SIZE) {}// 超出过期时间if (cause == RemovalCause.EXPIRED) {// do something}// 显式移除if (cause == RemovalCause.EXPLICIT) {// do something}// 旧数据被更新if (cause == RemovalCause.REPLACED) {// do something}}
}
缓存状态与统计

默认情况下,缓存的状态会用一个 CacheStats 对象记录下来,通过访问 CacheStats 对象就可以知道当前缓存的各种状态指标,指标如下所示:
totalLoadTime :总共加载时间。
loadFailureRate :加载失败率,= 总共加载失败次数 / 总共加载次数
averageLoadPenalty :平均加载时间,单位-纳秒
evictionCount :被淘汰出缓存的数据总个数
evictionWeight :被淘汰出缓存的那些数据的总权重
hitCount :命中缓存的次数
hitRate :命中缓存率
loadCount :加载次数
loadFailureCount :加载失败次数
loadSuccessCount :加载成功次数
missCount :未命中次数
missRate :未命中率
requestCount :用户请求查询总次数

3、实例

思路:
1)如果是mvc架构,就直接定义一个共用的util或者配置类加载缓存即可;
2)如果是ddd设计模式,建议直接在基础层新建一个配置类,配置类加载的时候初始化;
然后在repo调用这个缓存配置类对外暴露的查询方法获取缓存;
不同领域的app层的ervice调用repo获取缓存、使用。

@Component
@Slf4j
public class DictionaryCache {//	定义默认值,用于兜底private static final Map<String, String> defaultDictionaryMap = new HashMap<>(10);static {defaultDictionaryMap.put(CommonConstants.Dictionary.KEY_ELECTRICITY_ACTP, CommonConstants.Dictionary.VAL_ELECTRICITY_ACTP);defaultDictionaryMap.put(CommonConstants.Dictionary.KEY_NO_ACTP_MONIT_TIME, CommonConstants.Dictionary.VAL_NO_ACTP_MONIT_TIME);}//	定义缓存LoadingCache<String, String> dictionaryCache;//	注入查询实例,例如dao、delegate等@Resourceprivate SystemDelegate systemDelegate;//	初始化@PostConstructpublic void init() {dictionaryCache = Caffeine.newBuilder().maximumSize(500)	//	容量.expireAfterWrite(12 * 60, TimeUnit.MINUTES)	//	过期时间.removalListener(new DictionaryRemovalListener())	//	清楚or更新监听.recordStats()	//	统计.build(new DictionaryLoader());}//	加载class DictionaryLoader implements CacheLoader<String, String> {@Overridepublic String load(@NotNull String dicCode) {try {DictionaryQuery query = new DictionaryQuery();query.setDicParentCode("dic_type");List<SysDictionary> dictionaryList = systemDelegate.getDictionaryList(query);if(dictionaryList.isEmpty()) {//  查询字典失败处理log.error("dic list is empty, use default val");return StringUtils.isBlank(defaultDictionaryMap.get(dicCode)) ? null : defaultDictionaryMap.get(dicCode);}List<SysDictionary> resultList = dictionaryList.stream().filter(obj -> dicCode.equals(obj.getDicCode())).collect(Collectors.toList());if(resultList.isEmpty()) {//  字典不存在处理log.error("dicCode does not match value, use default val");return StringUtils.isBlank(defaultDictionaryMap.get(dicCode)) ? null : defaultDictionaryMap.get(dicCode);}return resultList.get(0).getDicExtValue1();} catch (Exception e) {log.error("load system dictionary from systemDelegate error, dicCode:{}, e:{}", dicCode, e.getMessage());return StringUtils.isBlank(defaultDictionaryMap.get(dicCode)) ? null : defaultDictionaryMap.get(dicCode);}}}//	清除or更新监听实现class DictionaryRemovalListener implements RemovalListener<Object, Object> {@Overridepublic void onRemoval(@Nullable Object key, @Nullable Object val, @NonNull RemovalCause cause) {//	可以打印要更新的缓存key,更新的原因log.info("DictionaryCache remove cache, key:{}, reason:{}", key, cause.name());//	可以顺带打印缓存的各种状态统计指标log.info("DictionaryCache hitCount:{}, hitRate:{}, missCount:{}, missRate:{}, loadCount:{}, loadSuccessCount:{}, totalLoadTime:{}",dictionaryCache.stats().hitCount(),dictionaryCache.stats().hitRate(),dictionaryCache.stats().missCount(),dictionaryCache.stats().missRate(),dictionaryCache.stats().loadCount(),dictionaryCache.stats().loadSuccessCount(),dictionaryCache.stats().totalLoadTime());}}//	对外暴露一个查询缓存的方法public String getDicValByDicCode(String dicCode) {return dictionaryCache.get(dicCode);}
}

4、补充:Caffeine高性能实现

判断一个缓存的好坏最核心的指标就是命中率,影响缓存命中率有很多因素,包括业务场景、淘汰策略、清理策略、缓存容量等等。如果作为本地缓存, 它的性能的情况,资源的占用也都是一个很重要的指标。下面

我们来看看 Caffeine 在这几个方面是怎么着手的,如何做优化的。

W-TinyLFU 整体设计

上面说到淘汰策略是影响缓存命中率的因素之一,一般比较简单的缓存就会直接用到 LFU(Least Frequently Used,即最不经常使用) 或者LRU(Least Recently Used,即最近最少使用) ,而 Caffeine 就是使用了 W-TinyLFU 算法。

W-TinyLFU 看名字就能大概猜出来,它是 LFU 的变种,也是一种缓存淘汰算法。那为什么要使用 W-TinyLFU 呢?

LRU 和 LFU 的缺点

LRU 实现简单,在一般情况下能够表现出很好的命中率,是一个“性价比”很高的算法,平时也很常用。虽然 LRU 对突发性的稀疏流量(sparse bursts)表现很好,但同时也会产生缓存污染,举例来说,如果偶然性的要对全量数据进行遍历,那么“历史访问记录”就会被刷走,造成污染。
如果数据的分布在一段时间内是固定的话,那么 LFU 可以达到最高的命中率。但是 LFU 有两个缺点,第一,它需要给每个记录项维护频率信息,每次访问都需要更新,这是个巨大的开销;第二,对突发性的稀疏流量无力,因为前期经常访问的记录已经占用了缓存,偶然的流量不太可能会被保留下来,而且过去的一些大量被访问的记录在将来也不一定会使用上,这样就一直把“坑”占着了。
无论 LRU 还是 LFU 都有其各自的缺点,不过,现在已经有很多针对其缺点而改良、优化出来的变种算法。

TinyLFU

TinyLFU 就是其中一个优化算法,它是专门为了解决 LFU 上述提到的两个问题而被设计出来的。

解决第一个问题是采用了 Count–Min Sketch 算法。

解决第二个问题是让记录尽量保持相对的“新鲜”(Freshness Mechanism),并且当有新的记录插入时,可以让它跟老的记录进行“PK”,输者就会被淘汰,这样一些老的、不再需要的记录就会被剔除。

二、本地缓存:Guava

1、简介

2、用法

3、实例

三、分布式缓存:Redis

1、简介

2、用法

3、实例

相关文章:

缓存使用纪要

一、本地缓存&#xff1a;Caffeine 1、简介 Caffeine是一种高性能、高命中率、内存占用低的本地缓存库&#xff0c;简单来说它是 Guava Cache 的优化加强版&#xff0c;是当下最流行、最佳&#xff08;最优&#xff09;缓存框架。 Spring5 即将放弃掉 Guava Cache 作为缓存机…...

Qt之Service开发

一、概述 基于Qt的用于开发系统服务(守护进程)和后台服务,有以下几个优秀的开源 QtService 框架和库。 1. QtService (官方解决方案) GitHub: https://github.com/qtproject/qt-solutions/tree/master/qtservice 特点: 官方提供的服务框架 支持 Windows 服务和 Linux 守护…...

ssm框架之Spring

Spring框架介绍 Spring框架是一个轻量级的企业级应用框架 通过它可以贯穿表现层、业务层、持久层。集成方便&#xff0c;简单易用&#xff0c;具有如下特点&#xff1a; Spring框架特色 Spring设计理念 是面向Bean的编程 Spring两大核心技术 控制反转(IoC&#xff1a;Inver…...

Flutter 开发环境配置--宇宙级教学!

目录 一、安装环境&#xff08;Windows&#xff09;二、Android 创建Flutter项目三、VSCode 搭建环境四、补充 一、安装环境&#xff08;Windows&#xff09; Flutter SDK 下载 推荐使用中国镜像站点下载 Flutter SDK&#xff0c;速度更快&#xff1a;中国环境 或者从官网下载…...

音视频 YUV格式详解

前言 本文介绍YUV色彩模型,YUV的分类和常见格式。 RGB色彩模型 在RGB颜色空间中,任意色光F都可以使用R、G、B三色不同的分量混合相加而成即: F = R + G + B.。即我们熟悉的三原色模型。 RGB色彩空间根据每个分量在计算机中占用的存储字节数可以分为以下几种类型,字节数…...

力扣 第 153 场双周赛 讲题

文章目录 Q1.字符串的反转度Q2.操作后最大活跃区段数I3500.将数组分割为子数组的最小代价 Q1.字符串的反转度 签到题,直接建立一个映射表即可 class Solution:def reverseDegree(self, s: str) -> int:# 先建立映射表ss "abcdefghijklmnopqrstuvwxyz"store {}i…...

grafana 配置页面告警

添加告警规则 1.登录grafana 点击 Alerting > Alert rules 点击 New alert rule 2.填写告警规则名字 3.配置告警规则 选择数据源为 Loki 单机 Builder 单机Label brower 单机 node_name 标签&#xff0c;选择一个主机&#xff0c;选好后单机 Show logs 这时候查询语…...

Cent OS7+Docker+Dify

由于我之前安装了Dify v1.0.0&#xff0c;出现了一些问题&#xff1a;无法删除&#xff0c;包括&#xff1a;知识库中的文件、应用、智能体、工作流&#xff0c;都无法删除。现在把服务器初始化&#xff0c;一步步重新安装&#xff0c;从0到有。 目录 1、服务器重装系统和配置…...

【自学笔记】PHP语言基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. PHP 简介2. PHP 环境搭建3. 基本语法变量与常量数据类型运算符 4. 控制结构条件语句循环语句 5. 函数函数定义与调用作用域 6. 数组7. 字符串8. 表单处理9. 会话…...

Android Gradle 下载插件或依赖太慢

问题与处理策略 问题描述 Android 项目中&#xff0c;settings.gradle 文件中&#xff0c;有如下配置&#xff0c;Gradle 插件或依赖下载速度慢 pluginManagement {repositories {gradlePluginPortal()google()mavenCentral()} }dependencyResolutionManagement {repositori…...

python-59-基于python内置库解析html获取标签关键信息

文章目录 1 html.parser1.1 初始化和基础使用1.1.1 handle_starttag(self, tag, attrs)1.1.2 handle_endtag(self, tag)1.1.3 handle_startendtag(self, tag, attrs)1.1.4 handle_data(self, data)1.1.5 handle_comment(self, data)1.2 解析HTML文档的流程2 百度搜索关键词链接…...

elementplus的el-tabs路由式

在使用 Element Plus 的 el-tabs 组件&#xff0c;实现路由式的切换&#xff08;即点击标签页来切换不同的路由页面&#xff09;。下面是一个基于 Vue 3 和 Element Plus 实现路由式 el-tabs 的基本步骤和示例。 步骤 1: 安装必要的库 在vue3项目安装 Vue Router 和 Element …...

ArcGIS地理信息系统空间分析实验教程学习

ArcGIS 作为地理信息系统领域的经典软件&#xff0c;以其强大的功能和广泛的应用场景&#xff0c;成为了众多学者、研究人员和专业人士的首选工具。它不仅可以高效地处理和可视化地理空间数据&#xff0c;还能通过复杂的空间分析模型&#xff0c;揭示地理现象背后的规律和趋势。…...

mac部署CAT监控服务

在 Mac 上部署美团点评开源的 CAT 监控服务端&#xff0c;可以按照以下步骤操作&#xff1a; 1. 环境准备 1.1 安装依赖 确保已安装以下工具&#xff1a; JDK 8&#xff08;建议 OpenJDK 11&#xff09; MySQL 5.7&#xff08;存储监控数据&#xff09;&#xff08;8.0不支持…...

鸿蒙OS 5 架构设计探秘:从分层设计到多端部署

文章目录 鸿蒙OS架构设计探秘&#xff1a;从分层设计到多端部署一、鸿蒙的分层架构设计二、模块化设计的精髓三、智慧分发设计&#xff1a;资源的动态调度四、一次开发&#xff0c;多端部署的实践总结与思考 鸿蒙OS架构设计探秘&#xff1a;从分层设计到多端部署 最近两年来&a…...

深入解析:ElasticSearch Query 查询方式

全文目录&#xff1a; 开篇语前言摘要概述ElasticSearch Query 查询方式详解1. Match 查询&#xff08;全文搜索&#xff09;1.1 Match 查询示例1.2 Match 查询参数扩展 2. Term 查询&#xff08;精准查询&#xff09;2.1 Term 查询示例2.2 Terms 查询 3. Bool 查询&#xff08…...

HTML5贪吃蛇游戏开发经验分享

HTML5贪吃蛇游戏开发经验分享 这里写目录标题 HTML5贪吃蛇游戏开发经验分享项目介绍技术栈核心功能实现1. 游戏初始化2. 蛇的移动控制3. 碰撞检测4. 食物生成 开发心得项目收获后续优化方向结语 项目介绍 在这个项目中&#xff0c;我使用HTML5 Canvas和原生JavaScript实现了一…...

桥接模式_结构型_GOF23

桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;核心思想是将抽象与实现分离&#xff0c;使两者能独立变化。它像一座连接两岸的桥梁&#xff0c;让“抽象层”和“实现层”自由组合&#xff0c;避免因多维度变化导致的“类爆炸”问…...

卡尔曼滤波入门(二)

核心思想 卡尔曼滤波的核心就是在不确定中寻找最优&#xff0c;那么怎么定义最优呢&#xff1f;答案是均方误差最小的&#xff0c;便是最优。 卡尔曼滤波本质上是一种动态系统状态估计器&#xff0c;它回答了这样一个问题&#xff1a; 如何从充满噪声的观测数据中&#xff0c…...

有关pip与conda的介绍

Conda vs. Pip vs. Virtualenv 命令对比 任务Conda 命令Pip 命令Virtualenv 命令安装包conda install $PACKAGE_NAMEpip install $PACKAGE_NAMEX更新包conda update --name $ENVIRONMENT_NAME $PACKAGE_NAMEpip install --upgrade $PACKAGE_NAMEX更新包管理器conda update con…...

【Portainer】Docker可视化组件安装

Portainer Portainer 是用于管理容器化环境的一体化平台工程解决方案&#xff0c;提供广泛的定制功能&#xff0c;以满足个人开发人员和企业团队的需求。 官方地址: https://www.portainer.io/ 安装 在 WSL / Docker Desktop 上使用 Docker 安装 Portainer CE 通过命令或UI页…...

基于深度神经网络的图像防篡改检测方法研究

标题:基于深度神经网络的图像防篡改检测方法研究 内容:1.摘要 随着数字化时代的发展&#xff0c;图像篡改现象日益普遍&#xff0c;严重影响了图像信息的真实性和可靠性。本文旨在研究基于深度神经网络的图像防篡改检测方法&#xff0c;以有效识别被篡改的图像。通过收集大量真…...

MATLAB导入Excel数据

假如Excel中存在三列数据需要导入Matlab中。 保证该Excel文件与Matlab程序在同一目录下。 function [time, voltage, current] test(filename)% 读取Excel文件并提取时间、电压、电流数据% 输入参数:% filename: Excel文件名&#xff08;需包含路径&#xff0c;如C:\data\…...

华为GaussDB数据库的手动备份与还原操作介绍

数据库的备份以A机上的操作为例。 1、使用linux的root用户登录到GaussDB服务器。 2、用以下命令切换到 GaussDB 管理员用户&#xff0c;其中&#xff0c;omm 为当前数据库的linux账号。 su - omm 3、执行gs_dump命令进行数据库备份&#xff1a; 这里使用gs_dump命令进行备…...

MySQL数据库BUG导致查询不到本该查到的数据

在数据库的日常使用中&#xff0c;我们常常会遇到一些看似匪夷所思的查询问。最近就看到一个因为MySQL BUG导致无法查到本该查询到数据的案例。 1. 问题背 数据库版本&#xff1a;MySQL8.0.40 假设我们创建了一个名为 product_info 的表&#xff0c;用于存储产品的相关信息。该…...

Dubbo(25)如何配置Dubbo的协议和端口?

配置Dubbo的协议和端口是设置分布式服务通信的基础步骤。Dubbo支持多种协议&#xff08;如Dubbo、RMI、HTTP等&#xff09;&#xff0c;你可以根据需求选择合适的协议并配置相应的端口。下面以一个完整的Spring Boot项目为例&#xff0c;详细介绍如何配置Dubbo的协议和端口。 …...

服务器磁盘卷组缓存cache设置介绍

工具1&#xff1a; storcli a. 确认软件包是否安装 [rootlocalhost ~]#rpm -qa | grep storcli storcli-1.21.06-1.noarch 备注&#xff1a;若检索结果为空&#xff0c;需要安装对应的软件安装包。安装命令如下&#xff1a; #rpm -ivh storcli-xx-xx-1.noarch.rpm b. 查看逻辑…...

StarVector:开启多模态SVG生成的新纪元——开源AI模型的革新之作

在AI技术蓬勃发展的今天&#xff0c;图像生成模型已不再局限于像素级的输出。StarVector作为一款开源的多模态SVG生成模型&#xff0c;凭借其独特的代码与视觉融合能力&#xff0c;正在重新定义矢量图形的创作方式。它不仅让图像生成更灵活、更轻量化&#xff0c;还为设计师、开…...

MySQL日期时间函数

函数分类 函数名 功能描述 语法示例 获取当前日期和时间 NOW() 返回包含年、月、日、时、分、秒的完整时间戳&#xff0c;格式为 YYYY-MM-DD HH:MM:SS SELECT NOW(); CURDATE() / CURRENT_DATE() 获取当前日期&#xff0c;格式为 YYYY-MM-DD SELECT CURDATE(); 或 SE…...

WinSCP使用教程:(SFTP、SCP、FTP 和 WebDAV)

WinSCP 是一款免费开源的 Windows 环境下的 SFTP、SCP、FTP 和 WebDAV 客户端&#xff0c;主要用于在本地计算机与远程服务器之间安全地传输文件&#xff0c;并提供基本的文件管理功能。 WinSCP是Windows环境下使用SSH的开源图形化的SFTP的客户端 SSH 的全称是 Secure Shell&…...

备份是个好习惯

##解题思路 首先看到题目说备份是个好习惯&#xff0c;说明可能存在备份文件泄露 用dirsearch或者其他的目录扫描工具扫一扫&#xff0c;发现两个网址状态码正常&#xff0c;其中一个刚好是.bak的备份文件 至于flag文件&#xff0c;无法读取源码&#xff0c;都是空的 下载备份…...

centos 7 LVM管理命令

物理卷&#xff08;PV&#xff09;管理命令 pvcreate&#xff1a;用于将物理磁盘分区或整个磁盘创建为物理卷。 示例&#xff1a;sudo pvcreate /dev/sdb1 解释&#xff1a;将 /dev/sdb1 分区创建为物理卷。 pvdisplay&#xff1a;显示物理卷的详细信息&#xff0c;如大小、所属…...

使用 Spring Boot 3.2 集成 MinIO 8.5:实现高效对象存储

摘要 MinIO 是一款高性能的分布式对象存储服务&#xff0c;与云原生应用完美契合。本文将手把手教你如何在 Spring Boot 3.2 项目中集成 MinIO 8.5 版本&#xff0c;实现文件上传、下载和删除等核心功能&#xff0c;并提供完整代码示例和常见问题解决方案。 一、环境准备 JDK …...

【Qt】数据库管理

数据库查询工具开发学习笔记 一、项目背景与目标 背景&#xff1a;频繁编写数据库查询语句&#xff0c;希望通过工具简化操作&#xff0c;提升效率。 二、总体设计思路 1. 架构设计 MVC模式&#xff1a;通过Qt控件实现视图&#xff08;UI&#xff09;&#xff0c;业务逻辑…...

C#:Time.deltaTime

目录 第一性原理&#xff1a;从最基本的问题开始 什么是Time.deltaTime&#xff1f; 1. 什么是“帧”&#xff1f; 2. 什么是“帧率”&#xff1f; 为什么需要它&#xff1f; 一个生活化的例子 更通俗的类比 在Unity中的特殊性 第一性原理&#xff1a;从最基本的问题开…...

鸿蒙富文本实践

01 鸿蒙中的文本展示-Text组件 Text 组件的普通用法和其他语言一样&#xff0c;可以直接使用字符串Text(我是一段文本) 通过点语法设置文本样式&#xff1a; Text(我是超长文本&#xff0c;超出的部分显示省略号。I am an extra long text, with ellipses displayed for any ex…...

【字符设备驱动开发–IMX6ULL】(二)Linux 设备号

【字符设备驱动开发–IMX6ULL】&#xff08;二&#xff09;Linux 设备号 文章目录 【字符设备驱动开发–IMX6ULL】&#xff08;二&#xff09;Linux 设备号1 设备号的组成2.设备号的分配 1 设备号的组成 为了方便管理&#xff0c;Linux 中每个设备都有一个设备号&#xff0c;设…...

Elasticsearch-实战案例

一、没有使用Elasticsearch的查询速度698ms 1.数据库模糊查询不走索引&#xff0c;在数据量较大的时候&#xff0c;查询性能很差。需要注意的是&#xff0c;数据库模糊查询随着表数据量的增多&#xff0c;查询性能的下降会非常明显&#xff0c;而搜索引擎的性能则不会随着数据增…...

电子文档安全管理系统V6.0接口backup存在任意文件下载漏洞

免责声明&#xff1a;本号提供的网络安全信息仅供参考&#xff0c;不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权&#xff0c;请及时与我联系&#xff0c;我将尽快处理并删除相关内容。 漏洞描述 电子文档安全管理系统 V6.0 reso…...

jmeter web压力测试 压测

下载地址 Apache JMeter - Download Apache JMeter 1. 设置线程组 2. 设置http请求头 3. 设置http请求体 4. 设置结果条目 常用函数 ${__RandomString(8, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789)}${__javaScript( ${__Random(1000, 10000)} /…...

FPGA学习篇——Verilog学习之寄存器的实现

1 寄存器理论 这里在常见的寄存器种加了一个复位信号sys_rst_n。&#xff08;_n后缀表示复位信号低电平有效&#xff0c;无这个后缀的则表示高电平有效&#xff09; 这里规定在时钟的上升沿有效&#xff0c;只有当时钟的上升沿来临时&#xff0c;输出out 才会改变&#xff0c;…...

CXL UIO Direct P2P学习

前言&#xff1a; 在CXL协议中&#xff0c;UIO&#xff08;Unordered Input/Output&#xff09; 是一种支持设备间直接通信&#xff08;Peer-to-Peer, P2P&#xff09;的机制&#xff0c;旨在绕过主机CPU或内存的干预&#xff0c;降低延迟并提升效率。以下是UIO的核心概念及UI…...

一键实现:谷歌表单转word(formtoword)

一键将 Google Forms 转换为 Word&#xff0c;最简单的方法 有些繁琐的工作让人倍感挫败&#xff0c;明明 应该 可以自动化。你精心制作了一份 Google Forms&#xff0c;收集了数据&#xff0c;现在需要在 Word 文档中分享其结构或内容。于是&#xff0c;你只能手动复制粘贴问…...

QT第六课------QT界面优化------QSS

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

一套SaaS多租户医疗云his源码,基于云计算的医院信息管理系统(云HIS)

基于云计算的医院信息管理系统&#xff08;云HIS&#xff09;&#xff0c;通过SaaS服务模式提供。这种云HIS系统设计考虑了模板化、配置化、智能化和可扩展性&#xff0c;覆盖了基层医疗机构的核心工作流程&#xff0c;并且能够与监管系统无缝对接&#xff0c;满足未来的扩展需…...

DGNN-YOLO:面向遮挡小目标的动态图神经网络检测与追踪方法解析

一、算法结构与核心贡献 1.1 文章结构 采用经典五段式结构: ​引言:分析智能交通系统(ITS)中小目标检测与追踪的挑战,提出研究动机。​相关工作:综述小目标检测(YOLO系列、Faster R-CNN)、目标追踪(SORT、Transformer)和图神经网络(GNN)的进展。​方法论:提出DG…...

淘宝获取商品sku详情API接口如何调用?

以下是调用淘宝开放平台/万邦开放平台获取商品SKU详情API接口的具体步骤和示例&#xff1a; 一、API名称及参数 API名称&#xff1a;taobao.item.sku.get主要功能&#xff1a;获取指定商品SKU的详细信息&#xff0c;包括属性、价格、库存等。关键参数&#xff1a; num_iid&am…...

JavaScript 中的原型链与继承

JavaScript 是一种基于原型的编程语言&#xff0c;这意味着它的对象继承是通过原型链而非类的机制来实现的。原型链是 JavaScript 中对象与对象之间继承属性和方法的基础。本文将深入探讨 JavaScript 中的原型链和继承机制&#xff0c;帮助你理解这一重要概念。 一、原型&…...

晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包

晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包 适用型号&#xff1a;M401A、CM311-1a、CM311-1sa、B863AV3.1-M2、B863AV3.2-M、UNT403A、UNT413A、M411A、E900V22C、E900V22D、IP112H等等晶晨S905L3A(B)处…...

【MYSQL】Windows 下 CMD 操作数据库指南

0. 引言 在数据库的日常操作中&#xff0c;掌握通过 Windows 下的命令行工具&#xff08;CMD&#xff09;连接并操作数据库是一项重要技能。本指南将带您逐步完成 MYSQL 数据库的基本操作&#xff0c;包括使用 CMD 登录数据库、选择目标数据库、查看所有数据表&#xff0c;以及…...