HarmonyOS Next关键资产存储开发:性能优化与注意事项

news/2024/11/13 4:08:49/文章来源:https://www.cnblogs.com/samex/p/18536362

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前 API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

(一)引言

在前面的博客中,我们深入学习了HarmonyOS Next系统中关键资产存储的相关知识,包括其存储原理、安全保障机制以及各种操作方法等。然而,在实际应用开发中,仅仅实现功能是不够的,性能优化和遵循相关注意事项同样至关重要。良好的性能能够提升用户体验,而注意事项的遵循则可以避免潜在的问题,确保应用的稳定运行。

(二)性能优化策略

  1. 批量查询优化
       - 分批查询:当需要查询大量关键资产时,由于批量查询结果通过IPC通道传输给业务,受IPC缓冲区大小限制,建议采用分批查询的方式。例如,若预计查询结果可能超过40条,应将查询分成每次不超过40条的批次进行。这样可以避免一次性传输大量数据导致的性能问题,如IPC通道阻塞或内存占用过高。在代码实现上,可以通过设置RETURN_OFFSET和RETURN_LIMIT参数来控制每批查询的起始位置和数量。例如,以下是一个简单的分批查询示例(ArkTS语言):
let query: asset.AssetMap = new Map();
query.set(asset.Tag.RETURN_LIMIT, 40); // 每次查询40条
let offset = 0;
while (true) {
    query.set(asset.Tag.RETURN_OFFSET, offset);
    let res: Array<asset.AssetMap> = await asset.query(query);
    if (res.length === 0) {
        break; // 没有更多数据,结束查询
    }
    // 处理查询结果
    for (let i = 0; i < res.length; i++) {
        console.log('Asset:', res[i]);
    }
    offset += 40;
}

- 合理设置查询参数:除了分批查询,合理设置其他查询参数也能提高性能。例如,根据业务需求准确设置RETURN_TYPE参数,只获取实际需要的关键资产属性,避免获取不必要的数据,减少数据传输量和处理时间。如果只需要查询关键资产的别名和密码,而不需要其他附属信息,可以将RETURN_TYPE设置为只返回这两个属性相关的数据。
2. 数据存储结构设计影响
   - 选择合适的存储结构:在设计关键资产的数据存储结构时,应根据数据的特点和访问模式进行优化。例如,如果某些关键资产经常被一起查询和使用,可以将它们存储在相邻的位置或采用合适的数据结构组织,以提高数据的读取效率。对于频繁进行范围查询的关键资产,可以考虑使用有序的数据结构,如基于B树或红黑树的存储结构,加快查询速度。
   - 避免过度冗余:尽量避免在关键资产中存储过多冗余信息,因为冗余数据不仅会占用更多的存储空间,还可能影响数据更新和查询性能。如果可以通过其他方式(如计算或关联查询)获取相关信息,就不应在关键资产中重复存储。例如,若应用可以根据用户的登录时间和操作记录计算用户的活跃时间段,就无需在关键资产中单独存储活跃时间段信息。

(三)开发注意事项

  1. 关键资产别名唯一性要求及重要性
       - 唯一性要求:关键资产以业务身份 + 别名作为唯一索引,因此每个关键资产的别名必须在整个应用中保持唯一。例如,在一个用户管理系统中,如果为不同用户的密码设置了相同的别名,可能会导致数据覆盖或查询错误,严重影响系统的正常运行。
       - 重要性体现:保证别名唯一性有助于准确地识别和操作特定的关键资产。在进行新增、查询、更新和删除操作时,别名是定位关键资产的重要依据。如果别名不唯一,可能会导致误操作其他关键资产,引发数据不一致或安全问题。例如,在更新密码时,如果别名不唯一,可能会错误地更新了其他用户的密码,造成严重后果。
  2. 业务自定义数据存储处理(属性拼接)
       - ASSET为业务预留了12个关键资产自定义属性(名称以“DATA_LABEL”开头),对于超过12个自定义属性的情况,可以将多段数据按照一定的格式(如JSON)拼接到同一个ASSET属性中。例如,如果应用需要存储用户的多个个人信息字段,如姓名、年龄、性别、地址等,超过了12个属性,可以将这些信息组合成一个JSON字符串,存储在一个DATA_LABEL属性中。在读取时,再解析JSON字符串获取各个字段的值。以下是一个简单的示例(ArkTS语言):
