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

Android学习总结之Glide自定义三级缓存(面试篇)

一、三级缓存核心原理与设计
问题 1:为什么需要三级缓存?各层缓存的核心作用是什么?

回答核心

  • 内存缓存:毫秒级快速响应,存储近期浏览的图片(如滑动列表来回切换的图片),通过 LRU 算法自动清理冷数据,通常占内存 15%。
  • 磁盘缓存:持久化存储常用图片,解决内存容量限制,支持离线访问(如商品详情页图片),按 URL 哈希值命名避免重复,容量 100MB 左右。
  • 网络缓存:结合 HTTP 缓存头(如 Cache-Control),避免重复下载,降低流量和服务器压力,容量 50MB,优先存高频访问图片。
  • 分层优势:形成 “速度优先→持久化存储→网络优化” 的三级防护,覆盖 90% 以上的图片加载场景,提升用户体验和系统稳定性。

话术示例
三级缓存的设计是为了解决图片加载中的三个核心问题:

  • 内存缓存(快):就像手机的 “最近使用列表”,存用户刚看过的图片(比如滑动列表时来回切换的图片)。用 LRU 算法自动清理太久没看的图片,比如 8GB 内存的手机分 1.2GB 给它,还会把大图片压缩到屏幕大小,确保滑动时瞬间加载,不卡顿。
  • 磁盘缓存(稳):相当于 “本地相册”,存常用但暂时不在内存里的图片(比如用户常看的商品详情页图)。存 100MB 左右,用 URL 的哈希值命名避免重复,即使手机重启或没网,也能从这里找到图片。
  • 网络缓存(省):类似 “路由器记忆”,避免重复下载。比如用 OkHttp 缓存 50MB,配合服务器的缓存策略(比如设置 1 天有效期),下次打开同一张图直接从路由器拿,省流量还减轻服务器压力。
    三层配合,比如用户滑动列表时,先从内存秒开,滑走后存磁盘,下次没网也能看,联网时优先用网络缓存避免重复下载,覆盖 90% 的使用场景。
问题 2:LruCache 算法的核心数据结构和工作机制是什么?

回答核心

  • 数据结构:双向链表(维护访问顺序)+ 哈希表(快速查找)。
  • 工作机制
    1. 新元素加入链表头部,存在元素访问后移到头部;
    2. 缓存满时删除链表尾部元素(最久未使用);
    3. 通过sizeOf()方法计算元素大小,支持自定义内存占用(如 Bitmap 的字节数)。
  • 大厂优化点:Glide 的 LruResourceCache 结合弱引用队列,感知 Bitmap 回收,避免内存泄漏,同时复用资源池对象减少创建开销。

话术示例
LruCache 就像一个 “智能书架”,核心是按 “最近最少用” 原则管理图片:

  • 每次取图片(访问),就把它放到书架最前面(双向链表头部),很久没取的书(最久未用)放在最后面(链表尾部);
  • 书架满了(内存不够),直接扔掉最后一本书(删除尾部元素),保证书架始终不超载。
    Glide 在这个基础上做了两个关键优化:
  1. 防内存泄漏:给图片加 “弱引用”,就像给书贴一个标签,书被卖掉(系统回收)时,标签自动从书架移除,避免书架上留空标签(无效引用);
  2. 资源复用:把用过的图片暂时存到 “回收箱”(资源池),下次需要相同尺寸的图片,直接从回收箱拿,不用重新买(创建 Bitmap),比如滑动列表时,同尺寸的图片反复用,内存占用能降 30% 以上。
二、常见问题解决方案(缓存穿透 / 雪崩 / OOM)
问题 1:缓存穿透的本质是什么?大厂如何解决高并发下的穿透问题?

回答核心

  • 本质:请求不存在的数据,导致每次都查数据库 / 网络,形成流量黑洞。
  • 解决方案
    1. 布隆过滤器:提前将所有合法 URL 存入布隆过滤器,请求时先过滤无效 URL,拒绝率达 99% 以上;
    2. 缓存空值:对不存在的 URL 缓存一个特殊值(如 NULL),设置短过期时间(5 分钟),防止恶意攻击;
    3. 占位图策略:Glide 中设置error()/fallback()占位图,避免界面闪烁,同时记录无效请求日志。
