Redis7——进阶篇(八)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。
基础篇:
- Redis(一)
- Redis(二)
- Redis(三)
- Redis(四)
- Redis(五)
- Redis(六)
- Redis(七)
- Redis(八)
进阶篇:
- Redis(九)
- Redis(十)
- Redis(十一)
- Redis(十二)
- Redis(十三)
- Redis(十四)
- Redis(十五)
接上期内容:上期完成了RedLock相关知识学习。下面学习redis的缓存过期淘汰策略,话不多说,直接发车。
一、什么是缓存过期淘汰策略?
在使用 Redis 作为缓存时,随着数据不断写入,缓存空间会逐渐被占满。缓存过期淘汰策略就是在缓存达到一定容量限制或者某些数据过期时,由Redis 决定删除哪些数据以释放空间,从而保证缓存能够持续高效运行的机制。它确保了缓存中始终保留着最有价值或最常访问的数据,避免因缓存溢出导致性能下降甚至服务不可用。
二、如何设置和查看Redis内存设置
(一)、查看Redis内存
①、命令查看
* 在 64bit 系统下,maxmemory 设置为 0 表示不限制 Redis 内存使用,物理机有多大内存,redis就使用多大内存。
生产上一般推荐配置物理机四分之三。
config get maxmemory
info memory
②、配置文件查看
vim redis6379.conf
(二)、修改设置Redis内存
①、命令设置
命令设置只针对本次生效,redis服务重启后失效。*maxmemory是bytes字节类型
config set maxmemory 10
config get maxmemory
②、配置文件设置
配置文件配置,永久生效。
vim redis6379.conf
三、Redis如何删除数据
如果一个key设置了过期时间,那它到了过期时间之后是不是马上就从内存中被被删除呢?如果不是,那过期后到底什么时候被删除呢??是个什么操作?
(一)、立即删除
Redis不可能时时刻刻遍历所有被设置了生存时间的key,来检测数据是否已经到达过期时间,然后对它进行删除。
立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。
但是立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力,让CPU心累,时时需要删除,忙死。。。。。。。这会产生大量的性能消耗,同时也会影响数据的读取操作。
总结:对CPU不友好,用处理器性能换取存储空间 (拿时间换空间)
(二)、惰性删除
# 开启憜性淘汰
lazyfree-lazy-eviction=yes
数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据 ;发现已过期,删除,返回不存在。
惰性删除策略的缺点是,它对内存是最不友好的。如果一个键已经过期,而这个键又仍然保留在redis中,那么只要这个过期键不被删除,它所占用的内存就不会释放。在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看作是一种内存泄漏–无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,这对于运行状态非常依赖于内存的Redis服务器来说,肯定不是一个好消息。
总结:对memory不友好,用存储空间换取处理器性能(拿空间换时间)
(三)、定期删除
定期删除策略是前两种策略的折中:定期删除策略每隔一段时间执行一次删除过期键操作并通过限制删除操作执行时长和频率来减少删除操作对CPU时间的影响。
周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。主要有两个特点:
- CPU性能占用设置有峰值,检测频度可自定义设置
- 内存压力不是很大,长期占用内存的冷数据会被持续清理
定期删除策略的难点是确定删除操作执行的时长和频率:如果删除操作执行得太频繁或者执行的时间太长,定期删除策略就会退化成立即删除策略,以至于将CPU时间过多地消耗在删除过期键上面。如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除束略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。
总结:用的好,万事大吉;用不好,比前两种策略好不到哪里去。
(四)、总结
立即删除,对CPU不友好,影响系统性能;惰性删除和定期删除,都有可能出现漏网之鱼,如果使用这两种策略,那么会导致redis内存空间紧张或者很快耗尽。必须要有一个更好的兜底方案......从而引出redis缓存过期淘汰策略。
四、Redis常见的缓存过期淘汰策略
(一)、常见淘汰策略
①、noeviction
当内存达到上限时,不淘汰任何数据,直接返回错误。这意味着如果继续尝试写入数据,命令将执行失败,适用于不允许数据丢失的场景。
②、alkeys-lru
从所有键(包括设置了过期时间和未设置过期时间的键)中,选择最近最少使用(Least Recently Used,LRU)的键进行淘汰。这种策略假设最近最少使用的键在未来一段时间内也不太可能被使用,通过淘汰这些键来释放内存空间。
③、volatile-lru
仅从设置了过期时间的键中,选择最近最少使用的键进行淘汰。与alkeys-lru相比,它只关注有过期时间的键,保留了未设置过期时间的键,适用于希望优先淘汰可能过期的数据,以保留更重要的长期数据的场景。
④、allkeys-random
从所有键中随机选择键进行淘汰。这种策略不考虑键的使用频率或过期时间,完全随机地选择要淘汰的键,适用于对数据的使用情况没有明显规律,或者希望均匀地淘汰数据的场景。
⑤、volatile-random
仅从设置了过期时间的键中随机选择键进行淘汰。类似于allkeys-random
,但只针对有过期时间的键,适用于在有过期时间的键中随机释放内存的场景。
⑥、volatile-tt
从设置了过期时间的键中,选择剩余生存时间(Time To Live,TTL)最短的键进行淘汰。即优先淘汰即将过期的键,这种策略能保证尽可能长时间地保留其他数据,同时及时清理即将过期的键,以释放内存空间。
⑦、allkeys-lfu
从所有键中,根据最近的使用频率(Least Frequently Used,LFU)来淘汰键。LFU 算法通过记录键的访问频率来判断其重要性,选择访问频率最低的键进行淘汰,认为使用频率低的键在未来被使用的可能性也较小。
⑧、volatile-lfu
仅从设置了过期时间的键中,根据使用频率选择淘汰的键。与allkeys-lfu
类似,但只针对有过期时间的键,适用于希望在有过期时间的键中,优先淘汰使用频率较低的键的场景。
(二)、LRU和LFU区别(重点)
LRU:最近最少使用页面置换算法,淘汰最长时间未被使用的页面,看页面最后一次被使用到发生调度的时间长短,首先淘汰最长时间未被使用的页面。
LRU(最近最少使用页面置换算法)例子:
假设系统为进程分配了 3 个物理块,初始时物理块为空。现在有一个页面访问序列:4,7,0,7,1,0,1,2,1,2,6 。
- 访问页面 4,由于物理块为空,将页面 4 装入第一个物理块,此时物理块内容为:[4]。
- 访问页面 7,将页面 7 装入第二个物理块,此时物理块内容为:[4, 7]。
- 访问页面 0,将页面 0 装入第三个物理块,此时物理块内容为:[4, 7, 0]。
- 再次访问页面 7,页面 7 已在内存中,无需置换,物理块内容仍为:[4, 7, 0]。
- 访问页面 1,内存已满,根据 LRU 算法,页面 4 是最长时间未被使用的页面,将页面 1 置换页面 4,此时物理块内容为:[1, 7, 0]。
- 再次访问页面 0,页面 0 已在内存中,无需置换,物理块内容仍为:[1, 7, 0]。
- 再次访问页面 1,页面 1 已在内存中,无需置换,物理块内容仍为:[1, 7, 0]。
- 访问页面 2,内存已满,此时页面 7 是最长时间未被使用的页面,将页面 2 置换页面 7,此时物理块内容为:[1, 2, 0]。
- 再次访问页面 1,页面 1 已在内存中,无需置换,物理块内容仍为:[1, 2, 0]。
- 再次访问页面 2,页面 2 已在内存中,无需置换,物理块内容仍为:[1, 2, 0]。
- 访问页面 6,内存已满,页面 0 是最长时间未被使用的页面,将页面 6 置换页面 0,此时物理块内容为:[1, 2, 6]。
LFU:最近最不常用页面置换算法,淘汰一定时期内被访问次数最少的页,看一定时间段内页面被使用的频率,淘汰一定时期内被访问次数最少的页。
LFU(最近最不常用页面置换算法)例子:
同样假设系统为进程分配了 3 个物理块,初始时物理块为空。有一个页面访问序列:1,2,3,2,4,3,2,1,4,5 。
- 访问页面 1,将页面 1 装入第一个物理块,此时物理块内容为:[1],页面 1 的访问次数记为 1 次。
- 访问页面 2,将页面 2 装入第二个物理块,此时物理块内容为:[1, 2],页面 2 的访问次数记为 1 次。
- 访问页面 3,将页面 3 装入第三个物理块,此时物理块内容为:[1, 2, 3],页面 3 的访问次数记为 1 次。
- 再次访问页面 2,页面 2 已在内存中,其访问次数增加到 2 次,物理块内容仍为:[1, 2, 3]。
- 访问页面 4,内存已满,此时页面 1、3 的访问次数都是 1 次(最少),选择先进入内存的页面 1 进行置换(在访问次数相同的情况下,一般先淘汰先进入的页面),将页面 4 装入第一个物理块,此时物理块内容为:[4, 2, 3],页面 4 的访问次数记为 1 次,页面 2 访问次数为 2 次,页面 3 访问次数为 1 次。
- 再次访问页面 3,页面 3 已在内存中,其访问次数增加到 2 次,物理块内容仍为:[4, 2, 3]。
- 再次访问页面 2,页面 2 已在内存中,其访问次数增加到 3 次,物理块内容仍为:[4, 2, 3]。
- 再次访问页面 1,内存已满,此时页面 4 的访问次数为 1 次(最少),将页面 1 置换页面 4,此时物理块内容为:[1, 2, 3],页面 1 的访问次数记为 1 次,页面 2 访问次数为 3 次,页面 3 访问次数为 2 次。
- 再次访问页面 4,内存已满,页面 1 的访问次数为 1 次(最少),将页面 4 置换页面 1,此时物理块内容为:[4, 2, 3],页面 4 的访问次数记为 1 次,页面 2 访问次数为 3 次,页面 3 访问次数为 2 次。
- 访问页面 5,内存已满,页面 4 的访问次数为 1 次(最少),将页面 5 置换页面 4,此时物理块内容为:[5, 2, 3],页面 5 的访问次数记为 1 次,页面 2 访问次数为 3 次,页面 3 访问次数为 2 次。
(三)、如何配置和修改
①、命令配置,单次生效
config get maxmemory-policy
config set maxmemory-policy volatile-lru
②、文件配置,永久生效
maxmemory-policy noeviction
(四)、如何选择哪种淘汰策略
- 在所有的 key 都是最近最经常使用,那么就需要选择 allkeys-lru 进行置换最近最不经常使用的key,如果你不确定使用哪种策略,那么推荐使用 alkeys-lru。
- 如果所有的 key 的访问概率都是差不多的,那么可以选用 allkeys-random 策略去置换数据
- 如果对数据有足够的了解,能够为 key 指定 hint(通过expire/ttl指定),那么可以选择 volatile-ttl 进行置换。
(五)、缓存过期淘汰策略配置性能建议
- 合理设置最大内存:根据服务器的实际内存情况和应用程序的需求,设置一个合适的maxmemory值。如果设置过小,可能导致频繁淘汰数据,影响缓存命中率;设置过大,则可能导致服务器内存不足,影响其他服务的运行。
- 监控内存使用和淘汰情况:通过INFO memory命令定期监控 Redis 的内存使用情况,以及查看淘汰策略的执行效果。
- 结合业务场景优化:根据应用程序的业务特点和数据访问模式,选择最适合的淘汰策略。对于一些读多写少,且热点数据明显的场景,allkeys-lru或volatile-lru可能效果较好;对于数据更新频繁,且对数据存活时间有特定要求的场景,volatile-ttl可能更合适。
五、总结
Redis 缓存过期淘汰策略是保证 Redis 缓存高效运行的关键机制。通过合理设置和选择淘汰策略,可以在有限的内存资源下,最大限度地提高缓存命中率,提升应用程序的性能。在实际应用中,需要根据业务需求、数据特点和服务器资源等多方面因素,综合考虑并优化缓存过期淘汰策略的配置。同时,持续监控和调整相关设置,以适应不断变化的业务场景。
ps:努力到底,让持续学习成为贯穿一生的坚守。学习笔记持续更新中。。。。
相关文章:
Redis7——进阶篇(八)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...
蓝桥杯 封闭图形个数 刷题笔记
分析 写一个node结构 定义两个数一个存数值 一个存图形个数 分解每个输入的数 的每一位 为每个输入的数赋值一个封闭图形个数的值作为判断依据 重写 cmp函数作为 sort的判断依据 #include<iostream> #include<bits/stdc.h> using namespace std; const int N…...
AI大模型底层技术——结合 Prompt Engineering 的 LoRA
目录 1. 结合 Prompt Engineering 的 LoRA? (1) 定义 (2) 核心思想 2. 核心功能 3. 对比传统通用微调 4. 技术要素 (1) Prompt Engineering (2) LoRA 微调 (3) Prompt & LoRA 协同优化 5. 难点及解决 6. 技术路径 7. 具体技术实现 8. 应用场景 9. …...
7-Zip如何创建分卷压缩文件,进行分批压缩?
相信很多小伙伴在传输文件时会选择先压缩成7-Zip等压缩包后再传输,但如果压缩的文件过大大,传输速度就会很慢,或者上传压缩文件到云盘时也会受到文件大小的限制。 要解决以上问题,我们可以 把文件压缩成多个标准的压缩包…...
【蓝桥杯省赛】 02 包子凑数
题目描述 小明想知道包子铺用给定的蒸笼规格能凑出多少种无法组成的包子数目。若无法组成的数目无限,输出 INF。 输入格式 第一行为整数 N N N(蒸笼种数)接下来 N N N 行每行一个整数 A i A_i Ai(每种蒸笼的包子数&#x…...
人工智能通识速览(Part3. 强化学习)
三、强化学习 1. 基本概念 强化学习是机器学习中的一个重要领域,它涉及智能体(agent)如何在环境中采取一系列行动,以最大化累积奖励。以下是关于强化学习的详细介绍: 智能体:是一个能够感知环境并采取行动…...
深度解析LinkedList工作原理
引言 在 Java 编程中,集合框架是处理数据存储和操作的强大工具。LinkedList 作为其中的重要成员,为我们提供了一种灵活的列表实现方式。与 ArrayList 基于数组的实现不同,LinkedList 采用链表结构,这使得它在某些操作上具有独特的…...
excel的逻辑类型函数(主要包括if、and、or、not、xor、iserror、iferror、true、false、ifs、ifna、switch)
目录 1. IF 函数2. AND 函数3. OR 函数4. NOT 函数5. XOR 函数6. ISERROR 函数7. IFERROR 函数8. TRUE 与 FALSE9. IFS 函数10. IFNA 函数11. SWITCH 函数 1. IF 函数 功能: 根据指定条件判断结果,如果条件为 TRUE,则返回一个值;…...
数据驱动金融韧性升级,开启数据交换“新范式”:构建“实时、国产化强适配”的数据交换与共享平台
在金融行业,数据不只是“资产”,更是贯穿风控、合规、营销与运营的核心“生命线”。而在数字化加速与信创战略并行推进的当下,金融行业对于“实时数据流通”的需求从未如此迫切。 面对业务复杂性提升、国产化替代加速,以及监管科…...
cpp自学 day20(文件操作)
基本概念 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 通过文件可以将数据持久化 C中对文件操作需要包含头文件 <fstream> 文件类型分为两种: 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的…...
Qt饼状图在图例上追踪鼠标落点
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、饼状图的关键接口二、关键代码1.鼠标移动事件2.核心判断逻辑 总结 前言 最近做了一个项目,需要当鼠标在饼状图上移动的时候展示Slice的内容&am…...
ZKmall开源商城服务端验证:Jakarta Validation 详解
ZKmall开源商城基于Spring Boot 3构建,其服务端数据验证采用Jakarta Validation API(原JSR 380规范),通过声明式注解与自定义扩展机制实现高效、灵活的数据校验体系。以下从技术实现、核心能力、场景优化三个维度展开解析&#…...
操作系统概述(3)
批处理系统 1.单道批处理系统 单道批处理系统是成批地处理作用,并且始终只有一道作业在内存中的系统。优点:提高系统资源的利用率和系统吞吐量。缺点:系统中的资源得不到充分利用。 2.多道批处理系统 引入多道程序设计技术,是…...
深入理解 Object.entries():基础用法与 Object.keys() 的核心区别
深入理解 Object.entries():基础用法与 Object.keys() 的核心区别 一、Object.entries() 是什么? Object.entries() 是 JavaScript 中的一个内置方法,用于将对象的 可枚举属性(自身的、非继承的)转换为一个数组。…...
GitHub 趋势日报 (2025年04月06日)
GitHub 趋势日报 (2025年04月06日) 本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星语言1microsoft/markitdownPython tool for converting files and office documents to Markdown.⭐ 548Py…...
Visual Studio 中使用 Clang 作为 C/C++ 编译器时,设置优化选项方法
在 Visual Studio 中使用 Clang 作为 C/C 编译器时,可以通过以下方法设置优化选项: 方法 1:通过项目属性设置(推荐) 右键项目 → 属性 配置属性 → C/C → 优化 优化:选择优化级别 /O0 - 禁用优化&#x…...
现场测试的特点与测试设备的基本要求
在各类测试场景中,现场测试有着不可替代的作用。不过,它也面临着诸多难题,对测试设备也有着特殊要求。今天,咱们就深入探讨一下现场测试的特点与测试设备的基本要求。 现场测试的特点 场地电磁环境噪声问题 建议环境噪声低于…...
构建一个最简单的UDP服务器和客户端并逐行解析
目录 1.服务器 (1)基本概念 (2)代码实现 3.逐行解析 1) 2) 3) 4) 5) 6) 7) 8) 1. response.getBytes(): 2.response.get…...
LeetCode 1638 统计只差一个字符的子串
标题:LeetCode 算法题 - 统计只差一个字符的子串数目 在算法学习的过程中,我们经常会遇到一些有趣的字符串问题。今天就来探讨一道这样的题目:给定两个字符串 s 和 t ,找出 s 中的非空子串的数目,这些子串满足替换一个…...
DAY 39 leetcode 18--哈希表.四数之和
题号18 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 和…...
关于lombok的异常快速解决办法
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
Android SELinux权限使用
Android SELinux权限使用 一、SELinux开关 adb在线修改seLinux(也可以改配置文件彻底关闭) $ getenforce; //获取当前seLinux状态,Enforcing(表示已打开),Permissive(表示已关闭) $ setenforce 1; //打开seLinux $ setenforce 0; //关闭seLinux二、命令查看sel…...
JavaWeb注解的原理
WebServlet("/mayikt") 是 Java Servlet 3.0 及以上版本中引入的注解,用于简化 Servlet 的配置。其原理和与 Servlet 映射关系的知识点如下: 1. 注解的作用与原理 核心功能: WebServlet 注解的作用是将当前类声明为一个 Servlet&am…...
类和对象—多态
目录 1、多态的概念2、多态的条件3、向上转型3.1 概念3.2 使用场景 4、向下转型5、多态的优缺点 1、多态的概念 多态,通俗来讲就是多种形态,即对于同样的行为,不同的对象去完成会产生不同的状态。比如动物都会吃东西,小狗和小猫都…...
vscode启动vite+Vue3项目调试功能,QQ浏览器为例
1、增加launch.json配置 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{"type&quo…...
Spring MVC 的执行流程以及运行原理
一.什么是 MVC? MVC 是 Model 、 View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责, MVC 是一种软件设计规范。它将业务逻辑、数据、显示分离的方法来组织代码,降低了视图与业 务逻辑之间的…...
08-Spring MVC 请求处理流程全解析
Spring MVC 请求处理流程全解析(从 DispatcherServlet 到 Controller) Spring MVC 是构建 Web 应用的基础框架,而其中最核心的组件就是 DispatcherServlet,它作为整个请求流程的入口和协调者,掌控了从接收请求、分发到…...
pikachu靶场搭建教程,csfr实操
靶场安装 靶场下载地址 百度网盘下载地址和密码 百度网盘 请输入提取码 0278 github靶场下载地址 https://gitcode.com/Resource-Bundle-Collection/c7cc1 安装前提 这两个文件夹的配置文件都要进行更改修改数据库密码 D:\phpstudy_pro\WWW\pikachu\inc D:\phpstudy_pro…...
MCP + 数据库,一种比 RAG 检索效果更好的新方式!
大家好,欢迎来到 code秘密花园,我是 ConardLi。 在今天这一期,我们将一起学习一种基于 MCP 提高大模型检索外部知识精度的新思路,实测比 RAG 效果要好很多。 目前市面上讲 MCP 的教程比较多,但大多数都是一些概念性的…...
图像处理中的梯度计算、边缘检测与凸包特征分析技术详解
前言 书接上文 OpenCV图像处理实战全解析:镜像、缩放、矫正、水印与降噪技术详解-CSDN博客文章浏览阅读1.1k次,点赞38次,收藏29次。本文系统解析OpenCV图像处理五大实战场景:镜像反转的三种坐标变换模式,图像缩放的尺…...
TDengine 与 taosAdapter 的结合(一)
一、引言 在当今数字化时代,数据量呈爆发式增长,尤其是物联网、工业互联网等领域产生的海量时序数据,对数据存储和处理提出了极高要求。TDengine 作为一款高性能、开源的时序数据库,专为这些场景设计并优化,在时序数据…...
23种设计模式-行为型模式-模板方法
文章目录 简介场景解决代码关键优化点 总结 简介 模板方法是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。 场景 假如你正在开发一款分析文档的数据挖掘程序。用户需要向程序输入各种格式&…...
Django异步执行任务django-background-tasks
1、安装 pip install django-background-tasks 2、注册服务 INSTALLED_APPS [...background_task, ]3、生成表 // 生成迁移 python manage.py makemigrations //运行迁移 python manage.py migrate 4、创建文件,模拟任务 from background_task import backgrou…...
从零设计React-Markdown组件的实现方案
从零设计React-Markdown组件的实现方案 现在,把这些步骤整理成代码结构。首先是解析器类,用正则表达式分割文本为Token,然后生成AST。接着,编写一个React组件,接收Markdown字符串,解析成AST,遍历AST生成对应的React元素。处理代码高亮需要引入第三方库,但用户不允许用现…...
如何在React中集成 PDF.js?构建支持打印下载的PDF阅读器详解
本文深入解析基于 React 和 PDF.js 构建 PDF 查看器的实现方案,该组件支持 PDF 渲染、图片打印和下载功能,并包含完整的加载状态与错误处理机制。 完整代码在最后 一个PDF 文件: https://mozilla.github.io/pdf.js/web/compressed.tracemo…...
React-Markdown 组件底层实现原理详解
如何在 React 中渲染 Markdown 文档 React-Markdown 组件底层实现原理详解 一、核心架构:基于 Unified.js 的编译流水线 React-Markdown 的底层实现依赖于 Unified.js 这一开源内容处理系统,其核心是一个可插拔的编译流水线。整个过程分为四个阶段&…...
基于单片机的防火防盗报警系统设计(论文+源码)
2.1系统的功能及方案设计 本次课题为基于单片机的防火防盗报警系统,其系统采用STC89C52单片机为控制器,并结合SIM800短信模块,DS18B20温度检测模块,MQ-2烟雾检测模块,红外人体检测模块,按键模块,…...
NO.72十六届蓝桥杯备战|搜索算法-DFS|选数|飞机降落|八皇后|数独(C++)
P1036 [NOIP 2002 普及组] 选数 - 洛谷 组合型枚举,路径⾥⾯记录选择数的「总和」。在选出k 个数之后,判断「是否是质数」 #include <bits/stdc.h> using namespace std;const int N 25; int n, k; int a[N];int ret; int path; //记录路径中所…...
网络Socket编程基于UDP协议模拟简易网络通信
一、预备知识 网络编程(Network Programming)是指编写程序来实现计算机网络之间的通信。这通常涉及到使用套接字(sockets)来建立连接、发送和接收数据。 (一)套接字 套接字(Socket࿰…...
rust 使用select退出线程
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct Capture {clear: bool, // ????????interface: String, // ??times: u64, // ?? }pub async fn cmd_capture(State(web_env): State<ArcWebEnv>,Json(args): Json<C…...
C++学习day7
思维导图: 使用vector实现一个简单的本地注册登录系统 注册:将账号密码存入vector里面,注意防重复判断 登录:判断登录的账号密码是否正确 #include <iostream> #include <cstring> #include <cstdlib> #includ…...
【学习笔记】CoACD: 基于碰撞感知凹性与树搜索的近似凸分解
CoACD 基于碰撞感知凹性与树搜索的近似凸分解 CoACD 官方文档 CoACD(Convex Approximation of Complex Decompositions)是一种用于将复杂网格分解为多个凸包的算法, 专为 3D 网格设计了近似凸分解算法,强调在保持物体间潜在碰撞条件的同时减…...
Three.js 系列专题 6:后处理与特效
内容概述 后处理(Post-Processing)是在渲染完成后对画面进行额外的处理,以实现模糊、辉光、颜色校正等效果。Three.js 通过 EffectComposer 提供后处理支持。本专题还将简要介绍着色器和粒子系统,为更复杂的特效打基础。 学习目标 掌握 EffectComposer 的基本使用。实现辉…...
2025 年江苏保安员职业资格考试经验分享
江苏保安行业发展成熟,2025 年考试注重对考生综合素养的考查。报考条件常规,但对诚信记录有额外关注,如有不良信用记录可能影响报考资格。 报名在江苏省各地级市公安局指定点进行,提交资料包括身份证、学历证、个人诚信报告&am…...
亚马逊算法重构消费市场:解码2024年Q1北美站热搜商品的底层逻辑
在跨境电商迈入精细化运营时代的背景下,亚马逊平台最新发布的《2024年Q1零售搜索趋势报告》揭示了算法驱动下的消费新图景。数据显示,北美站点月均超300万人次重复搜索特定品类商品,健康生活、智能家居等五大领域形成持续增长极。这份由亚马逊…...
powershell绑定按钮事件的两种方式
写一个powershell的简单GUI做本地任务,试验出2个方法: 方法1: function btn1_click {write-host $text1.Text -ForegroundColor Green -BackgroundColor Black }$btn1.Add_Click({btn1_click})方法2: $btn2_click {write-host $…...
LearnOpenGL——OIT
教程地址:简介 - LearnOpenGL CN 简介 原文链接:LearnOpenGL - Introduction 前言 在混合(Blending)章节中,我们介绍了颜色混合的主题。混合是在3D场景中实现透明表面的方法。简而言之,透明度涉及到在计算…...
【蓝桥杯】Python大学A组第十五届省赛
1.填空题 1.1.拼正方形 问题描述 小蓝正在玩拼图游戏,他有个的方块和个的方块,他需要从中挑出一些来拼出一个正方形。 比如用个和个的方块可以拼出一个的正方形;用个的方块可以拼出一个的正方形。 请问小蓝能拼成的最大的正方形的边长为多少。 import math # 2*2的个数 a =…...
使用JS+HTML+CSS编写提词器实例
手搓提词器网页版,有些BUG但是基本功能使用没有问题,有需要的可复制粘贴,BUG自行修复。下面直接进入代码: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><me…...
人工智能基础知识详解:从概念到前沿技术与应用
在数字化浪潮席卷全球的今天,人工智能(Artificial Intelligence,简称AI)已不再是科技前沿的神秘概念,而是融入我们日常工作的实用工具。从智能语音助手到自动驾驶汽车,从医疗影像诊断到生成式艺术创作&…...