let userInfo = {
    name: 'John Doe',
    age: 30,
    gender:'male',
    address: '123 Main Street'
};
let jsonData = JSON.stringify(userInfo);
let attr: asset.AssetMap = new Map();
attr.set(asset.Tag.DATA_LABEL_NORMAL_1, stringToArray(jsonData));
// 存储操作
//...
// 读取操作
let res: Array<asset.AssetMap> = await asset.query(query);
let jsonStr: string = arrayToString(res[0].get(asset.Tag.DATA_LABEL_NORMAL_1) as Uint8Array);
let userData = JSON.parse(jsonStr);
console.log('User name:', userData.name);

(四)错误处理与调试

  1. 常见错误情况及处理方法
       - 查询失败:查询失败可能是由于多种原因引起的,如网络问题、查询条件错误或权限不足等。如果是网络问题,可以检查设备的网络连接状态,尝试重新查询。对于查询条件错误,应仔细检查查询参数的设置是否正确,例如别名是否拼写错误、查询范围是否合理等。如果是权限不足,需要确保应用已申请了必要的权限,如查询某些受保护的关键资产可能需要特定的权限。在代码中,可以通过捕获错误并根据错误类型进行相应的处理,例如:
try {
    let res: Array<asset.AssetMap> = await asset.query(query);
    // 处理查询结果
} catch (error) {
    let err = error as BusinessError;
    if (err.code === 'PERMISSION_DENIED') {
        console.error('Insufficient permission to query asset.');
        // 提示用户申请权限或采取其他措施
    } else if (err.code === 'INVALID_QUERY_PARAMETER') {
        console.error('Invalid query parameter. Please check your query.');
        // 检查查询参数并修正
    } else {
        console.error('Failed to query asset. Code is ${err.code}, message is ${err.message}');
        // 其他未知错误处理
    }
}

- 更新失败:更新失败可能是因为关键资产不存在、更新的属性不允许更新或数据格式错误等。若关键资产不存在,应先检查是否正确指定了要更新的关键资产(如别名是否正确)。对于不允许更新的属性(如具有完整性保护的属性),需要确认更新操作是否符合规则。如果是数据格式错误,检查更新的数据是否符合属性要求的格式。同样,在代码中捕获错误并处理:

try {
    asset.update(query, attrsToUpdate).then(() => {
        console.info('Key asset updated successfully.');
    }).catch((err: BusinessError) => {
        let err = error as BusinessError;
        if (err.code === 'ASSET_NOT_FOUND') {
            console.error('Key asset not found. Please check the alias.');
        } else if (err.code === 'INVALID_UPDATE_ATTRIBUTE') {
            console.error('Invalid update attribute.');
        } else {
            console.error('Failed to update key asset. Code is ${err.code}, message is ${err.message}');
        }
    });
} catch (error) {
    let err = error as BusinessError;
    console.error('Failed to update key asset. Code is ${err.code}, message is ${err.message}');
}
  1. 调试工具和技巧
       - 使用日志输出:在代码中适当位置添加日志输出语句,输出关键变量的值、操作结果和错误信息等,有助于在运行时跟踪程序的执行流程和发现问题。例如,在查询关键资产之前输出查询参数,在操作完成后输出结果或错误码,以便快速定位问题所在。
       - 调试器工具:HarmonyOS提供了调试器工具,可以在开发环境中对应用进行调试。通过设置断点、单步执行等功能,可以详细查看代码的执行过程,检查变量的值和函数的调用栈,帮助开发者深入理解程序行为并找到问题根源。例如,在执行关键资产操作的代码处设置断点,逐步执行并观察变量的变化,以确定是否存在逻辑错误或数据异常。

