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

微信小程序中缓存数据全方位解惑

微信小程序中缓存数据全方位解惑

微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍:

1. 数据缓存的类型

微信小程序提供了两种数据缓存方式:

  • 本地存储(Local Storage):数据存储在本地,即使小程序关闭后数据依然保留,直到手动清除。
  • 内存存储(Memory Storage):数据存储在小程序的运行内存中,小程序关闭后数据丢失。

2. 数据缓存的API

微信小程序提供了以下API用于数据缓存操作:

2.1 设置缓存

前情:缓存方法后面跟上Sync的就是同步方法,反之就是异步方法

  • 异步设置缓存wx.setStorage

    wx.setStorage({// 设置缓存的名字  key: 'userInfo',// 设置缓存的值  data: { name: '张三', age: 28 },// 设置缓存成功时候调用的方法success: function(res) {console.log('设置成功:', res);},// 设置缓存失败时候调用的方法fail: function(err) {console.error('设置失败:', err);}
    });
    
  • 同步设置缓存wx.setStorageSync

    // 由于是同步的方法,所以用try{}catch(){}格式
    try {// 注意:同步设置缓存与上面的异步方法的参数有所不同// 参数1:存储数据的键名// 参数2:存储的数据wx.setStorageSync('userInfo', { name: '张三', age: 28 }); // 尝试同步设置本地缓存console.log('设置成功'); // 如果设置成功,打印“设置成功”到控制台
    } catch (err) {console.error('设置失败:', err); // 如果设置失败,捕获错误并打印“设置失败:”以及错误信息
    }
    

2.2 获取缓存

  • 异步获取缓存wx.getStorage

    wx.getStorage({key: 'userInfo', // 指定要获取的缓存键(key),这里是 'userInfo'success(res) {   // 成功回调函数,当获取缓存成功时执行console.log('获取成功:', res.data); // 打印获取到的缓存数据,res.data 是缓存的值},fail(err) {      // 失败回调函数,当获取缓存失败时执行console.error('获取失败:', err);   // 打印错误信息,err 是错误对象}
    });
    
  • 同步获取缓存wx.getStorageSync

    try {const userInfo = wx.getStorageSync('userInfo'); // 同步获取本地缓存中键为 'userInfo' 的数据console.log('获取成功:', userInfo);           // 如果获取成功,将获取到的数据打印到控制台
    } catch (err) {console.error('获取失败:', err);             // 如果获取失败,捕获错误并打印错误信息
    }
    

