Flutter 应用数据持久化指南

1. 介绍

1.1 什么是数据持久化?

数据持久化是指将应用程序中的数据保存在持久存储介质(如硬盘、数据库等)中的过程。在计算机科学领域,持久化数据是指数据在程序退出或系统关机后仍然存在的能力。这种持久性使得数据可以在不同的应用程序运行周期之间保持不变,以便稍后进行检索、处理和使用。

在移动应用开发中,数据持久化是指将应用程序中的用户数据(如用户偏好设置、用户登录状态、应用配置等)保存在设备上,以便在应用关闭或设备重启后仍然保持。这样可以确保用户在不同的应用使用场景中,其数据状态可以得到保留和恢复。

1.2 为什么在Flutter应用中需要数据持久化?

在Flutter应用中,数据持久化是一项至关重要的任务,这是因为:

  1. 用户体验改善: 持久化数据可以确保用户的个性化设置、历史数据、登录状态等在应用关闭或重启后得以保留,提升了用户体验。

  2. 应用状态管理: 应用中的状态数据(如购物车内容、用户设置)可能需要在应用生命周期中保持不变,以确保应用的连续性和一致性。

  3. 离线支持: 某些应用场景下,用户可能会在没有网络连接的情况下使用应用,此时需要将数据持久化到本地以提供离线支持。

  4. 数据共享: 持久化数据可以使得不同的模块或组件之间共享数据更加方便,同时也可以实现跨设备的数据同步。

因此,数据持久化在Flutter应用中扮演着至关重要的角色,它不仅可以改善用户体验,还可以提高应用的可靠性和灵活性。

在这里插入图片描述

2. Flutter中的数据持久化方式

2.1 Shared Preferences

Shared Preferences是Flutter中用于轻量级数据存储的一种方式,它允许将简单的键值对保存到设备上的持久化存储中。通常用于存储用户的偏好设置、配置信息等。

优点:

  • 简单易用,不需要额外的依赖库。
  • 适用于存储少量的简单数据。
  • 跨应用共享数据。

缺点:

  • 仅适用于存储简单的键值对数据,不适合存储复杂数据结构。
  • 不支持查询操作,只能通过键获取值。

2.2 SQLite数据库

SQLite是一种轻量级的关系型数据库,Flutter提供了SQLite数据库的支持,可以通过dart语言的sqflite库进行操作。SQLite适用于需要存储大量结构化数据的情况。

优点:

  • 支持复杂的查询操作,适用于存储和管理大量结构化数据。
  • 数据库的持久化存储,适用于需要长期保存数据的应用场景。

缺点:

  • 使用相对较复杂,需要熟悉SQL语法。
  • 需要引入第三方库(如sqflite)来实现数据库操作。

2.3 文件存储(File Storage)

Flutter也支持直接将数据存储到文件中,可以通过dart语言的File类进行文件操作。文件存储适用于存储非结构化或半结构化的数据,如图片、文本等。

优点:

  • 灵活性高,可以存储各种类型的数据。
  • 适用于存储大文件或非结构化数据。

缺点:

  • 需要手动管理文件的读写操作,相对麻烦。
  • 不适合存储大量结构化数据,查询和操作相对复杂。

2.4 使用第三方库

除了上述原生的数据持久化方式外,Flutter还有许多第三方库可供选择,如Hive数据库、ObjectBox等。这些库提供了不同的特性和性能优化,可以根据具体需求选择最合适的库进行数据持久化操作。

优点:

  • 提供了丰富的功能和性能优化。
  • 可以根据需求选择最合适的库。

缺点:

  • 引入第三方库可能增加应用的体积。
  • 学习成本相对较高,需要熟悉库的使用方法和特性。

3. Shared Preferences

3.1 安装与导入

在Flutter项目中使用Shared Preferences,首先需要在项目的pubspec.yaml文件中添加依赖,并运行flutter pub get命令来安装依赖包。

dependencies:shared_preferences: ^2.0.0

安装完成后,在需要使用的Dart文件中导入shared_preferences库。

import 'package:shared_preferences/shared_preferences.dart';

3.2 使用示例