(五)安全与性能平衡

  1. 安全前提下的性能优化探讨
       - 加密算法选择与性能权衡:在保障关键资产安全的前提下,可以根据实际情况选择合适的加密算法。虽然AES256 - GCM算法提供了高强度的安全保障,但在一些对性能要求较高且安全风险相对较低的场景下,可以考虑使用相对较轻量级的加密算法,或者对加密操作进行优化。例如,对于一些不涉及高度敏感信息的关键资产,可以采用加密强度稍低但性能更好的加密算法,或者在加密过程中采用缓存技术,减少重复加密计算,提高性能。
       - 缓存策略:合理运用缓存可以在一定程度上提高性能。对于频繁访问但不经常更新的关键资产,可以将其缓存到内存中,减少对存储系统的访问次数。但在使用缓存时,需要注意缓存的一致性和安全性。例如,当关键资产更新时,要确保及时更新缓存中的数据,同时要采取措施防止缓存数据被非法获取或篡改。
  2. 实际案例和经验分享
       - 案例一:在一个电商应用中,用户的购物车信息(关键资产)需要频繁查询和更新。为了提高性能,开发者采用了缓存策略,将购物车信息缓存到内存中。同时,为了确保安全,在缓存数据时进行了加密处理,并且设置了合理的缓存过期时间。当用户添加或修改购物车商品时,先在内存中更新缓存,然后异步更新到存储系统中,这样既提高了查询和更新的速度,又保证了购物车信息的安全。
       - 案例二:某企业应用需要存储大量员工的考勤记录(关键资产)。在查询考勤记录时,开发者根据考勤日期范围进行了分批查询,并优化了查询参数,只获取必要的字段。同时,为了提高存储效率和性能,对考勤记录的数据结构进行了优化,采用了压缩技术减少数据存储空间。在保障数据安全方面,对考勤记录进行了加密存储,并严格控制访问权限,只有授权人员才能查看和管理考勤记录。通过这些措施,在保证数据安全的前提下,显著提高了考勤记录查询和管理的性能。

(六)总结与展望

  1. 性能优化和注意事项要点总结
       - 在关键资产存储开发中,性能优化方面要注重批量查询的优化,包括分批查询和合理设置查询参数,同时精心设计数据存储结构。开发注意事项上,务必保证关键资产别名的唯一性,合理处理业务自定义数据存储。错误处理要全面考虑常见错误情况并提供有效的处理方法,善于利用调试工具进行问题排查。在安全与性能平衡方面,根据实际场景权衡加密算法和采用合适的缓存策略等。
  2. 未来发展趋势展望
       - 随着技术的不断发展,HarmonyOS Next在关键资产存储方面可能会有更多的优化和创新。在性能方面,可能会进一步提升数据存储和查询的效率,例如采用更先进的存储技术和算法优化。在安全方面,有望引入更强大的加密技术和更智能的访问控制机制,以应对日益复杂的安全威胁。同时,随着物联网、人工智能等技术的融合,关键资产存储可能会更好地适应多样化的应用场景和设备环境,为我们开发者提供更加便捷、高效和安全的开发体验,推动整个HarmonyOS生态系统的发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/829185.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT:控制台数据新增、删除、查询、更新

基于控制台的程序,使用SQLite数据库完成大批量数据的增加、删除、更新和查询操作并输出。效果图: CH1301.pro 详细代码QT -= gui QT += sqlCONFIG += c++11 console CONFIG -= app_bundle# The following define makes your compiler emit warnings if you use # any Qt feat…

【人脸伪造检测】Spatial-Phase Shallow Learning: Rethinking Face Forgery Detection in Frequency Domain