问题 2:缓存雪崩的危害及多级预防策略?

回答核心

  • 危害:大量缓存同时失效,瞬间流量冲击数据库,可能导致服务雪崩。
  • 预防策略
    1. 错峰过期:给缓存时间添加随机偏移(如 24 小时 ±1 小时),避免集中失效;
    2. 多级缓存:内存 + 磁盘 + CDN 三层缓存,CDN 层抗住 80% 静态资源请求;
    3. 熔断降级:流量突增时,返回低清图或占位图,保证核心流程可用;
    4. 互斥锁:缓存失效时,仅允许一个线程重建缓存,其他线程阻塞等待,避免并发查库。

话术示例
缓存穿透是 “无效请求攻击”,比如恶意用户大量请求不存在的图片 URL,导致每次都要查数据库,就像有人一直按门铃问 “10086 号房在吗”,但小区根本没这个房号。
大厂用三层防线解决:

  1. 门口装 “门禁”(布隆过滤器):提前把所有存在的房号(URL)录入门禁系统,访客(请求)先刷门禁,不存在的直接拦在门外,准确率 99% 以上,比如电商 APP 用布隆过滤器,每天能拦截 10 万 + 无效请求;
  2. 留 “空房记录”(空值缓存):对查过不存在的房号,记下来 “10086 号房不存在”,有效期 5 分钟,期间再有人问直接说 “不用查了”,防止短时间内重复攻击;
  3. 门口贴 “提示牌”(占位图):在 Glide 里设置默认图,比如请求失败时显示 “图片加载中” 的占位图,用户看不到空白,体验更好,同时后台记录这些无效请求,方便定位攻击源。
问题 3:如何从源头预防 OOM?Glide 中的关键配置有哪些?

回答核心

  • 内存优化三原则
    1. 尺寸压缩:按 ImageView 尺寸加载(override(width, height)),避免加载超分辨率图片;
    2. 格式转换:使用 RGB_565(比 ARGB_8888 节省 50% 内存)或 WebP 格式,Glide 中通过format(DecodeFormat.PREFER_RGB_565)配置;
    3. 生命周期绑定:Glide 自动与 Activity/Fragment 绑定,界面不可见时清理资源,避免内存泄漏,同时可手动调用clear(imageView)释放。
  • 进阶策略:动态调整内存缓存大小(如低端机设为 10%,高端机 20%),结合skipMemoryCache(true)跳过非当前屏幕图片的内存存储。

话术示例
OOM 就像 “书包塞满了大书”,图片太大或存太多就会撑爆内存。Glide 通过三个 “瘦身” 技巧预防:

  1. 按尺寸买书:比如手机屏幕是 1000px,就只加载 1000px 的图,不加载 2000px 的原图,用override(1000, 1000)强制压缩,内存占用直接减半;
  2. 选轻便包装:用 RGB_565 格式代替默认的 ARGB_8888,前者每个像素占 2 字节,后者占 4 字节,同样一张图,内存占用少一半,配置代码:
    Glide.with(context).load(url).format(DecodeFormat.PREFER_RGB_565);  
    
  3. 定期断舍离:Glide 会自动跟着 Activity/Fragment 的生命周期清理内存,比如页面关掉时,把相关图片从内存删掉,也可以手动调用clear(imageView),避免 “过期图片” 占空间。
    比如一个短视频 APP,通过这三个技巧,内存峰值能从 500MB 降到 300MB 以下,OOM 崩溃率下降 70%。

话术示例
缓存雪崩就像 “电梯超载”,比如双十一零点,大量商品图片的缓存同时过期,几十万人同时请求,数据库像电梯一样可能被挤瘫。
大厂在大促时会做三件事:

  1. 错峰下班:给每个缓存设置不同的过期时间,比如原定 24 点过期,让有的 23 点 50 分过期,有的 0 点 10 分过期,像员工分批次下班,避免电梯拥挤。代码上可以加随机值:
    int expireTime = 24*60*60 + new Random().nextInt(3600); // 过期时间波动±1小时  
    
  2. 多级防护:最外层用 CDN 缓存(比如阿里云 OSS),扛住 80% 的图片请求,中间层用本地磁盘缓存,最后才到数据库,就像 “保安 + 前台 + 门禁” 三层过滤;
  3. 降级处理:如果流量实在太大,暂时给用户看低清图或模糊图,比如把 10MB 的高清图换成 1MB 的低清图,保证页面能加载,同时对数据库访问加锁,同一时间只允许一个线程更新缓存,其他线程等待,避免所有人同时挤向数据库。