下面是一个简单的示例,演示了如何使用Shared Preferences在Flutter应用中存储和读取数据。

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatefulWidget {_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {int _counter = 0;void initState() {super.initState();_loadCounter();}_loadCounter() async {SharedPreferences prefs = await SharedPreferences.getInstance();setState(() {_counter = (prefs.getInt('counter') ?? 0);});}_incrementCounter() async {SharedPreferences prefs = await SharedPreferences.getInstance();setState(() {_counter = (prefs.getInt('counter') ?? 0) + 1;prefs.setInt('counter', _counter);});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Shared Preferences Example'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('Button tapped $_counter time${_counter == 1 ? '' : 's'}.',style: TextStyle(fontSize: 20),),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: Icon(Icons.add),),);}
}

3.3 优缺点

优点:

  • 简单易用,不需要额外的依赖。
  • 跨应用共享数据,可以在应用之间共享用户偏好设置等信息。
  • 适用于存储少量的简单数据,如用户设置、配置信息等。

缺点:

  • 仅适用于存储简单的键值对数据,不适合存储复杂数据结构。
  • 不支持查询操作,只能通过键获取值。
  • 存储的数据量有限,不适合存储大量数据。

4. SQLite 数据库

4.1 安装与导入

在Flutter项目中使用SQLite数据库,需要添加sqflite依赖,并运行flutter pub get来安装依赖包。

dependencies:sqflite: ^2.0.0path_provider: ^2.0.0

安装完成后,在需要使用的Dart文件中导入sqflite库。

import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';

4.2 使用示例

下面是一个简单的示例,演示了如何使用SQLite数据库在Flutter应用中创建表格、插入数据、查询数据等操作。

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatefulWidget {_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {Database _database;void initState() {super.initState();_openDatabase();}_openDatabase() async {final Directory directory = await getApplicationDocumentsDirectory();final String path = join(directory.path, 'example.db');_database = await openDatabase(path, version: 1,onCreate: (Database db, int version) async {await db.execute('CREATE TABLE IF NOT EXISTS items(id INTEGER PRIMARY KEY, name TEXT)');});}_insertData() async {await _database.transaction((txn) async {int id = await txn.rawInsert('INSERT INTO items(name) VALUES("Item 1")');print('Inserted row id: $id');});}_queryData() async {List<Map> result = await _database.rawQuery('SELECT * FROM items');print(result);}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('SQLite Example'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[ElevatedButton(onPressed: _insertData,child: Text('Insert Data'),),ElevatedButton(onPressed: _queryData,child: Text('Query Data'),),],),),);}
}

4.3 优缺点

优点:

  • 支持复杂的查询操作,适用于存储和管理大量结构化数据。
  • 数据库的持久化存储,适用于需要长期保存数据的应用场景。
  • 提供了事务管理,可以确保数据的一致性和完整性。

缺点:

  • 使用相对较复杂,需要熟悉SQL语法。
  • 需要引入第三方库(如sqflite)来实现数据库操作。
  • 对于简单的数据存储需求,使用SQLite可能显得过于复杂。

5. 文件存储

5.1 安装与导入

在Flutter项目中使用文件存储,无需额外安装依赖,因为文件操作相关的库已经包含在Flutter SDK中。

5.2 使用示例

下面是一个简单的示例,演示了如何使用文件存储在Flutter应用中读取和写入数据。

import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatefulWidget {_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {String _filePath = '';void initState() {super.initState();_getFile();}Future<void> _getFile() async {Directory directory = await getApplicationDocumentsDirectory();_filePath = '${directory.path}/example.txt';}Future<void> _writeToFile() async {final File file = File(_filePath);await file.writeAsString('Hello, Flutter!');print('Data written to file.');}Future<void> _readFromFile() async {try {final File file = File(_filePath);String data = await file.readAsString();print('Data read from file: $data');} catch (e) {print('Error reading file: $e');}}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('File Storage Example'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[ElevatedButton(onPressed: _writeToFile,child: Text('Write to File'),),ElevatedButton(onPressed: _readFromFile,child: Text('Read from File'),),],),),);}
}

5.3 优缺点

优点:

  • 灵活性高,可以存储各种类型的数据,如文本、图片等。
  • 不需要引入额外的依赖,文件操作相关的库已经包含在Flutter SDK中。
  • 适用于存储大文件或非结构化数据。

缺点:

  • 需要手动管理文件的读写操作,相对麻烦。
  • 不适合存储大量结构化数据,查询和操作相对复杂。
  • 文件存储的性能相对较低,不适合频繁的读写操作。

6. 第三方库

6.1 Hive数据库

Hive是一个轻量级的嵌入式数据库,专为Flutter开发而设计。它提供了快速、简单的数据存储方案,并具有高度的性能和低延迟。