一、研究动机[!note]创新点:利用相位谱实现伪造检测,并且证明了卷积模型可以提取隐性特征。由于上采样是伪造模型的关键步骤,这篇论文通过相位信息检测上采样的伪影。对比之前的频率模型: F3-Net:通过离散余弦变换后的统计特征实现伪造检测二、检测模型可学习的知识点[!ti…

CF413

前言 我是小惰惰,所以我只写一套题,去seesee大家的题解 CF413A 扫一遍 如果他的最大值>max||最小值<min 不行 如果他不等于 max min 的数 >n-m 不行 CF314B 直接记录每个聊天室法了多少条消息,然后计算每个人的时候减去他法的就行了 CF314C 反正都是全部翻倍,所以…

全面开启双拼

简单说说各种设备怎么开启双拼简单说说各种设备怎么开启双拼 ‍‍ iOS 其实添加双拼键盘,和添加五笔键盘差不多,具体可以看《启用 iPhone 原生的五笔输入》,这里就不赘述了 你也可以安装流行输入法,然后切换为双拼。 ‍ Android 貌似没有原生的双拼,可以安装下主流的输入法…

终于搞全了:GPIO/ADC/LED/I2C/SPI/USB…

合宙低功耗4G模组经典型号Air780E,支持两种软件开发方式: 一种是传统的AT指令;一种是基于模组做Open开发。 传统AT指令的开发方式,合宙模组与行业内其它模组品牌在软件上区别不大,在硬件功耗上更有优势; 模组Open开发,合宙采用的是LuatOS方式,相对C-SDK入门更简单,开发…

20-数据库系统安全

20.1 概况 1)概念 数据库安全是指数据库的机密性、完整性、可用性能够得到保障,其主要涉及数据库管理安全、数据安全、数据库应用安全以及数据库运行安全。 2)威胁授权的误用 逻辑推断和汇聚:利用逻辑推理,把不太敏感的数据结合起来可以推断出敏感信息。进行逻辑推断也可能…

来了,超全MQTT实用示例

Air201快速入门之MQTT示例合宙Air201资产定位模组——是一个集成超低功耗4G通信、语音通话、超低功耗定位、计步、震动、Type-C、充电、放音、录音等功能的超小PCBA。 内部集成高效、简单、可靠的LuatOS语言,旨在帮助客户降低开发难度,降低研发成本,以及打造超小超低功耗的精…

Air780E软件指南:zlib解压示例

一、ZLIB解压工具简介Zlib解压工具是一个广泛使用的压缩和解压缩库,主要用于处理数据的压缩和解压缩任务。Zlib使用的是DEFLATE算法,这是一种通用的压缩算法。它被应用在很多场景中,比如压缩文件、网络传输中的数据压缩、以及各种应用程序中的数据存储和读取。 Zlib的代码库…

简单但实用,RTC时钟使用指南

合宙Air201快速入门-RTC实时时钟使用示例- 本教程教你通过使用脚本代码,实现Air201内置RTC实时时钟同步时间、获取时间、设置时间等功能,可根据实际需求灵活应用。 我们先了解一些相关基础知识: RTC——Real-Time Clock实时时钟,通常称为时钟芯片,可以提供精确的实时时间,…

Nexpose 6.6.278 发布下载,新增功能概览

Nexpose 6.6.278 for Linux & Windows - 漏洞扫描Nexpose 6.6.278 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, released Nov 07, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:s…

BuildCTF-sorin-wp(part)

BuildCTF部分题目wp队员:sorinEZ_ZIP010查找分析发现压缩包,使用foremost分离疑似套娃压缩包,使用开源软件extractnow或者脚本都可以批量压缩,这里使用extractnow得到flagHEX的秘密16进制每两位截取一次转10进制,对比Build的前几个字符的ascll码发现多了128,脚本如下:de…

深入解析 Transformers 框架(四):Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节详解

本文深入解析 Qwen2.5 大语言模型的分词流程和 BPE 分词算法。通过中英文混合文本示例,详细介绍了从文本规范化、初步分词、字节编码与映射到 BPE 分词的每一步骤。结合代码实现,揭示了 Qwen2.5 如何高效处理多语言文本,帮助读者全面理解 BPE 分词算法的原理和应用……前面我…