三、HTTP 缓存与网络优化
问题 1:Cache-Control 头中 max-age、no-cache、no-store 的区别和使用场景?

回答核心

  • max-age=3600:缓存有效期 1 小时,期间直接读本地缓存,适合不常更新的图片(如商品主图);
  • no-cache:每次请求需服务器验证缓存有效性(发 304 请求),适合频繁更新但需浏览器缓存的图片(如活动海报);
  • no-store:禁止任何形式的缓存,响应内容不落地,适用于敏感图片(如用户证件照)。
  • 最佳实践:同时配置 ETag 和 Last-Modified,ETag 做精准校验(解决时间戳精度问题),Last-Modified 做快速判断,提升 304 命中率。
问题 2:客户端如何强制获取最新图片?服务器端如何配合?

回答核心

  • 客户端方案
    1. URL 添加版本号或时间戳(如image.jpg?v=2),破坏缓存键一致性;
    2. 设置请求头Cache-Control: no-cache,强制服务器验证;
    3. 清除本地网络缓存(OkHttp 中通过cache.remove(request))。
  • 服务器端配合
    1. 返回正确的 Cache-Control 头(如更新时设置max-age=0);
    2. 图片变更时更新 ETag 值,确保客户端能检测到变化。
四、性能监控与架构设计
问题 1:如何计算缓存命中率?大厂关注哪些核心指标?

回答核心

  • 计算公式:缓存命中率 =(内存命中数 + 磁盘命中数)÷ 总请求数 × 100%。
  • 监控手段
    1. Glide 开启 DEBUG 日志,筛选Fetched from memory cacheFetched from disk cache条目;
    2. 自定义 ModelLoader 统计各层命中次数;
    3. 关注衍生指标:内存峰值(Android Profiler 监控 Heap Size)、加载耗时(System.currentTimeMillis () 打点)、FPS(确保滑动≥55fps)。
  • 优化目标:内存命中率≥30%,磁盘命中率≥50%,整体命中率≥80%。
问题 2:设计一个高并发图片缓存系统,需要规避哪些坑?

回答核心

  • 核心坑点与对策
    1. 热点问题:高频图片集中失效,通过 “热点缓存 + 本地副本” 解决(如 Redis 热 key + 本地 Ehcache);
    2. 存储碎片化:URL 哈希冲突(概率极低),通过加盐哈希或 SHA-256 提升唯一性;
    3. 跨平台一致性:多端(Android/iOS/Web)缓存策略统一,如使用相同的 URL 参数规则和 Cache-Control 配置;
    4. 容量失控:磁盘缓存设置严格的 LRU 淘汰策略 + 过期时间(如 7 天未访问则删除),定期清理僵尸文件。

相关文章:

Android学习总结之Glide自定义三级缓存(面试篇)

一、三级缓存核心原理与设计 问题 1:为什么需要三级缓存?各层缓存的核心作用是什么? 回答核心 内存缓存:毫秒级快速响应,存储近期浏览的图片(如滑动列表来回切换的图片),通过 LRU…...

管理Oracle Data Guard的最佳实践

Oracle Data Guard的中文名字叫数据卫士,顾名思义,它是生产库的一道保障。所以管理Data Guard是DBA的一项重要工作之一,管理Data Guard时主要有以下几个注意点需要引起重视。 备份库的归档日志积压 一般情况下,生产库的归档日志是…...

iOS WebView和WKWebView怎么调试?

iOS WebView调试 本教程将指导您如何使用WebDebugX调试iOS应用中的WebView内容,包括WKWebView和UIWebView。通过本教程,您将学习如何检查WebView中的HTML、CSS和JavaScript,以及如何解决常见的WebView调试问题。 准备工作 在开始调试iOS W…...

笔记本电脑打开网页很慢,一查ip地址网段不对怎么处理