优点:

  • 快速、轻量级,适用于移动设备上的资源受限环境。
  • 采用纯Dart实现,无需平台原生代码,易于集成和使用。
  • 支持类型安全的数据模型,可以轻松地将Dart对象序列化到数据库中。

缺点:

  • 相对较新,可能缺乏一些高级功能和成熟的社区支持。

6.2 ObjectBox

ObjectBox是一种高性能的对象数据库,专为移动设备和嵌入式系统而设计。它提供了快速、简单的数据存储解决方案,具有高度的性能和低延迟。

优点:

  • 高性能,适用于对速度要求较高的应用场景。
  • 支持多种平台,包括Android、iOS、Flutter等。
  • 提供了强大的查询语言和API,方便灵活的数据操作。

缺点:

  • 相对较新,可能缺乏一些成熟的社区支持和文档资源。

6.3 Moor数据库

Moor是一个强大的Flutter数据库库,提供了类型安全、可组合的数据库操作API。它允许使用Dart语言来定义数据库表和查询,而无需编写SQL语句。

优点:

  • 类型安全,可以在编译时捕获到数据库操作中的错误。
  • 支持使用Dart语言来定义数据库表和查询,简化了开发流程。
  • 提供了丰富的功能和灵活的API,适用于各种数据操作需求。

缺点:

  • 学习曲线较陡,需要一定的时间来熟悉其API和工作原理。
  • 相对较新,可能缺乏一些成熟的社区支持和文档资源。

7. 数据加密与安全

7.1 加密存储数据

在Flutter应用中,可以使用加密算法对敏感数据进行加密存储,以增加数据的安全性。常见的加密算法包括AES、RSA等。以下是一个简单的示例,演示了如何使用AES算法对数据进行加密和解密:

import 'package:flutter/material.dart';
import 'package:encrypt/encrypt.dart' as encrypt;void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatelessWidget {final String _plainText = 'Sensitive data';final String _secretKey = 'supersecretkey';String _encryptedText = '';String _decryptedText = '';MyHomePage() {final encrypter = encrypt.Encrypter(encrypt.AES(encrypt.Key.fromUtf8(_secretKey)));final encrypted = encrypter.encrypt(_plainText);_encryptedText = encrypted.base64;final decrypted = encrypter.decrypt(encrypted);_decryptedText = decrypted;}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Data Encryption Example'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('Encrypted Text: $_encryptedText'),Text('Decrypted Text: $_decryptedText'),],),),);}
}

7.2 安全存储敏感信息

对于敏感信息(如用户密码、密钥等),不建议直接存储在本地。可以使用Flutter提供的Secure Storage或第三方库(如flutter_secure_storage)来安全地存储敏感信息。这些库通常会使用系统提供的安全存储机制,如Android的Keystore、iOS的Keychain等,来保护数据免受未经授权的访问。

以下是一个示例,演示了如何使用flutter_secure_storage库来安全存储敏感信息:

import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: MyHomePage(),);}
}class MyHomePage extends StatelessWidget {final FlutterSecureStorage _storage = FlutterSecureStorage();Future<void> _savePassword() async {await _storage.write(key: 'password', value: 'mysecretpassword');}Future<void> _readPassword() async {String password = await _storage.read(key: 'password');print('Password: $password');}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Secure Storage Example'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[ElevatedButton(onPressed: _savePassword,child: Text('Save Password'),),ElevatedButton(onPressed: _readPassword,child: Text('Read Password'),),],),),);}
}

通过使用加密算法和安全存储机制,可以有效保护Flutter应用中的敏感信息,提高数据的安全性和可靠性。

8. 最佳实践与建议

8.1 选择合适的持久化方式

在选择数据持久化方式时,需要根据应用的需求和特点来决定。对于简单的键值对数据,可以选择使用Shared Preferences;对于结构化数据,可以考虑使用SQLite数据库或第三方库;对于大文件或非结构化数据,可以使用文件存储。综合考虑数据复杂度、性能要求、开发成本等因素,选择最适合的持久化方式。

8.2 管理数据结构与版本

在使用数据库进行数据持久化时,应注意管理数据结构和数据库版本。随着应用的迭代和更新,数据结构可能会发生变化,需要考虑如何处理旧版本数据的兼容性和迁移。可以使用数据库迁移工具或版本管理机制来管理数据结构和版本,确保数据的一致性和完整性。

8.3 处理异常与错误