2.3 清除缓存

  • 清除单个缓存wx.removeStorage

    wx.removeStorage({key: 'userInfo', // 指定要删除的缓存键(key),这里是 'userInfo'success(res) {   // 成功回调函数,当删除操作成功时执行console.log('清除成功:', res); // 打印成功信息,res 是返回的结果对象},fail(err) {      // 失败回调函数,当删除操作失败时执行console.error('清除失败:', err); // 打印错误信息,err 是错误对象}
    });
    
  • 同步清除单个缓存wx.removeStorageSync

    try {wx.removeStorageSync('userInfo'); // 同步删除本地缓存中键为 'userInfo' 的数据console.log('清除成功');         // 如果删除成功,打印成功信息
    } catch (err) {console.error('清除失败:', err); // 如果删除失败,捕获错误并打印错误信息
    }
    
  • 清除所有缓存wx.clearStorage

    wx.clearStorage({success(res) { // 成功回调函数,当所有缓存数据被成功清除时执行console.log('所有缓存清除成功:', res); // 打印成功信息,res 是返回的结果对象},fail(err) { // 失败回调函数,当清除操作失败时执行console.error('清除失败:', err); // 打印错误信息,err 是错误对象}
    });
    

3. 缓存策略

3.1 高频更新数据的缓存策略

对于高频更新的数据(如新闻列表),可以采用以下策略:

  1. 初始加载时从服务器获取最新数据并缓存到本地。
  2. 设置缓存过期时间(如1小时),在过期内直接从本地读取。
  3. 缓存过期后自动发起网络请求更新缓存。

示例代码:

// 缓存新闻列表并设置过期时间
wx.setStorageSync('news_list', newsList, 3600 * 1000); // 缓存1小时

3.2 大文件缓存策略

对于大文件(如图片或视频),可以缓存文件的URL而不是文件本身:

  1. 首次加载时,将文件URL保存到本地存储。
  2. 需要显示文件时,检查本地存储是否有URL,若有则直接加载,否则从服务器下载并保存URL。

示例代码:

// 缓存大文件URL
let fileUrl = 'http://example.com/largefile.jpg';
wx.setStorageSync('largefile_url', fileUrl);

4. 注意事项

  1. 存储空间限制:微信小程序的本地存储空间有限(单个key最大1MB),需合理规划。
  2. 数据安全性:敏感数据需加密存储。
  3. 缓存清理:定期清理无用缓存,避免占用过多存储空间。

5. 如何选择

在微信小程序开发中,选择使用同步缓存还是异步缓存取决于具体的应用场景和需求。同步方法(如 wx.setStorageSyncwx.getStorageSync)和异步方法(如 wx.setStoragewx.getStorage)各有优缺点,适用于不同的场景。以下是详细的分析和建议:


5.1 同步缓存方法

特点:
  1. 阻塞当前线程:同步方法会阻塞当前线程,直到操作完成。
  2. 直接返回结果:操作完成后直接返回结果,不需要回调函数。
  3. 代码简洁:适合简单的操作,代码更直观。
适用场景:
  1. 数据量小且操作简单
    • 如果需要存储或读取的数据量较小(例如单个对象或字符串),同步方法可以快速完成操作,不会对用户体验产生明显影响。
    • 示例:存储用户的基本信息(如用户名、头像URL)。
  2. 初始化操作
    • 在页面加载时(如 onLoadonShow 生命周期方法中)加载或设置必要的数据。
    • 示例:加载用户配置或初始化任务列表。
  3. 对性能要求不高
    • 如果操作不会频繁触发,且对性能要求不高,同步方法可以简化代码逻辑。
    • 示例:保存用户设置(如主题颜色、字体大小)。
示例代码:
// 同步保存数据
try {wx.setStorageSync('userInfo', { name: '张三', age: 28 });
} catch (err) {console.error('保存失败:', err);
}// 同步读取数据
try {const userInfo = wx.getStorageSync('userInfo');console.log('读取成功:', userInfo);
} catch (err) {console.error('读取失败:', err);
}

5.2 异步缓存方法

特点:
  1. 非阻塞:异步方法不会阻塞当前线程,操作完成后通过回调函数返回结果。
  2. 适合复杂操作:适合数据量较大或操作频繁的场景。
  3. 用户体验更好:避免因同步操作导致的页面卡顿或白屏。
适用场景:
  1. 数据量大
    • 如果需要存储或读取的数据量较大(例如长列表、大文件路径等),异步方法可以避免阻塞主线程。
    • 示例:保存或加载任务列表、文章内容等。
  2. 操作频繁
    • 如果数据存储或读取操作频繁(例如实时更新数据、频繁读取配置),异步方法可以避免主线程卡顿。
    • 示例:实时更新用户消息列表、频繁读取用户偏好设置。
  3. 需要反馈用户操作
    • 如果需要在操作完成后给用户明确的反馈(如提示框、加载动画),异步方法可以通过回调函数实现。
    • 示例:保存任务后提示用户“保存成功”或“保存失败”。
  4. 与其他异步操作结合
    • 如果需要与其他异步操作(如网络请求、文件操作)结合,异步方法可以更好地管理操作流程。
    • 示例:从服务器获取数据后保存到本地缓存。
示例代码:
// 异步保存数据
wx.setStorage({key: 'userInfo',data: { name: '张三', age: 28 },success() {console.log('保存成功');},fail(err) {console.error('保存失败:', err);}
});// 异步读取数据
wx.getStorage({key: 'userInfo',success(res) {console.log('读取成功:', res.data);},fail(err) {console.error('读取失败:', err);}
});

5.3 总结

使用同步缓存的场景:
  1. 数据量小且操作简单。
  2. 初始化操作(如页面加载时加载数据)。
  3. 对性能要求不高,且代码逻辑需要简洁。
使用异步缓存的场景:
  1. 数据量大或操作复杂。
  2. 操作频繁,需要避免主线程卡顿。
  3. 需要在操作完成后给用户反馈。
  4. 需要与其他异步操作结合。

5.4 最佳实践

  1. 小数据量优先使用同步方法:如果数据量小且操作简单,同步方法可以简化代码逻辑。
  2. 大数据量或频繁操作使用异步方法:如果数据量大或操作频繁,异步方法可以提升用户体验。
  3. 结合实际需求:根据具体需求选择合适的方法,必要时可以混合使用同步和异步方法。

希望这些分析和建议能帮助你更好地选择合适的缓存方法!

6. 实战示例

以下是一个完整的示例,展示如何在两个页面之间通过缓存传递数据:

完整示例1(存入数据)

<view><!-- 每当用户输入内容时,getInput 方法会被触发。 --><input placeholder="输入信息" bind:input="getInput" /><button bind:tap="saveInput">存入</button>
</view>
Page({data: {storage: '' // 定义页面数据,初始值为空字符串,用于存储用户输入的内容},getInput(e) { // 获取输入框的值,e就是表单中输入的值this.setData({ storage: e.detail.value }); // 使用 setData 更新页面数据,将输入框的值赋给 storage},saveInput() { // 保存输入的内容到本地缓存wx.setStorageSync('storage', this.data.storage); // 同步将页面数据 storage 保存到本地缓存,键为 'storage'}
});

完整示例2(读取数据)

<view>从存储中得到的数据:{{storage}}</view>
Page({data: {storage: '' // 定义页面数据,初始值为空字符串,用于存储从本地缓存获取的内容},onLoad() { // 页面加载时触发的生命周期方法wx.getStorage({ // 调用异步方法获取本地缓存中的数据key: 'storage', // 指定要获取的缓存键success: (res) => { // 成功回调函数this.setData({ storage: res.data }); // 使用 setData 更新页面数据,将获取到的缓存数据赋值给 storage}});}
});

通过以上内容,您可以更好地理解和应用微信小程序中的数据缓存功能,从而提升小程序的性能和用户体验。

7. 实战案例-任务列表

7.1 功能需求

  1. 添加任务:用户可以输入任务内容并添加到任务列表。
  2. 查看任务列表:用户可以查看所有未完成的任务。
  3. 完成任务:用户可以标记任务为已完成。
  4. 删除任务:用户可以删除不再需要的任务。

7.2 页面结构和逻辑

我们将使用两个文件:

  1. index.wxml:页面的结构文件。
  2. index.js:页面的逻辑文件。
1. 页面结构文件(index.wxml
<view class="container"><!-- 页面的最外层容器 --><view class="header"><!-- 页面头部,包含输入框和添加按钮 --><input type="text" placeholder="请输入任务" bind:input="getInput" /><!-- 输入框,用户可以在这里输入任务内容 --><!-- bind:input="getInput":绑定输入事件,当用户输入时触发页面的 getInput 方法 --><button bind:tap="addTask">添加任务</button><!-- 添加按钮,用户点击后触发页面的 addTask 方法,将输入的任务添加到任务列表 --></view><view class="task-list"><!-- 任务列表的容器 --><block wx:for="{{tasks}}" wx:key="id"><!-- 使用 wx:for 循环渲染任务列表 --><!-- tasks:页面数据中的任务数组 --><!-- wx:key="id":指定循环的唯一键值,提升渲染性能 --><view class="task-item" bind:tap="toggleTask" data-id="{{item.id}}"><!-- 每个任务项 --><!-- bind:tap="toggleTask":点击任务项时触发页面的 toggleTask 方法 --><!-- data-id="{{item.id}}":为任务项绑定一个自定义属性,存储任务的唯一 ID --><text class="{{item.completed ? 'completed' : ''}}">{{item.content}}</text><!-- 显示任务内容 --><!-- class="{{item.completed ? 'completed' : ''}}":根据任务的完成状态动态添加样式 --><!-- 如果任务已完成(item.completed 为 true),添加 'completed' 样式 --><button bind:tap="deleteTask" data-id="{{item.id}}">删除</button><!-- 删除按钮,点击后触发页面的 deleteTask 方法 --><!-- data-id="{{item.id}}":为删除按钮绑定任务的唯一 ID --></view></block></view>
</view>
2. 页面逻辑文件(index.js
Page({data: {tasks: [], // 任务列表newTask: '' // 当前输入的任务内容},// 在页面加载时调用 loadTasks 方法,从本地缓存加载任务列表onLoad() {this.loadTasks(); // 页面加载时加载任务},// 当用户输入时触发的方法,再用this.setData把输入框中的值,赋值到data区中的newTaskgetInput(e) {this.setData({ newTask: e.detail.value }); // 获取输入框的内容},// 添加任务的方法addTask() {// 解构赋值,等同于 const newTask = this.data.newTaskconst { newTask } = this.data;// trim() 方法会移除字符串两端的空格(包括空格、制表符、换行符等)if (newTask.trim() === '') {// 调用微信小程序的 wx.showToast 方法,显示一个提示框。// icon: 'none':指定提示框的图标类型为无图标(none)wx.showToast({ title: '任务不能为空', icon: 'none' });// return终止当前函数的执行return;}// 将一个新的任务对象添加到任务列表中// Array.prototype.concat() 方法是用来合并数组的,它会返回一个新的数组,而不会修改原始数组const newTasks = this.data.tasks.concat({id: Date.now(), // 使用时间戳生成唯一 IDcontent: newTask,completed: false // 默认未完成});this.setData({ tasks: newTasks, newTask: '' }); // 更新任务列表并清空输入框// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新(添加过的)过的任务数组this.saveTasks(newTasks); // 保存任务到本地缓存},// 当用户点击任务项时,会触发 toggleTask 方法// 该方法会找到对应的任务并切换其完成状态,然后更新页面数据并保存到本地缓存toggleTask(e) {// 参数e为设置的自定义属性 data-id="{{item.id}}"const taskId = e.currentTarget.dataset.id; // a.获取任务的唯一 ID// b.map方法遍历任务列表const tasks = this.data.tasks.map(task => {// c.通过id找到被点击的任务if (task.id === taskId) { task.completed = !task.completed; // d.切换任务的完成状态}return task; // 返回任务对象});this.setData({ tasks }); // e.更新页面数据// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新过(切换状态)的任务数组this.saveTasks(tasks); // f.保存任务到本地缓存},// 删除任务的方法deleteTask(e) {// 参数e为设置的自定义属性 data-id="{{item.id}}"const taskId = e.currentTarget.dataset.id; // a.获取任务的唯一 ID// 用filter方法,通过传过来的id将点击删除的任务项过滤掉,生成一个新的数组tasksconst tasks = this.data.tasks.filter(task => task.id !== taskId); // b.过滤掉被删除的任务this.setData({ tasks }); // c.更新页面数据// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新过(删除过的)的任务数组this.saveTasks(tasks); // d.保存任务到本地缓存},// 方法 saveTasks,用于将任务列表保存到本地缓存// 在上面的几个更改任务列表(tasks)的几个方法中调用saveTasks(tasks) {try {wx.setStorageSync('tasks', tasks); // 将任务保存到本地缓存} catch (err) {console.error('保存任务失败:', err);}},// loadTasks作用:从微信小程序的本地缓存中加载任务列表,并将其设置为页面数据loadTasks() {try {const tasks = wx.getStorageSync('tasks') || []; // 从本地缓存加载任务列表this.setData({ tasks }); // 更新页面数据} catch (err) {console.error('加载任务失败:', err); // 捕获并打印错误信息}}
});

7.3 功能说明

  1. 添加任务
    • 用户在输入框中输入任务内容,点击“添加任务”按钮。
    • 新任务会被添加到任务列表中,并保存到本地缓存。
  2. 查看任务列表
    • 任务列表通过 wx:for 循环渲染,显示所有未完成的任务。
    • 如果任务已完成,任务内容会显示为划线样式(通过 class="completed" 实现)。
  3. 完成任务
    • 点击任务项时,任务的完成状态会切换(未完成变为已完成,已完成变为未完成)。
    • 更新后的任务列表会保存到本地缓存。
  4. 删除任务
    • 点击任务项中的“删除”按钮,任务会被从列表中移除。
    • 更新后的任务列表会保存到本地缓存。

7.4 本地缓存的使用

  • 保存任务:使用 wx.setStorageSync 将任务列表保存到本地缓存。
  • 加载任务:页面加载时,通过 wx.getStorageSync 从本地缓存中加载任务列表。

7.5 样式文件(可选)

你可以在 index.wxss 文件中添加样式,使页面更美观:

.container {padding: 20px;
}
.header {display: flex;margin-bottom: 20px;
}
.header input {flex: 1;margin-right: 10px;
}
.task-item {display: flex;justify-content: space-between;padding: 10px 0;border-bottom: 1px solid #ccc;
}
.task-item text {flex: 1;
}
.completed {text-decoration: line-through;color: #ccc;
}

7.6 总结

这个案例展示了如何使用微信小程序的本地缓存功能来实现一个简单的代办任务应用。通过 wx.setStorageSyncwx.getStorageSync 方法,任务数据可以持久化存储,并在页面加载时恢复。

相关文章:

微信小程序中缓存数据全方位解惑

微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段&#xff0c;跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍&#xff1a; 1. 数据缓存的类型 微信小程序提供了两种数据缓…...

物联网平台-分布式的设备接入与管理系统

乐吾乐物联网平台是由乐吾乐自主研发的一款分布式的设备接入与管理系统&#xff0c;专为满足不断增长的设备接入和数据处理需求而设计。平台集数据采集、分析、监控、告警和通知等功能于一体&#xff0c;并融合了乐吾乐大屏可视化和乐吾乐3D数字孪生技术&#xff0c;帮助用户快…...

ABP - 事件总线之分布式事件总线

ABP - 事件总线之分布式事件总线 1. 分布式事件总线的集成1.2 基于 RabbitMQ 的分布式事件总线 2. 分布式事件总线的使用2.1 发布2.2 订阅2.3 事务和异常处理 3. 自己扩展的分布式事件总线实现 事件总线可以实现代码逻辑的解耦&#xff0c;使代码模块之间功能职责更清晰。而分布…...

ComfyUI流程图生图原理详解

一、引言 ComfyUI 是一款功能强大的工具&#xff0c;在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题&#xff0c;并深入剖析图生图过程及相关参数&#xff0c;帮助读者快速入门并深入理解其原理。 二、ComfyUI 的安装与配置中遇到的问题 &a…...

洛谷 P3660 USACO17FEB Why Did the Cow Cross the Road III 题解

题意 有一个圆&#xff0c;圆周上按顺时针方向给出 2 n 2n 2n个点。第 i i i个点的颜色是 c o l o r i color_i colori​&#xff0c;其中数据保证 1 ≤ c o l o r i ≤ n 1\le color_i\le n 1≤colori​≤n&#xff0c;而且每种不同的颜色有且只有两个点。不存在位置重叠的点…...

kubekey一键部署k8s高可用与kubesphere

kubekey一键安装k8s与kubesphere还是蛮方便的&#xff0c;kubesphere官网上面也提到了高可用安装的一些事宜&#xff0c;但是没有涉及到kubesphere资深的redis的系统的部署问题&#xff0c;本文简单给出对应配置&#xff0c;其实这个配置在kubephere的cluster-configuration.ya…...

SwiftUI 5.0 中宝藏视图修改器 containerRelativeFrame 趣谈(下)

概览 小伙伴们都知道,为了将 SwiftUI 中多如牛毛的视图井然有序、有条不紊的组织起来,我们必须借助容器(Container)伏虎降龙般地威力。而如何最大限度的让容器中的子视图能根据容器尺寸安排自己的空间,则需要一些技术手段来洞幽察微。 在过去,我们往往使用 GeometryRead…...

ElasticSearch基础和使用

ElasticSearch基础 1 初识ES相关组件 &#xff08;1&#xff09;Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。Elasticsearch结合kibana、Logstash、Beats组件 也就是elastic stack&#xff08;ELK&#xff09; 广泛应…...

我用 Cursor 开发了一款个人小记系统

https://note.iiter.cn 项目背景 在日常工作和学习中,我们经常需要快速记录一些想法、收藏一些有用的链接或者保存一些重要的文本、图片内容。虽然市面上已经有很多笔记软件,但我想要一个更轻量、更简单的工具,专注于快速记录和智能检索。于是我开发了这款个人小记系统。 系统…...

如何使用Three.js制作3D月球与星空效果

目录 1. 基本设置2. 创建星空效果3. 创建月球模型4. 添加中文3D文字5. 光照与相机配置6. 动画与控制7. 响应式布局8. 结语 在本文中&#xff0c;我们将一起学习如何利用Three.js实现一个3D月球与星空的效果&#xff0c;并添加一些有趣的元素&#xff0c;比如中文3D文字和互动功…...

DeepSeek接入网络安全领域,AI高效驱动,重新定义网络防御边界!

DeepSeek新一代模型的发布&#xff0c;标志着AI大模型的应用将逐步走向普及&#xff0c;并加速AI技术在各行业的赋能与全面落地。在科技日新月异的今天&#xff0c;AI技术凭借其强大的数据处理与分析能力&#xff0c;已成为推动社会进步的核心动力。 在网络安全领域&#xff0…...

【动态规划】斐波那契数列模型

目录 ​动态规划 动态规划的基本步骤 1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 算法分析 算法代码 算法代码 面试题 08.01. 三步问题 - 力扣&#xff08;LeetCode&#xff09; 算法分析 算法代码 优化 746. 使用最小花费爬楼梯 - 力扣&#x…...

Spring中的IOC详解

文章目录 IOC IOC容器的工作原理Bean的生命周期Bean的自动装配 AutowiredResourceInject 使用Spring底层组件 IOC Spring的核心之一是IOC&#xff0c;IOC全称为Inversion of Control&#xff0c;中文译为控制反转&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可…...

深挖vue3基本原理之七 —— 功能模块的深度技术解析

Vue 3 四个核心功能模块的深度技术解析 一、Effect 调度系统&#xff1a;同步/异步任务队列 实现原理 // runtime-core/src/scheduler.ts const queue: (EffectJob | null)[] [] let isFlushing false const resolvedPromise Promise.resolve()function queueJob(job: Ef…...

数据结构 day 07

数据结构 day07 7. 树7.3. 层次遍历代码实现 8. 查询算法8.1. 顺序查找 seqSearch代码实现 8.2. 二分法查找 binarySearch代码实现 8.2. 分块查找 blockSearch代码实现 8.3. 哈希表 hash 9. 排序算法9.1. 冒泡排序 bubSort代码实现 9.2. 选择排序 selSort代码实现 9.3. 插入排序…...

《代码随想录》刷题笔记——回溯篇【java实现】

文章目录 组合组合总和 III电话号码的字母组合组合总和组合总和II思路代码实现 分割回文串※思路字符串分割回文串判断效率优化※ 复原 IP 地址优化版本 子集子集 II使用usedArr辅助去重不使用usedArr辅助去重 递增子序列※全排列全排列 II重新安排行程题意代码 N 皇后解数独直…...

React:初识React

React是什么&#xff1f; React是由Meta公司研发&#xff0c;也就是Facebook的公司&#xff08;马克扎克伯格这个见人&#xff09;研发的构建Web和原生交互界面的库 不仅可以写网页&#xff0c;还可以写苹果和安卓上面的app React的优势&#xff1a; React也是前端里最流行的…...

全面理解-c++中的内存布局

在 C 中&#xff0c;程序的内存布局指的是程序运行时&#xff0c;代码和数据在内存中的组织和分布方式。一般来说&#xff0c;C 程序的内存可以划分为以下几个主要区域&#xff1a; 1. 代码段&#xff08;Text Segment&#xff0c;也称为 .text 段&#xff09; 存储内容&…...

百度沈抖:传统云计算不再是主角,智能计算呼唤新一代“操作系统”

Create 2024 百度AI开发者大会 4月16日&#xff0c;Create 2024 百度AI开发者大会在深圳召开。期间&#xff0c;百度集团执行副总裁、百度智能云事业群总裁沈抖正式发布新一代智能计算操作系统——万源&#xff0c;通过对AI原生时代的智能计算平台进行抽象与封装设计&#xff…...

【银河麒麟高级服务器操作系统】服务器卡死后恢复系统日志丢失-分析及处理全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://document.kylinos.cn 服务器环境以及配置 【机型】 处理器&#xff…...

VSCode Error Lens插件介绍(代码静态检查与提示工具)(vscode插件)

文章目录 VSCode Error Lens 插件介绍**功能概述****开发背景****使用方法****适用场景** VSCode Error Lens 插件介绍 功能概述 Error Lens 是一款增强 VS Code 错误提示的扩展工具&#xff0c;通过 内联显示错误和警告信息&#xff0c;直接定位代码问题&#xff0c;提升开发…...

ffmpeg configure 研究1-命令行参数的分析

author: hjjdebug date: 2025年 02月 14日 星期五 17:16:12 CST description: ffmpeg configure 研究1 ./configure 命令行参数的分析 文章目录 1 configure 对命令行参数的分析,在4019行1.1 函数名称: is_in1.2. 函数名称: enable1.3. 函数名称: set_all 2 执行退出判断的关键…...

如何调整 Nginx工作进程数以提升性能

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年2月15日14点20分 Nginx 的工作进程数&#xff0…...

分布式 NewSQL 数据库(TiDB)

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议&#xff0c;具有数据强一致的高可用特性&#xff0c;是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB是 PingCAP公司自主设计、研发的开源分布式关系型数据…...

try learning-git-branching

文章目录 mergerebase分离 HEAD相对引用利用父节点branch -f 撤销变更cherry-pick交互式 rebase只取一个提交记录提交的技巧rebase 在上一次提交上amendcherry-pick 在上一次提交上 amend tag多分支 rebase两个parent节点纠缠不清的分支偏离的提交历史锁定的Main推送主分支合并…...

【kafka系列】Kafka事务的实现原理

目录 1. 事务核心组件 1.1 幂等性生产者&#xff08;Idempotent Producer&#xff09; 1.2 事务协调器&#xff08;TransactionCoordinator&#xff09; 1.3 事务日志&#xff08;Transaction Log&#xff09; 2. 事务执行流程 2.1 事务初始化 2.2 发送消息 2.3 事务提…...

数据结构6

一、哈希散列--通讯录查找 #include "hash.h" #include <stdio.h> #include <stdlib.h> #include <string.h>//int *a[10];int hash_function(char key) {if (key > a && key < z){return key - a;}else if (key > A && …...

Flutter 的 Widget Key 提议大调整?深入聊一聊 Key 的作用

Flutter 的 Widget Key 提议大调整&#xff1f;深入聊一聊 Key 的作用 在 Flutter 里&#xff0c;Key 对象存在的目的主要是区分和维持 Widget 的状态&#xff0c;它是控件在渲染树里的「复用」标识之一&#xff0c;这一点在之前的《深入 Flutter 和 Compose 在 UI 渲染刷新时…...

src和href区别

src和href区别 (1)请求资源类型不同(2)作用结果不同(3)解析方式不同 (1)请求资源类型不同 href 用来建立文档和元素之间的链接(是引用),常用的有a、linksrc 在请求src资源时候会将指向的资源下载并且应用到文档中(引入),常用的有script、iframe、image。 (2)作用结果不同 hr…...

STM32之SG90舵机控制

目录 前言&#xff1a; 一、硬件准备与接线 1.1 硬件清单 1.2 接线 二、 SG90舵机简介 1.1 外观 1.2 基本参数 1.3 引脚说明 1.4 控制原理 1.5 特点 1.6 常见问题 三、 单片机简介 四、 程序设计 4.1 定时器配置 4.2 角度控制函数 4.3 主函数调用 五、 总结 …...

尚硅谷课程【笔记】——大数据之Hadoop【一】

课程视频链接&#xff1a;尚硅谷Hadoop3.x教程 一、大数据概论 1&#xff09;大数据概念 大数据&#xff08;Big Data&#xff09;&#xff1a;指无法再一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发…...

QEMU 搭建 Ubuntu x86 虚拟机

1. 安装 QEMU 在 Ubuntu 系统中&#xff0c;可以通过以下命令安装 QEMU&#xff1a; sudo apt-get update sudo apt-get install qemu-system-x86_64 qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager2. 创建虚拟硬盘镜像 qemu-img create -f raw ubuntu…...

mac 意外退出移动硬盘后再次插入移动硬盘不显示怎么办

第一步&#xff1a;sudo ps aux | grep fsck 打开mac控制台输入如下指令&#xff0c;我们看到会出现两个进程&#xff0c;看进程是root的这个 sudo ps aux|grep fsck 第二步&#xff1a;杀死进程 在第一步基础上我们知道不显示u盘的进程是&#xff1a;62319&#xff0c;我们…...

Acwing-基础算法课笔记之基础算法(双指针)

Acwing-基础算法课笔记之基础算法&#xff08;双指针&#xff09; 一、双指针算法概念二、关于双指针的一个问题三、模板 一、双指针算法概念 双指针&#xff08;又称尺取法&#xff09;是一个常用的优化技巧&#xff0c;用来解决序列的区间问题。 两个指针i&#xff0c;j&am…...

PCIE基础学习

PCIE PIO模式&#xff1a; 一个CPU传输一个32bit给PCIE&#xff08;IP&#xff09;。CPU直接与PCIE做数据传输。 DMA模式&#xff1a; CPU通过PCIE bridge 与多个PCIE设备连接&#xff0c;CPU发送命令给桥&#xff0c;桥控制PCIE与memory直接数据连接。 tlp报文 读报文 …...

架构——Nginx功能、职责、原理、配置示例、应用场景

以下是关于 Nginx 的功能、职责、原理、配置示例、应用场景及其高性能原因的详细说明&#xff1a; 一、Nginx 的核心功能 1. 静态资源服务 功能&#xff1a;直接返回静态文件&#xff08;如 HTML、CSS、JS、图片、视频等&#xff09;。配置示例&#xff1a;server {listen 80…...

【教程】比亚迪车机接入AI大模型语音助手

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 更新说明&#xff1a; v1.1.0.2 1、新增长按音量键触发&#xff0c;不再需要迪加 (需设置modelisten)。 2、新增kimi、豆包、ChatGPT等多个GPT接口。 3…...

ios中常见的设计原则和设计模式

七大设计原则 1&#xff1a;开闭原则 对扩展开放&#xff0c;对修改关闭&#xff0c;在设计模块的时候&#xff0c;使模块在不被修改的前提下可以扩展功能 2:依赖倒置原则 实现尽量依赖抽象&#xff0c;不依赖具体实现 &#xff08;1&#xff09;高层模块不应该依赖底层模…...

WSL Ubuntu 安装 CUDA 教程

WSL Ubuntu 安装 CUDA 教程 1. 概述2. 准备工作3. 删除旧的 GPG 密钥4. 安装 CUDA Toolkit4.1 使用 WSL-Ubuntu 包安装&#xff08;推荐&#xff09; 5. 设置环境变量6. 注意事项7. 参考链接8. 总结 1. 概述 随着 WSL 2 的推出&#xff0c;Windows 用户现在可以在 Windows 子系…...

案例-02.部门管理-查询

一.查询部门-需求 二.查询部门-思路 API接口文档 三.代码实现 1.controller层&#xff1a;负责与前端进行交互&#xff0c;接收前端所发来的请求 注&#xff1a;Slf4j用于记录日志使用&#xff0c;可以省略private static Logger log LoggerFactory.getLogger(DeptControlle…...

【ARM】解决ArmDS Fast Models 中部分内核无法上电的问题

1、 文档目标 解决ArmDS Fast Models 中部分内核无法上电的问题。 2、 问题场景 在调用ArmDS的Fast Models中的Cortex-A55的模型&#xff0c;只有Core 0是上电状态&#xff0c;而Core 1处于掉电状态&#xff0c;如图2-1所示&#xff1a; 图2-1 3、软硬件环境 1&#xff09;…...

docker 基础命令使用(ubuntu)

docker 状态查询 docker ps docker ps -adocker --version docker info docker --help docker run --help docker ps --help ...docker 操作镜像命令 docker imagesdocker rmi 镜像id/镜像名docker 操作容器命令 docker ps docker ps -adocker run 命令 # 端口映射 -p 参数…...

WEB安全--SQL注入--二次注入

一、原理&#xff1a; 二次注入的关键在于攻击者的输入并不立即执行&#xff0c;而是经过某些存储或处理后&#xff0c;在后续某个步骤中再触发注入攻击 二、示例&#xff1a; 2.1、sqli-labs-master/less-24&#xff1a; admin# 第一次在网页注册账号和密码时没有漏洞&#x…...

c++中什么时候应该使用final关键字?

在C中&#xff0c;final关键字是自C11标准引入的重要特性&#xff0c;主要用于类继承和虚函数重写机制的约束。下面从技术原理、使用场景和最佳实践三个维度进行系统分析&#xff0c;并给出工业级代码示例。 目录 一、技术原理深度解析 二、关键使用场景分析 1. 类级别的fi…...

DeepSeek学术秘籍:如何让DeepSeek辅助论证?

随着人工智能技术的飞速发展&#xff0c;AIGC技术在学术领域的应用逐渐引起了广泛关注。其中最近大火的DeepSeek作为一款基于大语言模型的应用&#xff0c;其出现标志着学术论文写作中研究方法的一次重大变革。 辅助论证 在学术论文写作中&#xff0c;借助DeepSeek优化辅助论证…...

Atlassian工具集:Jira与Confluence集成优势、使用技巧、更新功能等

本文由Atlassian全球白金合作伙伴-龙智翻译整理&#xff0c;深入探讨了Jira和Confluence最受欢迎的集成功能与技巧&#xff0c;期待为您新一年的团队协作开个好头。 此前&#xff0c;来自K15t 的Customer Advocate Matt Reiner 和Atlassian副产品经理David Olive在一场学习会议…...

传输层协议TCP ( 下 )

文章目录 前言序号与确认序号超时重传RTOJacobson算法内核中超时时间的计算 滑动窗口滑动窗口延迟应答流量控制 拥塞控制慢启动拥塞避免快重传快速恢复 保活机制参考资料 前言 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网最重要…...

【Deepseek 零门槛指南】DeepSeek 教程和常见问题解答 | 大白技术控

粉丝朋友们大家好&#xff0c;我是极客学长。最近一直在玩 DeepSeek&#xff0c;积累了一点经验&#xff0c;用它提高写作的效率挺好用的。 在使用DeepSeek的过程中&#xff0c;也遇到了如下几个问题(相信很多小伙伴也遇到了)&#xff1a; DeepSeek 官网卡顿&#xff0c;突然出…...

ELK组成及实现原理

ELK是由三个主要组件组成的日志处理和搜索平台&#xff0c;分别是&#xff1a; Elasticsearch&#xff1a;Elasticsearch 是一个基于Lucene构建的开源搜索引擎&#xff0c;提供强大的搜索、分析功能。它负责存储和索引所有数据&#xff0c;并提供实时搜索能力。数据可以通过HTT…...

迅为RK3568开发板篇OpenHarmony实操HDF驱动配置LED-LED测试

将编译好的镜像全部进行烧写&#xff0c;镜像在源码根目录 out/rk3568/packages/phone/images/目录下。 烧写完成之后&#xff0c;在调试串口查看打印日志&#xff0c;如下图所示&#xff1a; 然后打开 hdc 工具&#xff0c;运行测试程序&#xff0c;输入“led_test 1”&…...