快速体验 .NET9 提供的 HybridCache 混合缓存
.NET 9
引入了 HybridCache
,这是一个新的高性能、分布式就绪的内存缓存实现,旨在为现代 Web
应用提供更高效的数据缓存机制。它结合了本地缓存(如 IMemoryCache
)和分布式缓存(如 Redis、Garnet、SQL Server
)的优点,支持自动分级存储和异步刷新,同时具备高并发下的性能优势。
特点
- 混合缓存架构:结合本地内存缓存与分布式缓存,减少网络往返。
- 自动分层:热数据保留在本地,冷数据回退到分布式存储。
- 异步刷新:避免缓存击穿,提升用户体验。
- 可扩展性:支持自定义序列化、键生成策略和分布式缓存提供者。
- 集成 DI:开箱即用,支持依赖注入。
🚀 使用示例
示例1:默认方式使用
1.1 安装 nuget 包(如果尚未引入)
新建 asp.net core9 webapi
项目,添加 nuget
包:
dotnet add package Microsoft.Extensions.Caching.Hybrid
nuget
包下载,https://www.nuget.org/packages/Microsoft.Extensions.Caching.Hybrid
1.2 注册 HybridCache
服务
在 Program.cs
中注册:
var builder = WebApplication.CreateBuilder(args);// 添加 HybridCache
builder.Services.AddHybridCache();var app = builder.Build();
1.3 使用 IHybridCache
缓存数据
以下是一个简单的控制器使用示例:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;[ApiController]
[Route("[controller]")]
public class WeatherForecastController(IHybridCache cache) : ControllerBase
{[HttpGet]public async Task<IActionResult> Get(){var key = "weather_data";var result = await cache.GetOrCreateAsync(key, async (token) =>{// 模拟耗时操作,例如从数据库或 API 获取数据await Task.Delay(100, token);return new[] { "Sunny", "Cloudy", "Rainy" };});return Ok(result);}
}
1.4 配置 HybridCache
(可选)
你可以在 appsettings.json
或代码中配置缓存行为:
builder.Services.AddHybridCache(options =>
{options.LocalCacheSizeLimit = 1024; // 设置本地缓存最大条目数options.DistributedCacheEntryOptions = new DistributedCacheEntryOptions{AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)};
});
说明:上面的配置项,可依据实际情况自行调整。
示例2:注册 Garnet 为分布式缓存提供者
在 ASP.NET Core 9
中,你可以将 HybridCache
配置为使用 Garnet
作为其底层的分布式缓存提供者。Garnet
是微软开发的一个高性能、兼容 Redis
协议的键值存储系统,适用于需要高吞吐和低延迟的场景。
Garnet
官网,https://microsoft.github.io/garnet/
✅ 使用 HybridCache + Garnet
的步骤:
2.1 安装必要的 NuGet 包
dotnet add package Microsoft.Extensions.Caching.Hybrid
dotnet add package Garnet.Client
2.2 启动 Garnet 服务器(本地或远程)
确保你已经安装并运行了 Garnet
服务,可以通过以下方式启动:
# 假设已编译 Garnet 并进入目录
cd Garnet/bin/Release/net7.0
./garnet-server --port 6380
2.3 注册 Garnet 客户端和服务
你需要创建一个自定义的 IDistributedCache
实现来使用 Garnet
,或者使用社区提供的适配器。
下面是一个简单示例,展示如何注册 Garnet
作为分布式缓存提供者:
- a. 创建
Garnet
分布式缓存实现
using Garnet.Client;
using Microsoft.Extensions.Caching.Distributed;
using System.Text.Json;public class GarnetDistributedCache : IDistributedCache
{private readonly GarnetClient _client;public GarnetDistributedCache(GarnetClient client) => _client = client;public byte[] Get(string key) => _client.GetAsync(key).Result;public async Task<byte[]> GetAsync(string key, CancellationToken ct = default)=> await _client.GetAsync(key, ct);public void Set(string key, byte[] value, DistributedCacheEntryOptions options)=> _client.SetAsync(key, value, GetExpiryFromOptions(options)).Wait();public async Task SetAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken ct = default)=> await _client.SetAsync(key, value, GetExpiryFromOptions(options), ct);public void Refresh(string key)=> _client.KeyExpireAsync(key, TimeSpan.FromMinutes(5)).Wait(); // 默认刷新为 5 分钟public async Task RefreshAsync(string key, CancellationToken ct = default){var ttl = await _client.KeyTtlAsync(key, ct); // 获取当前剩余 TTLif (ttl.HasValue && ttl.Value > TimeSpan.Zero){// 若已有 TTL,刷新为相同的持续时间await _client.KeyExpireAsync(key, ttl.Value, ct);}else{// 否则设置一个默认 TTL(可自定义)await _client.KeyExpireAsync(key, TimeSpan.FromMinutes(5), ct);}}public void Remove(string key) => _client.DeleteAsync(key).Wait();public Task RemoveAsync(string key, CancellationToken ct) => _client.DeleteAsync(key, ct);// 根据 DistributedCacheEntryOptions 获取过期时间private TimeSpan? GetExpiryFromOptions(DistributedCacheEntryOptions options){if (options.AbsoluteExpirationRelativeToNow.HasValue)return options.AbsoluteExpirationRelativeToNow.Value;else if (options.SlidingExpiration.HasValue)return options.SlidingExpiration.Value;return null;}
}
- b. 注册
Garnet
客户端和缓存服务
var builder = WebApplication.CreateBuilder(args);// 添加 Garnet 客户端
builder.Services.AddSingleton<GarnetClient>(sp =>
{var client = new GarnetClient("localhost", 6380);client.Connect();return client;
});// 添加 Garnet 缓存实现
builder.Services.AddSingleton<IDistributedCache, GarnetDistributedCache>();// 添加 HybridCache,并使用 Garnet 作为分布式缓存后端
builder.Services.AddHybridCache(options =>
{options.LocalCacheSizeLimit = 500;options.LocalTtl = TimeSpan.FromSeconds(30);options.UseDistributedCache = true;options.DistributedTtl = TimeSpan.FromMinutes(5);options.UseSlidingExpiration = true; // 自动调用 Refresh/RefreshAsync
});
在注册 HybridCache
时启用 滑动过期策略
,这样,当某个缓存项被访问时,系统会自动调用 RefreshAsync
方法来更新其在 Garnet
中的 TTL
。
2.4 在应用中使用 HybridCache
在控制器中使用缓存方式与之前一致。
[ApiController]
[Route("[controller]")]
public class SampleController(IHybridCache cache) : ControllerBase
{[HttpGet]public async Task<IActionResult> GetData(){var data = await cache.GetOrCreateAsync("sample-key", async (token) =>{// 模拟耗时获取数据await Task.Delay(200, token);return new[] { "Data1", "Data2" };});return Ok(data);}
}
🧠 小贴士
- 性能优化:可以结合
HybridCache
的LocalTtl
和DistributedTtl
控制缓存生命周期。 - 序列化配置:可通过
AddHybridCache()
的选项自定义ISerializer
,例如使用System.Text.Json
或 MessagePack。 Garnet
集群支持:如果使用集群模式,请确保客户端正确配置路由逻辑。
在 ASP.NET Core 9
的 HybridCache
中,LocalTtl
和 DistributedTtl
是两个关键配置项,用于控制缓存数据的生命周期。它们分别作用于 本地缓存层
和分布式缓存层
,使得你可以更精细地管理缓存的有效期。
🔍 配置说明
LocalTtl
(本地缓存过期时间)
- 含义:设置缓存项在本地内存中保留的最大时间。
- 用途:确保频繁访问的数据保留在本地,提高响应速度,同时避免本地缓存长时间不更新。
- 类型:
TimeSpan
- 示例:
services.AddHybridCache(options =>
{options.LocalTtl = TimeSpan.FromSeconds(30); // 本地缓存最多保留 30 秒
});
DistributedTtl
(分布式缓存过期时间)
- 含义:设置缓存项在分布式缓存中的最大存活时间。
- 用途:控制整个缓存系统的最终一致性,适用于跨节点共享缓存的场景。
- 类型:
TimeSpan
- 示例:
services.AddHybridCache(options =>
{options.DistributedTtl = TimeSpan.FromMinutes(5); // 分布式缓存最多保留 5 分钟
});
🔄 即使本地缓存已过期,系统也会尝试从分布式缓存加载最新数据;若分布式缓存也过期,则重新生成并写回两级缓存。
⚙️ 典型组合策略
场景 | LocalTtl | DistributedTtl | 说明 |
---|---|---|---|
高频读取、容忍短时旧数据 | 30s | 5min | 提高性能,减少后端压力 |
数据变化频繁、要求较新 | 5s | 30s | 快速更新本地缓存,保持整体一致性 |
只读数据、极少变更 | null(永不过期) | 24h | 本地永久缓存 + 分布式定期更新 |
🧠 使用技巧
- 设置
LocalTtl = null
表示本地缓存永不自动过期(仍可能被逐出以节省内存)。 - 设置
DistributedTtl = null
表示分布式缓存项不会自动删除。 - 如果只设置了
LocalTtl
而未设置DistributedTtl
,则分布式缓存默认与本地一致。 - 可结合
AbsoluteExpirationRelativeToNow
或SlidingExpiration
等高级策略进行更复杂的控制。
通过合理配置 LocalTtl
和 DistributedTtl
,你可以灵活控制 HybridCache
的行为,实现以下目标:
- 提升高频访问性能(利用本地缓存)
- 减少对后端系统的冲击(利用分布式缓存)
- 控制数据新鲜度(避免缓存脏读)
这是 HybridCache
强大灵活性的重要体现之一。
✅ 总结
HybridCache
是 .NET 9
的一大亮点,适用于需要高性能、低延迟和分布式能力的现代应用。通过简单配置即可获得 本地 + 分布式
的双重优势,是替代传统 IMemoryCache
和 IDistributedCache
的理想选择。
通过将 HybridCache
与 Garnet
结合,你可以构建一个高性能、低延迟、支持分布式部署的缓存架构。这非常适合用于 微服务、API 网关、电商推荐
等对性能要求极高的场景。
相关文章:
快速体验 .NET9 提供的 HybridCache 混合缓存
.NET 9 引入了 HybridCache,这是一个新的高性能、分布式就绪的内存缓存实现,旨在为现代 Web 应用提供更高效的数据缓存机制。它结合了本地缓存(如 IMemoryCache)和分布式缓存(如 Redis、Garnet、SQL Server)…...
使用docker配置Mysql
Docker 命令 下面是一个常用的 Docker 命令,用于启动 MySQL 容器,并将数据挂载到本地目录: docker run -d \--name mysql-server \-e MYSQL_ROOT_PASSWORDyourpassword \-e MYSQL_DATABASEyourdb \-e MYSQL_USERyouruser \-e MYSQL_PASSWOR…...
stm32之输出比较OC和输入捕获IC
目录 1.输出比较OC1.1 简介1.2 PWM简介1.3 输出比较通道1.3.1 通用定时器1.3.2 高级定时器 1.4 PWM基本结构1.6 舵机1.7 直流电机1.7.1 引入:MX1508 芯片1.7.2 TB6612芯片 1.8 结构体和API1.8.1 结构体1.8.2 API1. TIM_OC1Init / TIM_OC2Init / TIM_OC3Init / TIM_O…...
为什么Transformer推理需要做KV缓存
一、我们先来回忆一下在transformer中KV在哪里出现过,都有什么作用? α的计算过程: 这里引入三个向量: 图中的q为Query,用来匹配key值 图中的k为key,用来被Query匹配 图中的Value,是用来被进行加权平均的 由…...
Stream和Collections工具类
Stream流 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流,流在管道中传输&am…...
结合Hutool 突增突降检测的算法
在 Hutool 中虽然没有直接提供“突增突降检测”的算法,但可以通过其提供的工具类(如 CollUtil、ArrayDeque、MathUtil 等)结合滑动窗口、差分分析等方法,快速实现突增突降检测逻辑。以下是基于 Hutool 的实现思路和示例代码&#…...
java springboot deepseek流式对话集成示例
1.直接上代码-后端: RestController CrossOrigin(origins "*") public class DeepSeekController {private static final String API_URL "https://api.deepseek.com/v1/chat/completions";private final ObjectMapper objectMapper new Ob…...
技术对暴力的削弱
信息时代的大政治分析:效率对暴力的颠覆 一、工业时代勒索逻辑的终结 工厂罢工的消亡 1930年代通用汽车罢工依赖工厂的物理集中、高资本投入和流水线脆弱性,通过暴力瘫痪生产实现勒索。 信息时代企业分散化、资产虚拟化(如软件公司可携带代码…...
RAG框架搭建(基于Langchain+Ollama生成级RAG 聊天机器人)
目录 一 Ollama安装 Windows 系统安装 验证安装 二 Langchain安装 2.1 先创建一个虚拟环境 2.2 安装最新版 langchain 三 基于 Langchain私有模型,构建一个生成级RAG 聊天机器人 3.1 初始化LLM 3.2 增强生成 3.3生成嵌入 3.4 生成并存储嵌入 一 Ol…...
spring cloud gateway(网关)简介
Spring Cloud Gateway 是一个基于 Spring WebFlux 构建的强大且广泛使用的 API 网关。它负责处理所有进入的请求,并将它们路由到相应的后端服务。 Gateway 的主要作用: 统一的入口点 (Single Entry Point): 它为所有的客户端请求提供了一个…...
webrtc 视频直播
webrtc 是一种开源的音视频通信技术,可以不借助中间媒介建立浏览器点对点(peer-to-peer)连接,实现音视频以及其他数据的传输。webrtc具有平台兼容性,低延迟与高实时的优点。今天主要记录一下webrtc的使用记录ÿ…...
【Elastsearch】如何获取已创建的api keys
在Elasticsearch中,可以通过API获取已创建的API密钥(API keys)。以下是具体步骤和示例: 1.使用GET请求获取API密钥 Elasticsearch提供了GETAPI,用于列出当前用户可以访问的所有API密钥。 请求格式 plaintext GET /_se…...
AI Agent开发第57课-AI用在销售归因分析场景中-用随机森林从0构建自己的“小模型”
开篇 在前一篇《机器学习的基础-线性回归如何应用在商业场景中》里,我们说到了如果我们只是简单的分析和预测一下投入广告费用和销售额增长是否存在必然关系,我们用了线性回归法得到了分析,得到的分析结果极其精准,以及提到了:如果当销售因素是非线性的并且有着额外一些如…...
Elasticsearch知识汇总之ElasticSearch部署
五 ElasticSearch部署 部署Elasticsearch,可以在任何 Linux、MacOS 或 Windows 机器上运行 Elasticsearch。在Docker 容器 中运行 Elasticsearch 。使用Elastic Cloud on Kubernetes 设置和管理 Elasticsearch、Kibana、Elastic Agent 以及 Kubernetes 上的 Elasti…...
高等数学第五章---定积分(§5.4反常积分)
5.4 反常积分 前面我们学习了定积分 ∫ a b f ( x ) d x \int_a^b f(x) d x ∫abf(x)dx,其中积分区间 [ a , b ] [a, b] [a,b] 是有限区间,且被积函数 f ( x ) f(x) f(x) 在 [ a , b ] [a, b] [a,b] 上是连续的(或至多有有限个第一类间…...
UE5 ML机械学习肌肉反应与布料反应
在查找Ai过渡动画的过程中,通过米哈游鹿鸣的展示,了解到的机械学习技术 https://dev.epicgames.com/documentation/zh-cn/unreal-engine/using-the-machine-learning-deformer-in-unreal-engine#%E5%85%88%E5%86%B3%E6%9D%A1%E4%BB%B6 https://dev.epicgames.com/documentati…...
UE5 诺伊腾动捕使用笔记
AxisStudio使用说明 诺伊腾动捕有两个软件,分别是AxisStudio和Axis Post 打开软件后选择"工程" 分为两种工程,一种是PN Studio和PN3,这两个工程对于不同的骨骼方式(也可以修改) 以PNStudio的2.0-Carwheel举例 右侧的数据为你的目标骨骼的尺寸,例如我现在是Metahuma…...
【测试开发】概念篇 - 从理解需求到认识常见开发、测试模型
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本(非常简洁快速)
【2025年】基于电脑的jdk1.8通过idea创建springboot2.x版本 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】&…...
在sheel中运行Spark
RDD基本概念 Resilient Distributed Dataset 叫做弹性分布式数据集,是Spark中最基本的数据抽象,是分布式计算的实现载体,代表一个不可变,可分区,里面的元素并行计算的集合。 Dataset: 一个数据集合…...
如何从windows中的cursor打开windows里面的wsl中的项目
解决方法: ✅ 步骤 1:在 Windows 中安装 Cursor 首先,确保你已在 Windows 上安装了 Cursor 编辑器。 安装完成后,打开 Cursor 编辑器。 ✅ 步骤 2:安装并配置 WSL 扩展 为了让 Cursor 与 WSL 集成,需…...
UE5 C++项目实现单例
在 UE5 中,要实现“全局只有一个实例”的单例模式,主要有两种思路:一种是传统 C++ 静态单例,另一种是利用 UE5 提供的Subsystem体系(如 UGameInstanceSubsystem、UWorldSubsystem 等)。下面先给出核心示例代码及对比,随后讨论典型使用场景、优缺点,对常见问题作出诊断并…...
信息论04:从信息熵到互信息——信息共享的数学度量
从信息熵到互信息:信息共享的数学度量 1. 信息论基础概念 1.1 信息熵(Information Entropy) 定义:信息熵由香农提出,用于量化随机变量的不确定性。对于离散随机变量X,其熵定义为: H ( X ) …...
MYSQL的DDL语言和单表查询
MYSQL的DDL语言和单表查询 Mysql介绍 SQL(Structured Query Language)是一种专门用于管理和操作关系型数据库的标准化语言,通过定义、查询、更新和控制数据,为应用程序提供一致且高效的持久化存储方式。它包含数据定义语言&…...
奇瑞依托汽车产业链,实现服务机器人万台下线
近日,奇瑞集团旗下墨甲机器人(MOJA)全球批量交付的消息得到官方确认。这一重大进展不仅标志着奇瑞在服务机器人领域的商业化落地迈出关键一步,更成为国产智能装备进军全球市场的重要里程碑。 墨甲机器人简介 产品定位 墨甲是奇…...
Python Bug 修复案例分析:函数参数传递引发的逻辑错误修复
在 Python 编程学习的过程中,各种意想不到的 Bug 常常会阻碍我们编写的程序的正常运行。这次,我们将围绕一个因函数参数传递导致逻辑错误的案例,深入剖析 Bug 的修复全过程,帮助初学者掌握处理这类问题的方法。 案例背景 最近编写…...
论文阅读笔记——ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors
RoboGround 论文 一类中间表征是语言指令,但对于空间位置描述过于模糊(“把杯子放桌上”但不知道放桌上哪里);另一类是目标图像或点流,但是开销大;由此 GeoDEX 提出一种兼具二者的掩码。 相比于 GR-1&#…...
deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_23
目录 0、简介1、下载链接1.1、CSDN链接,含权重文件直接使用,建议直接下这个,还不限速。1.2 Github链接: 2、下载代码,下载预训练好的权重3、预测代码4、像素提取,或者说类别提取5、文档部分内容截图6、其他…...
JavaScript性能优化实战:深入探讨性能瓶颈与优化技巧
JavaScript性能优化实战:深入探讨性能瓶颈与优化技巧 引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方…...
第2章——springboot核心机制
一、为何以继承方式引入SpringBoot 1.提出疑问 以前我们在开发项目时,需要什么,引入对应的依赖就行,比如我们需要连接mysql数据,则引入mysql驱动的依赖,如下: <dependency><groupId>com.mys…...
huggingface 热门开源TTS模型Dia-1.6B,支持多人对话生成、情感控制~
简介 Dia-1.6B 是一款由 Nari Labs 开发的开源文本转语音(TTS)模型,专注于生成自然对话。其项目背景和模型架构基于近期可用的网络信息进行了详细分析,以下是全面的报告。 项目背景概述 Dia-1.6B 的开发始于 Nari Labsÿ…...
深入理解West:介绍、使用及与Repo的对比
目录 引言 West简介 West的由来 West的核心功能 West的架构与工作流程 West安装与使用 环境准备与安装 Manifest 文件结构解析 常用命令详解与进阶用法 Tip与Troubleshoot 实践案例:基于West的Zephyr项目管理 初始化与同步 构建与闪存 插件示例:自定义命令 Repo简介 Repo的背…...
力扣-hot100 (矩阵置零)
73. 矩阵置零 中等 给定一个 *m* x *n* 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 示…...
OpenKylin安装Elastic Search8
一、环境准备 Java安装 安装过程此处不做赘述,使用以下命令检查是否安装成功。 java -version 注意:Elasticsearch 自 7.0 版本起内置了 OpenJDK,无需单独安装。但如需自定义 JDK,可设置 JAVA_HOME。 二、安装Elasticsearch …...
【JVM】从零开始深度解析JVM
本篇博客给大家带来的是JVM的知识点, 重点在类加载和垃圾回收机制上. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 …...
制造企业PLM系统成本基准:2025年预算分配与资源成本率的5种优化模型
在 2025 年制造业数字化转型的浪潮中,PLM(产品生命周期管理)系统已成为制造企业提升核心竞争力的关键工具。然而,PLM 系统的实施和运营成本较高,如何有效控制成本、优化预算分配和资源成本率,成为企业关注的…...
【Python】一键提取视频音频并生成MP3的完整指南 by `MoviePy`
摘要 昨天, 我在让一个小朋友给我整理一次培训的视频的时候,我看到他把视频文件放到剪映里面处理。 我以为他要干什么呢, 还很期待,结果他只是为了导出音频而已。 于是就有了今天的这篇博客。 作为音视频处理领域的常用需求&…...
Golang领域Beego框架的中间件开发实战
在Golang的Beego框架中,中间件(Middleware)是一种强大的机制,用于在请求处理的不同阶段插入自定义逻辑。 中间件可以用于处理日志记录、身份验证、错误处理、请求/响应修改等任务。 Beego框架中间件开发的实战指南: …...
Elasticsearch:我们如何在全球范围内实现支付基础设施的现代化?
作者:来自 Elastic Kelly Manrique SWIFT 和 Elastic 如何应对基础设施复杂性、误报问题以及日益增长的合规要求。 金融服务公司在全球范围内管理实时支付方面面临前所未有的挑战。SWIFT(Society for Worldwide Interbank Financial Telecommunication -…...
【LLIE专题】基于 CLIP 的无监督背光增强算法
CLIP-LIT: Iterative Prompt Learning for Unsupervised Backlit Image Enhancement(2023,ICCV) 专题介绍一、研究背景二、CLIP-LIT方法三、实验结果四、总结五、思考 本文将对 CLIP-LIT: Iterative Prompt Learning for Unsupervised Backl…...
深入了解酒店一次性牙刷:材质选择与设计考量全解析
酒店的一次性牙刷是我们住酒店时常见的用品,它方便了很多旅客出行,虽小巧,却对人们口腔清洁有一定作用,扬州卓韵酒店用品在这个领域表现优秀,下面我们就深入了解酒店一次性牙刷。 一次性牙刷的材质相当重要。常见的有…...
[人机交互]理解用户
一.解释什么是认知,以及它对交互设计的重要性 1.1什么是认知 认知是指与knowing相关的能力,行为和过程(考填空) -如何感知物理刺激?如注意、知觉等 -如何认识自我、他人以及环境?如意识、记忆等 -如何…...
css3伸缩盒模型第二章(侧轴相关)
css3伸缩盒模型第二章(侧轴相关) 侧轴对齐方式 侧轴对齐我们需要分两种情况,一种是多行,一种是单行,两种设置方式不同 属性:align-items 单行属性: align-content 多行 单行 align-items flex-start: 侧轴的起点对…...
【WPS】怎么解决“word的复制表格”粘贴到“excel的单元格”变多行单元格的问题
把 word文档复制表格到这个excel表格上面的话,会出现由单个单元格变成多行单元格的情况。 现在,就这个问题怎么解决,提出了一个方案,就是先查找是什么导致了这个换行,然后再将换行的这个字符进行一个整体的替换&#x…...
股指期货深度贴水是什么意思?
如果贴水的幅度特别大,比如股票指数是3000点,但股指期货的价格只有2800点,贴水了200点,这就叫“深度贴水”。简单来说,股指期货贴水就是指股指期货的价格低于其对应的现货指数价格。当这种贴水程度较大时,就…...
GCC编译器安装详细说明(举例arm-2013q3)
比如在官网GNU Arm Embedded Toolchain project files : GNU Arm Embedded Toolchain 下载了一个gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 1 sudo tar -xvf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2 解决了解压 在部署环境,在安装2…...
第十一届蓝桥杯 2020 C/C++组 蛇形填数
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 蛇形填数 - 蓝桥云课 思路: 思路详解: 看图找规律…...
https://juejin.cn/editor/drafts/7262346366541070395
.Net Core从零学习搭建权限管理系统教程 推荐一组WPF自定义控件开源项目。 项目简介 这是基于WPF开发的,为开发人员提供了一组方便使用自定义组件,并提供了各种常用的示例。 包含组件:数据表格、属性列表、树形列表、选色器、单选框列表、…...
STL?string!!!
一、引言 在之前的文章中,我们一同学习了有关类和对象、模板、动态内存管理的相关知识,那么接下来一段时间我们将要趁热打铁,一起来手撕C库中最重要的一个库----STL中的一些容器,在手撕它们之前,我将先介绍一下对应的容…...
CentOS 7 安装指定版本 Docker 及镜像加速/配置优化攻略
摘要 本文详述 CentOS 7 系统下安装指定版本 Docker ,涵盖镜像加速配置(实测最快)、存储位置优化、日志轮转等核心配置。 文章目录 一、安装指定版本Docker1.1 卸载旧版本(如有)1.2 安装依赖包1.3 添加Docker仓库&…...