在进行数据持久化操作时,可能会遇到各种异常和错误,如文件读写错误、数据库连接错误等。为了确保应用的稳定性和可靠性,应适当处理这些异常和错误情况,例如使用try-catch语句捕获异常并进行处理,或者使用错误处理机制进行错误报告和日志记录。同时,建议在进行数据操作前进行适当的检查和验证,以防止出现意外情况。

9. 总结

在Flutter应用中,数据持久化是确保数据在应用关闭或设备重启后仍然保持的重要机制之一。本文介绍了几种常用的数据持久化方式,包括Shared Preferences、SQLite数据库、文件存储以及使用第三方库,每种方式都有其适用的场景和优缺点。

Shared Preferences适用于存储少量简单的键值对数据,如用户偏好设置、配置信息等,使用简单方便。SQLite数据库适用于存储大量结构化数据,支持复杂的查询操作,提供了可靠的数据存储解决方案。文件存储适用于存储大文件或非结构化数据,灵活性高,但不适合存储大量结构化数据。

除了原生的数据持久化方式外,还可以使用第三方库如Hive数据库、ObjectBox、Moor数据库等,这些库提供了更多的功能和性能优化,可以根据具体需求选择最合适的库进行数据持久化操作。

在进行数据持久化时,需要注意选择合适的持久化方式,管理数据结构与版本,以及处理异常与错误。通过合理的数据持久化方案,可以提高应用的稳定性和可靠性,改善用户体验,从而更好地满足用户的需求。

附录:常见问题与解答

问题1:我应该使用哪种数据持久化方式?

答:选择数据持久化方式应该根据你的应用需求来决定。如果只需要存储少量的简单数据,可以使用Shared Preferences;如果需要存储大量的结构化数据并支持复杂的查询操作,可以选择SQLite数据库;如果需要存储大文件或非结构化数据,可以使用文件存储。另外,还可以考虑使用第三方库来满足特定需求。

问题2:如何处理数据结构的变化和数据库版本更新?

答:在进行数据结构变化和数据库版本更新时,可以使用数据库迁移工具或版本管理机制来管理数据结构和版本。这些工具可以帮助你确保数据的一致性和完整性,并提供了方便的方法来处理旧版本数据的兼容性和迁移。

问题3:如何确保数据的安全性?

答:为了确保数据的安全性,可以使用加密算法对敏感数据进行加密存储,同时可以使用安全存储机制(如Secure Storage)来安全地存储敏感信息。另外,还可以考虑实现访问控制和权限管理机制,限制数据的访问权限,确保数据只能被授权的用户访问。

问题4:如何处理数据持久化操作中的异常和错误?

答:在进行数据持久化操作时,可能会遇到各种异常和错误,如文件读写错误、数据库连接错误等。为了确保应用的稳定性和可靠性,可以适当处理这些异常和错误情况,例如使用try-catch语句捕获异常并进行处理,或者使用错误处理机制进行错误报告和日志记录。同时,建议在进行数据操作前进行适当的检查和验证,以防止出现意外情况。

问题5:我应该如何选择合适的第三方库进行数据持久化?

答:选择合适的第三方库应该考虑以下几个因素:

  • 功能需求:不同的库可能提供不同的功能和特性,需要根据你的应用需求来选择最合适的库。
  • 性能要求:一些库可能具有更高的性能和更低的延迟,适合对速度要求较高的应用场景。
  • 社区支持:选择一个活跃的社区支持良好的库,可以获得更好的技术支持和问题解答。
  • 文档资源:选择一个文档资源丰富、易于学习的库,可以加快开发速度和降低学习成本。

综合考虑以上因素,选择最合适的第三方库进行数据持久化操作。

问题6:我应该如何保护用户的隐私数据?

答:保护用户的隐私数据是非常重要的,可以考虑以下几个方面来保护用户的隐私数据:

  • 加密存储:使用加密算法对敏感数据进行加密存储,确保数据在存储和传输过程中不被窃取或篡改。
  • 安全传输:在数据传输过程中使用安全的传输协议(如HTTPS),确保数据在传输过程中不被窃取或窥探。
  • 访问控制:实现访问控制和权限管理机制,限制数据的访问权限,确保数据只能被授权的用户访问。
  • 合规性:遵守相关的隐私法律和法规,保护用户的隐私权益,不滥用用户的个人信息。

通过以上措施,可以有效保护用户的隐私数据,提高数据的安全性和可信度。

问题7:如何优化数据持久化操作的性能?