我有一个笔记本,在家里连WIFI后获取到的ip地址网段不对,那么常规做法是手动去配置个静态IP和DNS,要知道笔记本IP地址默认采用的是DHCP,也就是动态获取ip地址。如果手动设置静态IP,也就是固定IP的话,你换个场…...

【更新】全国省市县-公开手机基站数据集(2006-2025.3)

手机基站是现代通信网络中的重要组成部分,它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进,手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用,本分享数据可帮助分析移动通信网络的发展和优化。本次数据…...

iOS视频编码详细步骤(视频编码器,基于 VideoToolbox,支持硬件编码 H264/H265)

iOS视频编码详细步骤流程 1. 视频采集阶段 视频采集所使用的代码和之前的相同,所以不再过多进行赘述 初始化配置: 通过VideoCaptureConfig设置分辨率1920x1080、帧率30fps、像素格式kCVPixelFormatType_420YpCbCr8BiPlanarFullRange设置摄像头位置&am…...

行项目违反范围截止值

把允许负值打钩就可以,如果没有此字段,按照下面截图把屏幕格式放字段出来;字段放出来以后如果是灰色的话,就用SE16N调试模式修改字段值;...

Linux wlan 单频段 dual wifi创建

环境基础 TP LINK WN722N V1网卡linux 主机 查看设备是否支持双ap managed:客户端模式(连接路由器/AP)AP:接入点模式(创建热点)AP/VLAN:支持带VLAN标签的虚拟AP{ AP, mesh point, P2P-GO } &l…...

STC32G12K12实战:串口通信

STC32G12K128芯片写一个按键通过串口1发送字符串的程序。首先,确认芯片的串口1配置。STC32G系列通常使用UART1,相关的寄存器是P_SW1来选择引脚。默认情况下,UART1的TX是P3.1。 接下来是设置定时器作为波特率发生器。通常用定时器2&#xff0c…...

unity 鼠标更换指定图标

1.准备两张图 要求图片导入设置如下 将 Texture Type 改为 Cursor 确保 Read/Write Enabled 已勾选 取消勾选 Generate Mip Maps 将 Filter Mode 设为 Point (保持清晰边缘) 将 Compression 设为 None (无压缩) 2.创建脚本,把脚本挂到场景中 ,该…...

会话管理中的cookie,以及浏览器操作cookie,在express中设置,删除,和获取cookie

会话管理中的 Cookie以及在浏览器和 Express 中操作 Cookie: 🍪 一、Cookie 在会话管理中的作用 ✅ Cookie 的定义: Cookie 是服务器发送到浏览器并保存在本地的小段文本数据,浏览器会在之后的请求中将这些数据回传给服务器。 …...

Mac的web服务器

最近用了个人觉得比较好用的集成环境。Flyenv - FlyEnv | 一体化全栈环境管理工具. 支持macOS / Windows / Linux 链接放在这了。 mac上安装: brew install flyenv 等着安装成功就好了 给个图。ollama也有...

数据可视化大屏——南方草牧商品交易所

代码综述 整体结构与用途 这是一段用于构建网页的 HTML 代码,结合引入的 JavaScript 和 CSS 文件,初步推测该网页是南方草牧商品交易所的相关页面,主要展示了与草牧商品交易相关的各类数据,包括产品挂牌数、成交量、会员信息等&…...

AIGC与数字媒体实验室解决方案分享

第1部分 概述 1.1 建设目标 1.深度融合AIGC技术,培养能够驾驭新质生产力的数字媒体人才 通过引入前沿的AIGC技术,确保学生能够接触到最先进的人工智能应用。教学内容理论和实践结合,让学生在实际操作中熟练掌握AIGC工具,生成高…...

Qwen3模型架构、训练方法梳理

qwen3炼丹真是全是技巧,下面来看看,仅供参考。 https://huggingface.co/Qwen https://modelscope.cn/organization/qwen https://github.com/QwenLM/Qwen3 模型架构 Dense 模型结构改进: GQA、SwiGLU、RoPE、RMSNorm with pre-normalization…...

MySQL 学习(九)bin log 与 redo log 的区别有哪些,为什么快速恢复使用 redo log 而不用 bin log?

