初识Redis · 缓存
目录
前言:
引入缓存
缓存更新策略
定期生成
实时生成
缓存注意事项
缓存预热
缓存穿透
缓存雪崩
缓存击穿
前言:
我们在Redis的学习中,逐渐了解到了Redis的用途是可以用来当作内存数据库,缓存,消息队列等,虽然现在消息队列的中间件有了更多的选择,但是仍然不影响Redis在内存数据库和缓存中的地位。
今天我们就来学习Redis作为缓存的时候,需要注意哪些事项以及对应的缓存更新策略。废话不多说,进入主题。
引入缓存
学习Redis作为缓存的时候,我们首先要清楚的是缓存究竟是什么?
缓存(Cache)的定义是:
缓存是存储在高速存取介质中的一份数据副本,目的是为了加速数据访问,减少系统延迟和降低后端负载。
缓存的目的就是为了加快访问,在日常生活中,我们拿浏览器举例子,浏览器就是使用硬盘中的数据充当缓存的,比如从网络中获取到的图片,音视频,字体等,都可以加载到硬盘里面,下次访问的时候就不用再次从网络中获取数据了。这也是为什么有的时候我们会看到浏览器所在的目录多出来一些莫名其妙的东西。
这些文件通常就是浏览器缓存的一部分,如果我们清理了缓存,也不会造成严重问题,只是需要重新加载资源。
缓存的意义主要是提高访问速度,那么Redis的定位就是作为内存级别的缓存,作为硬盘的缓存,当然,上面的浏览器是使用硬盘作为缓存,我们由此可见缓存是无处不在的。你要是分的再细一点,在计算机架构中,CPU内部为了提升处理速度,也引入了多级缓存机制(如L1、L2、L3 Cache),本质上与我们今天讲的缓存思想一致。
对于缓存来说,往往存在一个“二八定律”,即百分之20的数据就可以满足百分之八十的访问需求,那么我们就可以把这个百分之20的数据作为缓存使用,当然了,缓存的空间是比较小的,所以实际中我们还需要根据不同的策略细化一下。
那么Redis的存在通常是作为数据库的缓存,拿我们常学的MySQL来说,我们就可以使用Redis作为MySQL的缓存。主要是因为MySQL是一个关联型的数据库,那么速度慢是它一大缺点,我们就可以使用Redis作为缓存来弥补这个缺点。
我们不妨思考一下,为什么MySQL的速度慢?
1.因为MySQL是一个关联型数据库,执行SQL语句的时候会对SQL语句执行一系列的解析,校验,优化等操作。
2.对于一些复杂逻辑的查询,比如笛卡尔积,多表连接查询,效率自然也不会特别好
3.它的所有数据都是存放在硬盘里面的,硬盘的IO速度并不快,并且还是随机访问
4.如果查询的时候没有命中索引,那么需要对每个表遍历,也会大大的增加IO次数
我们不仅可以从软件上来找到MySQL慢的原因,还可以通过硬件层面的操作找到MySQL慢的原因。
并且还有一个点,因为MySQL“抗压能力”不强,每次服务器处理请求的时候,消耗的硬件资源如果超过了主机的某个部分的临界值,比如内存,网络,硬盘,整个系统就容易宕机,也就是说MySQL在处理高并发量上还是差点意思的。
所以Redis的出现就很好的弥补了这些缺点,通过统计的方式获取到热点数据,访问的时候先走Redis,找不到再走MySQL,那么就能减轻MySQL的很多压力了。
这是一种节流的方案,也可以通过开源的方式,比如引入多个服务器,构成一个服务器集群,这样也能提高并发量,不过成本似乎有点高了~
以上是引入缓存的一个基本话题,我们提到了通过统计的方式获取到热点数据,那么热点数据是如何更新的呢,我们就来分析分析,移步到下面的缓存更新策略~
缓存更新策略
对于缓存更新策略,我们要清楚为什么存在这种更新策略?
热点数据是不会一直“热”下去的,比如春节前后,搜索框里最多的关键词就是“春节晚会”,那么它就是这段时间的热点数据,春节一过,它冷下来之后应该如何更新,用什么数据来替换都是我们思考的点。
在Redis中分为了两大类更新策略,分别是定期生成和实时更新,其中实时更新还更加细分为了四种更新策略。
定期生成
在服务器中,有一个非常重要的东西叫做日志,日志记录的是服务器上进行的各种操作,也可以记录在服务器上出现的数据,那么,我们就可以通过日志把在服务器上出现的数据统计出来。
通过统计次数的方式,获得不同关键词的频率,按照频率进行排序,采用降序的方式取前面百分之二十左右的数据,将它们认为是热点词,接下来就可以把这些热点词放到Redis里面了,不过Redis不是作为缓存必要的软件,像搜狗使用的是自己写的服务器,阿里也是使用阿里自研的tai。
那么上面的这个操作涉及到的数据量是非常庞大的,对于数据工程师来说,他们每天的日常是包含了上面的数据统计工作的。
但是实际上来说,数据量如此庞大,一台机器是可能存不下的,所以需要引入分布式的系统来存储这些日志,当然后续的工作就就是数据工程师的事儿了。
那么基于如此庞大的数据量的情况下,我们应该选择一个合适的时间来统计一次数据,可能是一天,可能是一周,那么这种数据量让人工来实现是不现实的,一般来说都快写一套离线的脚本,比如shell脚本,python脚本等。
对于脚本要实现的功能是,完成统计热点数据的过程,根据热点数据找到对应的value,将对应的数据同步到Redis中,控制存放缓存数据的服务器重启。
那么它的优点就是操作非常简单,写完脚本咱们也就不用管其他的了,整个过程是简单可控的,但是呢,它的实时性不够,是面对突发事件的处理能力差劲,比如春节相关的热词,突然成为热词的时候恰好Redis已经更新了,下次是一周之后,这样的话就会对MySQL造成非常大的压力。
此时就应该引入另一种更新策略了,即实时生成。
实时生成
对于实时生成来说,分为了四种策略,分别是FIFO(First in first out)先进先出,LRU(least recently used)淘汰最久未使用的,LFU(least Frequently used)淘汰访问次数最少的,Random随机淘汰。
即对于实时生成的策略来说,根据了不同的情况分为了四种,其中最不合理的就是Random了,其他的三种会根据实际情况使用,根据时间,根据次数,根据顺序分别更新即可。
而在Redis中对于实时生成也有对应的配置项来选择采取上述的哪种内存更新策略。
策略名称 | 策略英文名 | 描述 | 适用场景示例 |
---|---|---|---|
volatile-lru | Least Recently Used (on volatile keys) | 在设置了过期时间(TTL)的键中,使用最近最少使用(LRU)算法淘汰。 | 只想淘汰设置了过期时间的缓存型数据 |
allkeys-lru | Least Recently Used (on all keys) | 在所有键中(无论是否设置TTL),使用最近最少使用(LRU)算法淘汰。 | 所有数据都可以被淘汰,适合纯缓存场景 |
volatile-lfu | Least Frequently Used (on volatile keys) | 在设置了TTL的键中,使用最少使用频率(LFU)算法淘汰。 | 精确控制热点数据淘汰 |
allkeys-lfu | Least Frequently Used (on all keys) | 在所有键中,使用最少使用频率(LFU)算法淘汰。 | 需要严格基于访问频次管理缓存 |
volatile-ttl | Shortest Time to Live | 在设置了TTL的键中,优先淘汰剩余生存时间(TTL)最短的键。 | 临近过期的数据优先淘汰 |
volatile-random | Random (on volatile keys) | 在设置了TTL的键中,随机淘汰。 | 要求简单快速淘汰,数据一致性不敏感 |
allkeys-random | Random (on all keys) | 在所有键中随机淘汰。 | 紧急释放内存,对淘汰精准性要求低 |
noeviction | No Eviction | 拒绝写入新数据(返回错误),不淘汰任何已存在数据。 | 数据严谨性要求高,不能丢失任何缓存 |
当然我们不用记,它在原来的时间,次数的基础上加入了过期时间,所以分为了volatile/allkeys - lfu/lru。
而最后的noeviction的出现,其实是我们漏说的一种情况,因为服务器最开始启动的时候,实际上是Redis里面是没有任何东西的。
那么往Redis存入数据的时候,势必会有一个点是内存爆满的一个点,那么这个时候我们是拒绝更新还是进行更新,就要看实际情况了。
不过主要还是上面的几种。
缓存注意事项
在缓存中,有常见的四种的问题,分别是缓存预热,缓存穿透,缓存雪崩,缓存击穿,这里我们逐个讲解。
缓存预热
缓存预热是指在系统启动或上线初期,提前将热点数据加载到缓存中。以电商平台为例,若用户访问的数据不在缓存中,请求将直接打到数据库(如 MySQL)。但 MySQL 难以承受高并发请求,容易出现宕机风险,导致系统不可用。
为此,常见做法是在系统启动时或定期将热点数据或基于历史访问记录的数据提前写入缓存,从而有效降低数据库压力,提升系统稳定性和响应速度。
对于首次上线的系统,由于没有历史访问数据,预热的数据通常来源于业务方的预估、配置文件、或者灰度测试阶段的行为统计。例如,在电商平台中,可以提前将首页的推荐商品、活动页的秒杀商品等高频数据写入缓存,从而保障系统初期的稳定性和响应速度。
缓存穿透
缓存穿透指的是:请求的数据既不在缓存中,也不在数据库中,导致每次请求都绕过缓存直达数据库,持续下去会给数据库带来较大压力,甚至可能导致系统雪崩。比如一个key,查询的时候在Redis里面没有,那么正常走到MySQL访问,可是MySQL中也没有,那么一次两次是没有问题的。但是关键是如果连续多次的访问一个并不存在的key,这就会给MySQL带来较大的压力,毕竟有的时候这种不存在的key是会存在多个的。
那么出现这种key的情况有大概三种,第一种是业务设计的不合理,没有正确的校验key,导致非法的key也被查询,第二种是开发的时候误操作了,误删了一批的key也是有可能的,第三种就是黑客攻击了,这种不是太常见,所以第一种是非常典型的,第二种虽然没有那么典型,但是也是导致缓存穿透的一种情况,第三种我们了解即可。
那么对应的解决方案有多种,这里我们介绍两种,第一种解决方案是查到这个key在缓存和数据库都没有的时候就将它存到Redis里面,不过对应的value是空值,这种方案简单有效,能避免数据绕过redis直接访问MySQL,当然,我们也应设置一些过期时间,也不能存太多的无效数据。第二种解决方案是使用布隆过滤器,每次请求的数据的现在布隆过滤器中判断是否存在,如果没有直接拦截即可,它虽然有一定的误判,但是不会漏判,也能极大程度的解决穿透的问题。
缓存雪崩
缓存雪崩指的是短时间内Redis上大规模的key失效了,导致缓存命中率陡然下降,从而给MySQL带来较大的压力,甚至导致MySQL宕机。
导致大规模的key有两种情况,一种是Redis直接挂了,那么数据请求只能走MySQL,这个时候就是非常危险的了,当然,Redis挂了可能指的是redis宕机或者是集群模式下Redis的大规模节点宕机,这种都是Redis挂了导致的缓存雪崩。一种是Redis大量key的过期时间一样,所以导致短时间内大量的key同时失效。
那么对应的解决方法,针对于第一种肯定就只能加强监控报警了,针对第二种就是在设置过期时间的时候添加一些随即因子,主要还是为了避免同一时刻大规模的key过期。
缓存击穿
缓存击穿指的是Redis上的大量热点数据同时过期,是缓存雪崩的一种特殊情况,导致的结果同样还是大量的请求直达MySQL,从而导致系统整体不可用。
那么对于缓存击穿来说,它单从字面上来说还是比较容易和缓存穿透混淆的,但是我们应该清楚穿透是因为key在Redis和MySQL上都没有,击穿是因为大量热点数据过期,导致请求直达MySQL,这两者是完全不一样的概念。
那么我们的解决方法可以分为针对热点数据设置永不过期,或者是通过分布式锁来限制数据库的访问频率,即通过数据库服务降级的方式,来减少数据库承受的并发量。
感谢阅读!
相关文章:
初识Redis · 缓存
目录 前言: 引入缓存 缓存更新策略 定期生成 实时生成 缓存注意事项 缓存预热 缓存穿透 缓存雪崩 缓存击穿 前言: 我们在Redis的学习中,逐渐了解到了Redis的用途是可以用来当作内存数据库,缓存,消息队列等&…...
Redis性能优化终极指南:从原理到实战的深度调优策略
一、内存优化:构建高效存储体系 1.1 三级过期键管理机制 Redis通过组合策略实现精准的内存回收: 定时删除(主动淘汰) 创建定时器在键到期时立即删除 优点:及时释放内存 缺点:高CPU消耗(每个…...
哈希表笔记(一 )
设计思路 核心功能和 API 设计 (Core Functionality & API Design): 基本操作: 必须提供核心的 put(key, value)(添加或更新键值对)、get(key)(根据键获取值)、remove(key)(根据键删除键值对)、contain…...
c网络库libevent的http常用函数的使用(附带源码)
Libevent HTTP 核心函数详解与实战 核心概念HTTP 服务器端常用函数1. 初始化与绑定2. 设置请求处理回调3. 在回调函数中处理请求4. 发送响应5. 启动与停止6. 清理资源 HTTP 客户端常用函数1. 初始化2. 创建连接3. 创建并发送请求4. 在回调函数中处理响应5. 启动事件循环与清理 …...
java练习3
随机生成20个数字(随机种子) 分别使用冒泡排序、二叉树排序、插入排序进行排序 并输出最终结果以及三种排序使用的时间 package a01_第一次练习.a03_排序;import java.time.Duration; import java.time.LocalDateTime; import java.util.TreeSet;publi…...
当 AI 成为 “数字新物种”:人类职业的重构与进化
一、AI 的 “替代清单”:从流水线到办公室的全面侵袭 在深圳某智能工厂,机械臂正以 0.01 毫米的精度完成手机组装,100 台机器人 24 小时运转,替代了 3000 名工人。这种场景正在全球制造业蔓延 —— 麦肯锡预测,到 203…...
HarmonyOS ArkUI交互事件与手势处理全解析:从基础到高级实践
文章目录 一、交互事件1.1 通用事件1.1.1 事件分发1.1.1.1 触摸测试1. 触摸测试基本流程2. 触摸测试控制3. 自定义事件拦截4. 禁用控制5. 触摸热区设置6. 安全组件 1.1.1.2 事件响应链收集 1.1.2 触屏事件1.1.3 键鼠事件1.1.3.1 鼠标事件1.1.3.2 按键事件 1.1.4 焦点事件1.1.5 …...
【计算机网络】面试常考——GET 和 POST 的区别
GET 和 POST 的区别 GET 和 POST 是 HTTP 协议中最常用的两种请求方法,它们的主要区别体现在 用途、数据传输方式、安全性、缓存机制 等方面。以下是详细对比: 1. 用途 GET POST 主要用于 获取数据(如查询、搜索)。 主要用于 提…...
AI编程工具“幻觉”风险与飞算JavaAl的破局之道
近年来,AI编程辅助工具迅速崛起,极大地提升了开发者的工作效率。然而,这些工具普遍存在一个被称为“幻觉”(hallucination)的风险——AI可能会生成看似合理但实际错误、不安全或低效的代码。这种现象在复杂业务逻辑和特定领域开发中尤为明显&…...
【Python零基础入门系列】第1篇:Python 是什么?怎么装环境?推荐哪些 IDE?
各位网友们,欢迎来到我的 Python 学习专栏! 前两天看到新闻英伟达为 CUDA 添加原生 Python 支持,意味着开发者可直接用 Python 操作 GPU,加速 AI 和高性能计算,降低门槛,让 Python 的应用范围更广、能力更强。 一直想写一系列文章教知友们从零开始学会 Python 编程,目…...
VPN访问SAP组服务器报登陆负载均衡错误88:无法连接到消息服务器(RC=9)
用户反馈用SAPGUI接入SAP时报错:登陆负载均衡错误88:无法连接到消息服务器(RC9) 经了解是通过VPN访问,但VPN没有放行ICMP访问,导致不能PING通,不能确认是网络问题还是什么问题。 解决方案: 1、VPN由原&am…...
Linux查看程序端口占用情况
大家好,欢迎来到程序视点!我是你们的老朋友.小二! 核心问题: Tomcat 8080端口启动失败,提示端口被占用,但常规检查未发现Tomcat进程占用该端口。 关键排查步骤: 初步检查 使用 ps -aux | gre…...
[C]基础14.字符函数和字符串函数
博客主页:向不悔本篇专栏:[C]您的支持,是我的创作动力。 文章目录 0、总结1、字符分类、转换函数2、strlen的使用和模拟实现2.1 strlen的使用2.2 strlen的模拟实现 3、strcpy的使用和模拟实现3.1 strcpy的使用3.2 strcpy的模拟实现 4、strcat…...
三种机器学习类型
本文讲介绍三种机器学习类型:①监督学习,②无监督学习,③强化学习。我们主要了解监督学习和无监督学习即可。 下图介绍这三种机器学习类型的区别: 1 用来预测未来的监督学习 从有标签的训练数据中学习一个模型,用来…...
UE5 Set actor Location和 Set World Location 和 Set Relative Location 的区别
在 Unreal Engine 的蓝图里,SetRelativeLocation、SetWorldLocation 和 SetActorLocation 三个节点虽然都能改变物体位置,但作用对象和坐标空间(Coordinate Space)不同: 1. SetActorLocation 作用对象:整个…...
Glide 如何加载远程 Base64 图片
最近有个需求,后端给出的图片地址并不是正常的 URL,而且需要一个接口去请求,但是返回的是 base64 数据流。这里不关心为啥要这么多,原因有很多,可能是系统的问题,也可能是能力问题。当然作为我们 Android 程…...
JVM对象存储格式
引言 在Java虚拟机(JVM)中,对象的内存布局是一个重要的底层概念,它直接影响对象在内存中的存储方式和占用空间。了解对象存储格式不仅有助于优化程序性能,还能帮助我们更好地理解JVM的工作原理。本文将详细探讨对象存…...
3D Gaussian Splatting部分原理介绍和CUDA代码解读
本系列旨在帮助无CUDA代码经验的读者、以及3DGS的初学者理解代码逻辑。 3D GS论文原文链接:https://arxiv.org/abs/2308.04079 论文笔记链接:【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering 【论文笔记】A Survey on 3D Ga…...
日本IT行业|salesforce开发语言占据的地位
在日本的IT行业中,Salesforce 开发语言处于一个较为专业但稳步增长的细分领域,并不是主流开发语言(如 Java、Python、PHP),但其在某些行业和场景中地位越来越重要。 本篇以下是详细分析: Salesforce开发语言…...
1.1 点云数据获取方式——引言
图1-1-1点云建筑场景图 点云数据是指能够描述外部场景、对象表面的三维空间位置,并具有相关属性的点集,其每个离散点通常包括三维空间位置(x,y,z)以及强度、颜色等属性信息。大量分布的离散点集能够清晰而直接地描绘场景、对象的3…...
接入层架构演变
1、单体架构 请求过程 浏览器的请求通过 DNS Server 解析到指定的 IP 地址,浏览器通过 IP 地址访问 Web Server 缺点 当到达 Web Server 的性能瓶颈时(瓶颈受到CPU,内存,io,带宽影响),无法进…...
python:sklearn 主成分分析(PCA)
参考书:《统计学习方法》第2版 第16章 主成分分析(PCA)示例 编写 test_pca_1.py 如下 # -*- coding: utf-8 -*- """ 主成分分析(PCA) """ import matplotlib.pyplot as plt from skl…...
力扣-数据结构-二叉树
94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入&#x…...
嵌入式音视频实时通话EasyRTC打造设备安装与调试的高效远程解决方案
一、背景 在数字化浪潮席卷全球的今天,实时音视频通信技术已经成为众多领域不可或缺的重要组成部分。从智能家居到智能安防,从在线教育到远程医疗,人们对于高效、便捷、稳定且低延迟的音视频通信解决方案的需求日益迫切。而EasyRTC作为一款卓…...
AI 的未来是开源?DeepSeek 正在书写新篇章!
AI 的未来是开源?DeepSeek 正在书写新篇章! 随着人工智能(AI)技术的迅猛发展,越来越多的企业和研究机构开始关注 AI 的开放性和透明度。开源不仅能够促进技术创新,还能加速知识的传播和应用。在这个背景下…...
抢先体验全新极小大模型Qwen3:0.6B
全民都在期待DeepSeek-R2的发布,但是一不小心被阿里截胡了,2025 年 4 月 29 日,阿里巴巴发布并开源了通义千问 Qwen3 系列大模型。据 大模型镜像网站 上关于Qwen3的介绍: Qwen3 是 Qwen 系列中最新一代的大型语言模型,提供一整套密集模型和混合专家 (MoE) 模型。Qwen3 基…...
部署一个自己的Spring Ai 服务(deepseek/通义千问)
Spring Boot 无缝接入 DeepSeek 和通义千问请求日志记录及其ip黑白名单 SpringBoot版本 3.2.0 JDK 版本为17 redis 3.2.0 mybatis 3.0.3 依赖引入 关键依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-sp…...
第一讲 | 算法复杂度
算法复杂度 一、数据结构前言1、数据结构(DS)2、算法(Algorithm) 二、算法效率1、复杂度的概念 三、时间复杂度(1)、案例(2)、大O的渐进表示法(3)、时间复杂度…...
【运维】还原 Docker 启动命令的利器:runlike 与 docker-autocompose
🔍 还原 Docker 启动命令的利器:runlike 与 docker-autocompose 实用教程 在日常使用 Docker 时,我们常常通过 docker run 启动容器,但有时候过了一段时间就忘记了当初使用的具体参数(端口、挂载、环境变量等…...
IP属地是实时位置还是自己设置
刷微博、抖音时,评论区总能看到“IP属地”?这个突然冒出来的小标签,让不少网友摸不着头脑:IP属地是实时位置,还是可以自己设置?别急,今天咱们就来聊聊这个话题! 1、什么是IP属地…...
Android WIFI体系
先说说WifiLock、MulticastLock 、IWificond WifiLock 允许应用强制保持 WiFi 活跃,即便设备处于休眠状态。如WIFI_MODE_FULL_HIGH_PERF:保持高性能 WiFi 活跃状态,适用于高带宽需求,如视频通话、流媒体。经测试有的场景能减少10…...
什么是静态住宅ip,跨境电商为什么要用静态住宅ip
在数字时代,IP地址不仅是设备联网的“ID”,更是跨境电商运营中的关键工具。尤其对于需要长期稳定、安全操作的场景,静态住宅IP逐渐成为行业首选。 一、什么是静态住宅IP? 静态住宅IP(Static Residential IP࿰…...
常见位运算总结
目录 常见位运算总结 191:位1的个数 338:比特位计数 461:汉明距离 136:只出现一次的数字 260:只出现一次的数字III 常见位运算总结 191:位1的个数 链接:191. 位1的个数 - 力扣(LeetCode) class Sol…...
[密码学实战]SDF之对称运算类函数(四)
[密码学实战]SDF之对称运算类函数(四) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-1jptduZFNFiRZ2lS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16…...
【C++编程入门】:基本语法
上一篇提到了C关键字和缺省参数以及命名空间域,这篇继续分享C入门语法,把基本语法掌握扎实后面学习更才能更轻松一些。 目录 引用 引用的特性 常引用 内联函数 auto关键字 引用 引用不是新定义一个变量,而是给已存在变量取了一个别名&am…...
区块链最佳框架:Truffle vs Hardhat vs Brownie
区块链技术的快速发展使得智能合约开发成为主流,而选择合适的开发框架是提升效率的关键。目前,Truffle、Hardhat和Brownie是三大主流框架,它们各有特点,适用于不同的开发场景和开发者偏好。本文将从功能、生态系统、适用人群等角度…...
Apache Flink的架构设计与运行流程说明
在大数据领域,实时计算的重要性随着业务需求的爆发式增长愈发凸显。从电商的实时销量监控到金融的高频交易风控,从物联网设备的实时告警到社交平台的热点追踪,企业对“秒级甚至毫秒级”数据处理能力的需求已成为刚需。在众多实时计算框架中&a…...
AI+零售:智能推荐、无人店与供应链管理的未来
AI零售:智能推荐、无人店与供应链管理的未来 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 AI零售:智能推荐、无人店与供应链管理的未来摘要引言一、智能推荐系统:从流量收割到用…...
华为云IoT平台与MicroPython实战:从MQTT协议到物联网设备开发
目录 前言 1. 华为云 1.1. 创建实例 1.2. 创建产品 1.3. 编辑服务模型 1.4. 注册设备 1.4.1. 复制设备连接参数 1.5. 连接参考代码 2. micropython版-物联网 2.1. 环境搭建 2.2. 实现步骤 2.3. 示例代码 结语 前言 物联网(IoT)技术的快速发…...
【Linux】Linux内核模块开发
Linux内核模块开发 零、关于 1、概述 最近在学习Linux相关的东西,学习了U-Boot的编译,Linux的编译,能够在开发板上运行自己编译的U-Boot和Linux了,那么接下来就是在自己编译的Linux上做应用级或者系统级的开发了。本文以字符设…...
linux 下查看指定进程的内存CPU占用情况(用于程序崩溃类的排查)
在程序开发过程中,如果程序较为庞大,逻辑较为复杂时,容易出现运行时崩溃的问题。导致的原因有很多,我这里只对较为通用的内容占用情况作记录,如程序中对文件描述符打开未关闭(导致fd积攒过多超过了系统的标…...
ASP.NET MVC 入门指南五
26. 响应式设计与移动开发 26.1 响应式视图设计 为了使 MVC 应用程序在不同设备上都能提供良好的用户体验,需要采用响应式设计。可以使用 CSS 框架如 Bootstrap 来实现响应式布局。 引入 Bootstrap:在项目中引入 Bootstrap 的 CSS 和 JavaScript 文件。…...
字节跳动社招面经 —— BSP驱动工程师(4)
接前一篇文章:字节跳动社招面经 —— BSP驱动工程师(3) 本文内容参考: 嵌入式硬件平台修改启动地址-CSDN博客 特此致谢! 上一回开始针对于“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工程师中的面试题…...
Spring MVC中自定义日期类型格式转换器
在Spring MVC中,自定义日期类型格式转换器可以通过实现Converter接口或使用DateTimeFormat注解。以下是两种方法的详细说明: 方法一:全局自定义转换器(推荐) 1. 创建日期转换器类 实现 org.springframework.core.con…...
【3D 地图】无人机测绘制作 3D 地图流程 ( 无人机采集数据 | 地图原始数据处理原理 | 数据处理软件 | 无人机测绘完整解决方案 )
文章目录 一、无人机采集数据1、多角度影像数据2、定位与姿态数据 二、无人机采集数据处理原理1、空三解算2、密集点云生成与三维重建3、地形与正射影像生成4、三维模型优化与瓦片化 三、无人机影像处理软件介绍 一、无人机采集数据 无人机原始数据采集 : 多角度影像数据 : 多…...
arduino Nano介绍
【仅供学习,具体参数参考官网或销售商】 Arduino Nano 是一款基于 ATmega328P 微控制器(或 ATmega168 旧版)的紧凑型开发板,专为嵌入式项目和原型设计而设计。 以下是Arduino Nano V3.0 328P详细介绍: 主要特性 微…...
解决 Flutter 在 iOS 真机上构建失败的问题
在开发 Flutter 应用时,有时会在尝试将应用部署到 iOS 真机时遇到构建失败的问题。错误信息通常类似于以下内容: Could not build the precompiled application for the device. Uncategorized (Xcode): Timed out waiting for all destinations matchi…...
【办公类-89-03】20250429AI写的研讨记录,清除格式,统一格式,名字替换。部分加粗,添加页眉
背景需求: 检查自即,需要AI一下院内的五次科研培训记录。 本次用了豆包 豆包写的不错,也是“水字数”的高手 把每次培训内容贴到WORD里 把AI资料贴到WORD里,发现问题: 1、字体、段落什么都是不统一的,需要统一改成宋体小四,1.5倍行距 2、十个研讨人也要改成真人。就找…...
react-native 安卓APK打包流程
一、使用keytool命令生成一个签名密钥 $ keytool -genkeypair -v -storetype PKCS12 -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000 在 Windows 上keytool命令放在 JDK 的 bin 目录中(比如C:\Program Files\…...
Android Studio中OpenCV应用详解:图像处理、颜色对比与OCR识别
文章目录 一、OpenCV在Android中的集成与配置1.1 OpenCV简介1.2 在Android Studio中集成OpenCV1.2.1 通过Gradle依赖集成1.2.2 通过模块方式集成1.2.3 初始化OpenCV 1.3 OpenCV基础类介绍 二、指定区域图像抓取与对比2.1 图像抓取基础2.2 指定区域图像抓取实现2.2.1 从Bitmap中…...