答:优化数据持久化操作的性能可以从以下几个方面入手:

  • 批量操作:尽量使用批量操作来减少数据库访问次数,提高数据操作的效率。
  • 索引优化:合理使用索引来加速数据查询操作,减少数据的扫描和匹配时间。
  • 异步操作:将耗时的数据操作放在异步任务中执行,避免阻塞UI线程,提高应用的响应速度。
  • 缓存机制:使用缓存机制来缓存常用的数据,减少数据读取和写入的次数,提高数据访问速度。

通过以上优化措施,可以有效提高数据持久化操作的性能,提升应用的用户体验和响应速度。

问题8:我应该如何备份和恢复应用中的数据?

答:备份和恢复应用中的数据是确保数据安全的重要措施之一。你可以考虑以下几种方法来备份和恢复应用中的数据:

  1. 数据库备份:对于使用SQLite等数据库存储数据的应用,可以定期进行数据库备份。你可以编写定期备份数据的任务,并将备份文件保存到安全的位置,以防止数据丢失。
  2. 云存储:将应用中的重要数据上传到云存储服务(如Google Drive、Dropbox等),可以实现数据的自动备份和恢复。你可以使用相关的云存储SDK来实现数据的上传和下载操作。
  3. 导出文件:为用户提供导出数据的功能,允许用户将数据导出为文件进行备份。你可以将数据导出为CSV、JSON等格式的文件,并提供下载或共享功能,方便用户进行数据备份和恢复。
  4. 数据同步:使用数据同步技术,将应用中的数据与服务器端或其他设备进行同步。这样可以确保数据的实时备份和同步,避免数据丢失和不一致。

通过以上方法,可以实现应用中数据的备份和恢复,保障数据的安全和完整性。同时,建议定期测试备份和恢复流程,确保备份数据的可用性和可靠性。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

是德科技keysight 33621A波形发生器

181/2461/8938产品概述&#xff1a; 与上一代DDS波形发生器相比&#xff0c;采用独家Trueform技术的安捷伦HP 33621A波形发生器具有更高的性能、保真度和灵活性。安捷伦HP 33621A 120 MHz、单通道、Trueform arbs&#xff0c;带时序控制和64 MSa存储器&#xff0c;1 ps抖动&am…

go juc 线程中的子类