目录 一、bin log 与 redo log 的区别1)实现方式不同:2)日志内容不同:3)记录方式不同:4)使用场合不同: 二、为什么快速恢复使用 redo log 而不用 bin log? 面试题&#x…...

【消息队列】RabbitMQ基本认识

目录 一、基本概念 1. 生产者(Producer) 2. 消费者(Consumer) 3. 队列(Queue) 4. 交换器(Exchange) 5. 绑定(Binding) 6. 路由键(Routing …...

RabbitMQ 快速上手:安装配置与 HelloWorld 实践(二)

四、RabbitMQ 配置 4.1 用户及权限管理 在 RabbitMQ 中,用户管理是保障系统安全和正常运行的重要环节。通过合理的用户及权限设置,可以确保不同的应用或服务在使用 RabbitMQ 时,只能访问其被授权的资源,避免非法操作和数据泄露。…...

蓝桥杯 17. 修改数组

修改数组 原题目链接 题目描述 给定一个长度为 N 的数组 A [A1, A2, …, AN],数组中可能包含重复的整数。 现在小明要按以下方法将其修改为没有重复整数的数组: 小明会依次修改 A2, A3, …, AN。 当修改 Ai 时,小明会检查 Ai 是否在 A…...

Redis内存淘汰策略和过期键删除策略有哪些?

Redis 提供 8 种内存淘汰策略,以下是详细解析及场景建议: 一、核心策略解析 noeviction (默认策略) 机制:内存满时拒绝新写入操作,返回错误优势:绝对数据安全场景:金融交易系统、医疗数据存储 allkeys-lr…...

基于 NanoDet 的工厂巡检机器人目标识别系统研究与实现​

摘要​ 本论文旨在设计并实现一个基于 NanoDet 模型的工厂巡检机器人目标识别系统。通过详细阐述数据集准备、模型训练、UI 界面构建以及系统部署的全过程,展示如何利用 NanoDet 模型的高效性和轻量化特点,结合合理的 UI 设计与数据集优化,使…...

深入解析Spring Security:JWT认证与授权实践

深入解析Spring Security:JWT认证与授权实践 引言 在现代Web应用中,安全性是至关重要的。Spring Security作为Spring生态中的安全框架,提供了强大的认证和授权功能。本文将重点介绍如何使用Spring Security结合JWT(JSON Web Tok…...

《隐私计算:数据安全与隐私保护的新希望》

一、引言 在数字化时代,数据已成为企业和组织的核心资产。然而,数据的收集、存储和使用过程中面临着诸多隐私和安全挑战。隐私计算作为一种新兴技术,旨在解决数据隐私保护和数据共享之间的矛盾。本文将深入探讨隐私计算的基本概念、技术原理、…...

Elasticsearch索引设计与调优

一、分片策略设计 1.‌分片容量规划 单分片容量建议30GB(日志场景可放宽至100GB),避免超大分片引发查询延迟。分片总数计算公式:总数据量 / 30GB 1.2(20%余量应对未来增长)。主分片数创建后不可修改,副本分片数支持动态调整。2.‌分片分布优化 PUT logs-2025 { &qu…...

什么是im即时通讯?私有化im即时通讯软件优势是什么?

在当前企业高度关注数据主权的背景下,私有化IM即时通讯软件(如BeeWorks)的部署模式成为企业实现数据自主控制、规避外部风险的核心解决方案。以下是针对企业数据主权诉求的私有化IM软件优势深度解析: 一、数据主权诉求下的私有化I…...

【unity游戏开发——编辑器扩展】EditorWindow自定义unity窗口拓展

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言一、自定义窗口1、创建窗口类2、创建窗口对象3、显示窗…...

深入理解Java HotSpot中的即时编译

即时编译(Just-In-Time Compilation,简称JIT)是Java虚拟机(JVM)的核心技术之一,通过在运行时将字节码转换为本地机器码,显著提升了Java应用程序的性能。本文基于HotSpot JVM,详细探讨了JIT编译的工作原理、优化技术、日志分析以及最新的编译器发展,旨在帮助开发者更好…...

【教程】Docker方式本地部署Overleaf

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景说明 下载仓库 初始化配置 修改监听IP和端口 自定义网站名称 修改数据存放位置 更换Docker源 更换Docker存储位置 启动Overleaf 创…...

解决docker alpine缺少字体的问题 Could not initialize class sun.awt.X11FontManager

制作的springboot项目镜像,缺少字体报错Could not initialize class sun.awt.X11FontManager 原因镜像中缺少字体 解决: 制作镜像时,添加字体库,Dockerfile文件 中添加如下内容 注意: jdk版本一定要使用&#xff0…...

深度解析智能体:从概念到应用的全方位洞察

在科技日新月异的当下,智能体已从人工智能的前沿概念逐渐走进大众视野,成为备受瞩目的焦点。那么,究竟何为智能体呢? 一、智能体的概念 智能体,简单来讲,可看作是“大模型 超级工具人”的有机融合。它能够…...

python 异步执行多个 python 命令

前提说明: 1. 有N套用 python 爬取客户不同网站上的评论的程序 2. 有一套用 python 将评论出成 Excel 报表的程序 新需求: 做一个总入口,异步同时爬不同网站评论,或同时出不同月份报表,或爬虫做报表同时做的 # -…...

Keil5 MDK 安装教程

## 简介 Keil MDK(Microcontroller Development Kit)是ARM开发的一款集成开发环境(IDE),主要用于ARM Cortex-M系列微控制器的开发。MDK包含了μVision IDE和调试器、ARM C/C编译器、中间件组件等工具。本教程将指导您完…...

Doris与ClickHouse深度比较

一、核心架构差异 分布式管理 Doris 采用 FE(前端)与 BE(后端)分离的 MPP 架构,FE 负责元数据管理和查询规划,BE 处理存储与计算,支持自动扩缩容和故障恢复。这种设计简化了集群管理&#xff0c…...

插入排序希尔排序

插入排序&希尔排序 插入排序:将数据整体当做一组,从头开始遍历,确保遍历完的子序列都是有序的; 希尔排序:基于插入排序,增加新的分组思想,对数据进行分组的插入排序。 平均时间复杂度、最快…...

windows文件共享另一台电脑资源管理器网络文件夹无法找到机器

找不到共享出来的文件夹 1 网络问题,明确两台机器是否同一局域网 2 明确两台机器在本地所选的网络类型是专用网络,还是公共网络,对应的防火墙是否关闭 3 smb协议没有启用 4 以上都设置完毕还是无法找到机器,使用ip访问 在资源管理器地址栏输入 \\<对方IP>&#xff08;…...

K8S Ingress 实现金丝雀(灰度)发布

假设有如下三个节点的 K8S 集群&#xff1a; ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、场景分析 阅读本文&#xff0c;默认您已经安装了 Ingress Nginx。 1&#xff09;A/B 测试 A/B 测试基于用户请求的元信息将流量路由…...

Python笔记:在环境变量中增加了dll加载路径,python提示DLL加载失败

在环境变量中增加了dll加载路径&#xff0c;python提示DLL加载失败 1.问题描述 from PySide2 import QtCore 提示如下错误 ImportError: DLL load failed while importing QtCore: 找不到指定的模块。 2.问题原因 在Python3.8文档中的What’s New In Python 3.8找到如下说明…...

WinFrom 使用 LiveCharts 实现动态折线图

上方是Winfrom使用LiveCharts 插件实现的动态折线图&#xff0c;下面是实现步骤。 一、创建新项目 我这里使用的是.Net Framework4.6.1版本 二、添加引用包 这样就代表安装完成了 三、引用控件 四、逻辑代码 using LiveCharts.Defaults; using LiveCharts.Wpf; using Syst…...

Deep Learning(手写字识别 - CNN)

Deep Learning&#xff08;手写字识别&#xff09; 数据集&#xff08;MNIST&#xff09;基于 PyTorch 深度学习框架使用 CNN 算法进行手写字识别案例参考教程 数据集&#xff08;MNIST&#xff09; 数据集 Github 官网&#xff08;注&#xff1a;不知为何官网无法直接下载数据…...

HDD 安全擦除:何时以及如何在 Windows PC 上安全擦除硬盘

HDD 安全擦除是一种从硬盘驱动器 (HDD) 中永久删除所有数据的方法&#xff0c;其方式几乎无法恢复。那么&#xff0c;什么时候需要在 Windows 11/10/8/7 上安全擦除硬盘驱动器&#xff1f;如何安全地擦除硬盘驱动器&#xff1f;幸运的是&#xff0c;所有的答案都在本指南中。继…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-B. 错误代码与解决方案

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 附录B. PostgreSQL错误代码与解决方案速查表一、错误代码分类速查表二、常见错误代码详解三、错误排查方法论四、错误预防最佳实践五、典型错误场景解决方案六、官方资源与工…...

3DMAX脚本病毒Spy CA查杀方法

什么是Spy CA病毒&#xff1f; Spy CA是一种新型病毒&#xff0c;可以与从在线资源或3D商店下载的第三方3D模型一起下载该病毒。 该病毒是一种Maxscript代码&#xff0c;写入对象的自定义属性&#xff0c;并在打开场景、合并模型或操纵对象时执行。 通过对带有该病毒的场景做…...

联排半孔PCB如何进行SMT贴片?

在印刷电路板业务中&#xff0c;有两种将元件安装到电路板上的主要方法:联排半孔安装和表面安装。联排半孔安装是较老的技术&#xff0c;要求电路板制造商在PCB上钻孔并将引线插入孔中。最近&#xff0c;表面安装技术已经接管了该领域。 联排半孔元件 联排半孔元件有两种引线&a…...

CSS Grid布局:从入门到实战

CSS Grid布局&#xff1a;从入门到实战 一、初识Grid布局 还在为网页布局发愁吗&#xff1f;Flexbox虽然好用&#xff0c;但当遇到复杂布局时&#xff0c;CSS Grid才是真正的王者。Grid布局是CSS中最强大的二维布局系统&#xff0c;它就像一张无形的网格纸&#xff0c;让我们…...

小说所有设定(v3.0 preview)

设定以json格式提供&#xff1a; {"2y": {"2y_jsl": {"精神力的具体能力": {"学习能力组": {"瞬间掌握知识": "可以瞬间掌握所有知识&#xff0c;无需传统学习过程。","直接读取信息": "能直接…...

主题切换方案

方案一 CSS :root 选择器匹配文档的根元素。在 HTML 文档中&#xff0c;根元素就是 <html> 标签 1、定义颜色变量 可在公共样式文件里面定义 :root {--primary-color: #007bff; //定义颜色变量 } 2、使用 JavaScript 修改 CSS 变量 document.documentElement.styl…...

一个日志量突增的问题分析处理经历

问题描述 周一早上&#xff0c;还是和往常一样的巡检。通过告警日志&#xff0c;发现了生产区集群上的一个实例周末出现了异常。 图片 1 Alert_With_Checkpoint_log 如图&#xff0c;周六下午15时开始&#xff0c;数据库在线联机日志组疯狂切换&#xff0c;检查点发生的频率也…...

C#中的dynamic与var:看似相似却迥然不同

在C#编程的世界里&#xff0c;var和dynamic这两个关键字常常让初学者感到困惑。它们看起来都在定义变量时省略了显式类型声明&#xff0c;但实际上它们的工作方式和应用场景有着天壤之别。今天&#xff0c;让我们一起揭开这两个关键字的神秘面纱。 var&#xff1a;编译时的类型…...

VS Code 新旧版本 Remote-SSH 内网离线连接服务器方法(版本 ≤ 1.78.x 及 ≥ 1.79.0)

文章目录 前言版本概览目录结构模型迭代 旧版&#xff08;版本 ≤ 1.78.x&#xff09;离线部署流程1. 问题描述2. 原理说明3. 离线部署步骤 新版&#xff08;版本 ≥ 1.79.0&#xff09;离线部署流程1. 目录结构变化2. 全局设置调整3. 离线部署步骤 常见问题 & 排查总结与建…...

【unity游戏开发——编辑器扩展】使用EditorGUI的EditorGUILayout绘制工具类在自定义编辑器窗口绘制各种UI控件

注意&#xff1a;考虑到编辑器扩展的内容比较多&#xff0c;我将编辑器扩展的内容分开&#xff0c;并全部整合放在【unity游戏开发——编辑器扩展】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言常用的EditorGUILayout控件专栏推荐完结 前言 EditorG…...