1.go test() 主死随从 package mainimport ("fmt""strconv""time" )func test() {for i : 1; i < 10; i {fmt.Println("hello " strconv.Itoa(i))//阻塞time.Sleep(time.Second)} } func main() {//开启协程go test()for i : 1; …

如何配置vite的proxy

1.前言 vite项目&#xff0c;本地开发环境可以通过配置proxy代理实现跨域请求。但是生产环境&#xff0c;该配置不生效&#xff0c;一般使用 nginx 转发&#xff0c;或者后端配置cors 2.解释 server: {port: 9000,proxy: { // 本地开发环境通过代理实现跨域&#xff0c;生产…

基于ssm的轻型卡车零部件销售平台(java项目+文档+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的轻型卡车零部件销售平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 轻型卡车零部件销售平台…

C# 批量删除Excel重复项

当从不同来源导入Excel数据时&#xff0c;可能存在重复的记录。为了确保数据的准确性&#xff0c;通常需要删除这些重复的行。 手动查找并删除可能会非常耗费时间&#xff0c;而通过编程脚本则可以实现在短时间内处理大量数据。本文将提供一个使用C# 快速查找并删除Excel重复项…

【ArduinoQuartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能

【Arduino&Quartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能 一、将Reindeer软核下载到STEP CYC10&#xff08;一&#xff09;下载PulseRain Reindeer软核&#xff08;二&#xff09;配置Reindeer软核到开发板1.将sof文件转换为jic文件2.将jic文…

Centos7安装单机版Kafka

下载 链接&#xff1a;https://pan.baidu.com/s/1W8lVEF6Y-xlg6zr3l9QAbg?pwdhbkt 提取码&#xff1a;hbkt 上传到服务器/opt目录 安装 # kafka安装目录为 /opt/kafka cd /opt; mkdir kafka; mv kafka_2.13-2.7.0.tgz ./kafka;cd kafka; #解压 tar -zxvf kafka_2.13-2.7.0…

说一说Redis的Bitmaps和HyperLoLog?

本篇内容对应 “Redis高级数据类型”小节 和 “7.5 网站数据统计”小节 对应视频&#xff1a; Redis高级数据结构 网站数据统计 1 什么是UV和DAU&#xff1f; DAUUV英文全称Daily Active UserUnique Visotr中文全称日活跃用户量独立访客如何统计数据通过用户ID排重统计数据通…

上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 做过isp的同学都知道&#xff0c;图像处理里面有一个3A&#xff0c;即自动曝光、自动白平衡和自动对焦。其中自动对焦这个&#xff0c;就需要用输入…

绩效考核存在合理性、公平性、客观性吗?

目录 一、绩效考核流于形式&#xff1a;没有实际考核过 二、考核结果的确定: 主管一人说了算 三、考核结果&#xff1a; 与绩效奖金挂钩吗&#xff1f; 四、考核的滥用&#xff1a;成为公司排挤迫使员工离职的手段 五、公司说&#xff1a; 让你滚蛋&#xff0c;谁还会发你奖…

SpringBoot(48)-使用 SkyWalking 进行分布式链路追踪

Spring Boot&#xff08;48&#xff09;- 使用 SkyWalking 进行分布式链路追踪 介绍 在分布式系统中&#xff0c;了解各个服务之间的调用关系和性能表现是非常重要的。SkyWalking 是一款开源的分布式系统监控与分析平台&#xff0c;能够帮助我们实现分布式系统的链路追踪、性…

使用minikube安装使用单机版K8S(docker)

前置&#xff1a;作为一个开发&#xff0c;工作之余想玩一下k8s&#xff0c;但是搭建成本太高&#xff0c;所以就找到了minikube这个工具&#xff0c;快速搭建单机版k8s&#xff0c;下面是个人搭建流程&#xff0c;基于centos7&#xff0c;仅供参考。 1.下载kubectl&#xff0…

ES学习日记(十)-------Java操作ES之连接客户端

Elasticsearch有两种连接方式: transport、rest。transport 通过TCP方式访问ES(只支持iava)&#xff0c;rest 方式通过http API 访问ES(没有语言限制)。 ES官方建议使用Iest 方式&#xff0c;transport 在7.8 版本中不建议使用&#xff0c;在8.x的版本中废弃。你可以用Java客户…

Java23种设计模式

本文主要是对Java中一些常用的设计模式进行讲解 后期会进行不断的更新&#xff0c;欢迎浏览 23种设计模式 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、桥接…

使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流

使用 Flume 将 CSV 数据导入 Kafka&#xff1a;实现实时数据流 文介绍了如何使用 Apache Flume 将 CSV 格式的数据从本地文件系统导入到 Apache Kafka 中&#xff0c;以实现实时数据流处理。通过 Flume 的配置和操作步骤&#xff0c;我们可以轻松地将数据从 CSV 文件中读取并发…

RT-Thread下使用NTP服务器获取时间并同步到硬件RTC

单片机:STM32F407VET6 实现功能:通过ntp服务器获取时间并同步到硬件RTC上 1.配置NTP相关参数 1.1打开netutils相关软件包 1.2 关闭软件RTC相关配置 参考资料:RT-Thread中使用NTP自动更新时间_rtthread ntp-CSDN博客 2.配置硬件RTC 2.1 在ENV里面使能硬件RTC 2.2使用STM32C…

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者&#xff1a;高玉龙&#xff08;元泊&#xff09; 背景信息 随着数字化新时代的全面展开以及 5G 与物联网&#xff08;IoT&#xff09;技术的迅速普及&#xff0c;操作系统正面临前所未有的变革需求。在这个背景下&#xff0c;华为公司自主研发的鸿蒙操作系统&#xff08…

idea maven 打包 内存溢出 报 GC overhead limit exceeded -> [Help 1]

idea 使用maven打包 报GC overhead limit exceeded -> [Help 1] 解决方法&#xff1a; 打开settings -> 点开如同所示 将 vm Options 参数 设为 -Xmx8g

双链表算法库构建

v1.0 : 模仿贺利坚老师, 进行基本构建 贺老师链接:数据结构之自建算法库——双链表_双链表画法-CSDN博客 我的解析博客:双链表的存储结构_p (*q)->next;-CSDN博客 库函数: //(1)初始化双链表 void InitDoubleLinkList(DoubleLinkList *&L);//(2)输出双链表 void Dispal…

Pots(DFS BFS)

//新生训练 #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef pair<int, int> PII; const int N 205; int n, m; int l; int A, B, C; int dis[N][N];struct node {int px, py, op…