谈谈 .NET8 平台中对 LiteDB 的 CRUD 操作

哪个啥!纯 C# 编写的 LiteDB 你还不会操作?

  • LiteDB 简介
  • LiteDB 安装
    • 1、同步版 LiteDB
    • 2、异步版 LiteDB.Async
  • LiteDB Studio
  • LiteDB CRUD 操作举例
    • 1、.net cli 命令创建项目
    • 2、项目添加相关 nuget 包
    • 3、改造项目结构
    • 4、改造项目代码
  • LiteDB vs SQLite 对比
    • 1、谈谈 sqlite 和 litedb 的 ACID 事务支持?
    • 2、谈谈 sqlite 和 litedb 的稳定性和可靠性?
    • 3、谈谈 sqlite 和 litedb 的应用场景?
  • LiteDB vs SQLite 性能测试

LiteDB

LiteDB 简介

LiteDB - 一个单数据文件 .NET NoSQL 文档存储。

LiteDB 是一个小巧、轻量级、快速、简单易用的 NoSQL 嵌入式数据库,它支持文档存储和查询,具有高性能、可嵌入性、跨平台等特点。

LiteDB 是一个 .NET 平台下的开源项目,它可以在 Windows、Linux、MacOS、Android、iOS 等多个平台上运行。LiteDBAPI 简单易用,支持LINQ 查询,同时还提供了一个可视化的管理工具 LiteDB Studio,方便用户进行数据库的管理和操作。

以下是 LiteDB 的一些特点和用法介绍:

  • 支持 Serverless NoSQL 文档存储和查询,类似于 MongoDB 的简单 API
  • 100% C# 代码,支持 .NET 4.5/.NETStandard 1.3/2.0,单 DLL (小于 450 kb)。
  • 支持 线程和进程安全,多线程访问,提高数据的 并发性能
  • 支持文档/操作级别的 ACID/事务索引,保证数据的一致性和查询效率。
  • 支持写失败后的 数据还原 (日志模式)
  • 支持 多种数据类型,包括字符串、整型、浮点型、日期时间、二进制数据等。
  • 支持 嵌套文档和数组,方便存储复杂数据结构。
  • 支持 LINQ 查询,方便进行数据筛选和排序。
  • 支持 数据加密和压缩,保证数据的安全性和存储效率。
  • 可使用 DES (AES) 加密算法进行数据文件加密。
  • 可使用特性或 fluent 映射 API 将你的 POCO 类映射为 BsonDocument
  • 可存储文件与流数据 (类似 MongoDBGridFS)。
  • 单数据文件存储 (类似 SQLite)。
  • 支持基于文档字段索引的快速搜索 (每个集合支持多达 16 个索引)。
  • Shell 命令行,在线版本尝试。
  • 开源,对所有人 免费(包括商业应用)。

相关文档:

  • LiteDB 项目地址,https://github.com/mbdavid/LiteDB
  • LiteDB 在线文档,https://dev.listera.top/docs/litedb/

LiteDB 安装

LiteDB 的安装和使用非常简单,只需要在项目中添加 LiteDB 的引用,就可以使用 LiteDBAPI 进行数据库的操作。

nuget 地址:

  • https://www.nuget.org/packages/LiteDB
  • https://www.nuget.org/packages/LiteDB.Async

1、同步版 LiteDB

Nuget-LiteDB

2、异步版 LiteDB.Async

Nuget-LiteDB.Async

此处我们选择 LiteDB.Async 异步版本安装。

1、命令方式安装:

  • .NET CLI
dotnet add package LiteDB.Async --version 0.1.7
  • Package Manager
NuGet\Install-Package LiteDB.Async --version 0.1.7

2、项目 Package 包依赖引用:

dotnet add package LiteDB.Async
  • 或者添加 Package 包引用
<PackageReference Include="LiteDB.Async" Version="0.1.7" />

3、还可以从 NuGet 安装:

Install-Package LiteDB.Async

或者使用 vs 可视化窗体界面安装,如下两种方式:

nuget工具

选择 浏览 输入 LiteDB 点击搜索显示信息如下:

litedb

LiteDB Studio

同时,LiteDB 还提供了一个可视化的管理工具 LiteDB Studio,方便用户进行数据库的管理和操作。

  • 原文:A GUI tool for viewing and editing documents for LiteDB v5.
  • 译文:用于查看和编辑 LiteDB v5 文档的 GUI 工具。

这里我们选择 Shared 模式连接:

litedb-shared

输入 sql 语句执行查询操作,显示如下:

  • Grid 显示

litedb-grid

  • Text 显示

litedb-text

执行代码初始化生产的 .db 文件非常的轻量,下图所示只有 16kb

litedb文件

LiteDB Studio 项目地址:

  • https://github.com/mbdavid/LiteDB.Studio

LiteDB CRUD 操作举例

1、.net cli 命令创建项目

这里我们模拟 WeatherForecast(天气预报) 的数据为例,使用 .net cli 创建项目如下:

dotnet new webapi -o WebAppLiteDb --no-https -f net8.0

提示:执行命令前,记得安装 .net8 sdk

  • 查看 .net 信息
dotnet --info

2、项目添加相关 nuget 包

创建好模板 “ASP.NET Core Web API” 项目后,使用 Microsoft Visual Studio Community 2022 (64 位) IDE 打开项目,添加如下 nuget 包依赖:

nuget-package

项目 WebAppLiteDb 依赖的 nuget 包文件如下:

  • LiteDB.Async v0.1.7 (单纯 LiteDB 操作只需要该包即可)
  • Serilog.AspNetCore v8.0.0
  • Serilog.Sinks.LiteDB v1.0.29
  • Swashbuckle.AspNetCore v6.5.0

项目 WebAppLiteDbProject 文件如下:

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings><InvariantGlobalization>true</InvariantGlobalization></PropertyGroup><ItemGroup><PackageReference Include="LiteDB.Async" Version="0.1.7" /><PackageReference Include="Serilog.AspNetCore" Version="8.0.0" /><PackageReference Include="Serilog.Sinks.LiteDB" Version="1.0.29" /><PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /></ItemGroup><ItemGroup><Folder Include="Models\" /><Folder Include="AppData\DataBase\" /></ItemGroup></Project>

3、改造项目结构

查看项目 WebAppLiteDb 结构如下:

dotnet-csproj

4、改造项目代码

文件 Program.cs 改造如下:

using Serilog;const string OUTPUT_TEMPLATE = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} <{ThreadId}> [{Level:u3}] {Message:lj}{NewLine}{Exception}";// creates custom collection `applog`
Log.Logger = new LoggerConfiguration().MinimumLevel.Information().Enrich.FromLogContext().WriteTo.Console(outputTemplate: OUTPUT_TEMPLATE).WriteTo.LiteDB(@"WebAppLiteDb\AppData\DataBase\logs.db", logCollectionName: "applog").CreateLogger();var builder = WebApplication.CreateBuilder(args);builder.Host.ConfigureAppConfiguration((hostingContext, config) => {char b = Path.DirectorySeparatorChar; // 符号 string rootPath = hostingContext.HostingEnvironment.ContentRootPath;string configPath = $"{rootPath}{b}AppData{b}Configuration";config.SetBasePath(configPath).AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true).AddEnvironmentVariables();
}).UseSerilog(Log.Logger, dispose: true);// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();var app = builder.Build();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseAuthorization();
app.MapControllers();
app.Run();

调整模型类 WeatherForecast.cs 文件到 Models 文件夹:

namespace WebAppLiteDb.Models;public class WeatherForecast
{public Guid Id { get; set; }public DateOnly Date { get; set; }public int TemperatureC { get; set; }public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);public string? Summary { get; set; }
}

修改 appsettings.jsonappsettings.Development.json 配置文件:

  • appsettings.json
{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*"
}
  • appsettings.Development.json
{"Logging": {"LogLevel": {"Default": "Debug","Microsoft.AspNetCore": "Warning","Microsoft.Hosting.Lifetime": "Information"}}
}

Serilog 日志级别由低到高 (等级越低输出的日志信息越详细):

  • Verbose -> Debug -> Information -> Warning -> Error -> FatalILogger 对象用于记录日志,和其他日志框架差不多。

接下来我们改造控制器类文件,WeatherForecastController.cs 信息修改如下:

  • 构造函数 DI 注入日志记录器。
private readonly ILogger<WeatherForecastController> _logger;/// <summary>
/// 构造函数 DI 注入 ILogger
/// </summary>
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{_logger = logger;
}
  • 新建一个字符串集合,模拟天气情况摘要。
/// <summary>
/// 模拟天气情况摘要
/// </summary>
private static readonly string[] Summaries = new[]
{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

连接 LiteDB 的操作,此处使用的 nuget 包是 LiteDB.Async

//打开数据库,如果不存在会自动创建。
var db = new LiteDatabaseAsync(_connectionString);
//打开一个表和 MongoDB 一样的
var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));

关于 litedb-async

该库允许将异步编程技术与 LiteDb 库一起使用。它适用于需要轻量级 NoSQL 数据库或将受益于轻量级 NoSQL 数据库的 XamarinWPF 应用程序,但也不想在数据库操作发生时打开和管理大量线程或阻止 UI。
我们为您管理线程。
nuget 上可用,https://www.nuget.org/packages/LiteDB.Async/

  • 添加关于 LiteDBCRUD 操作,代码如下:
#region About LiteDB CRUD
// 此处的连接字符串是临时写法,可以放入 appsetting.json 配置文件
private static readonly string _connectionString = "Filename=AppData/DataBase/LiteDBtest.db;Connection=shared;Password=123456";
// 方便记录下面 crud 方法执行的时间
private static readonly Stopwatch _sw = new();/// <summary>
/// 单条数据添加
/// </summary>
/// <returns></returns>
[HttpPost(Name = "AddSingle")]
public async Task<Guid> AddSingleAsync()
{// 模拟数据var wf = new WeatherForecast{Id = Guid.NewGuid(),Date = DateOnly.FromDateTime(DateTime.Now.AddDays(1)),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]};_sw.Start();//打开数据库,如果不存在会自动创建。using var db = new LiteDatabaseAsync(_connectionString);//打开一个集合和 MongoDB 一样的,类似关系数据库的表。var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));var item = await collection.InsertAsync(wf);_sw.Stop();TimeSpan ts = _sw.Elapsed; _logger.LogInformation($"[AddSingle] ==> 插入一条数据:{item.AsGuid},耗时:{ts.TotalMilliseconds}ms.");return item.AsGuid;
}/// <summary>
/// 批量数据添加
/// </summary>
/// <returns></returns>
[HttpPost(Name = "AddBulk")]
public async Task<int> AddBulkAsync(int conut)
{if (conut <= 0) conut = 1000;// 模拟数据var wfs = Enumerable.Range(1, conut).Select(index => new WeatherForecast{Id = Guid.NewGuid(),Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();_sw.Start();using var db = new LiteDatabaseAsync(_connectionString);var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));int rcount = await collection.InsertBulkAsync(wfs);_sw.Stop();TimeSpan ts = _sw.Elapsed;_logger.LogInformation($"[AddBulk] ==> 批量插入数据:{ rcount },耗时:{ ts.TotalMilliseconds }ms.");return rcount;
}/// <summary>
/// Id 查询单条数据
/// </summary>
/// <param name="id">Guid</param>
/// <returns></returns>
[HttpGet(Name = "GetSingle")]
public async Task<WeatherForecast> GetSingleAsync(Guid id)
{_sw.Start();using var db = new LiteDatabaseAsync(_connectionString);var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));var item = await collection.FindOneAsync(x => x.Id == id);_sw.Stop();TimeSpan ts = _sw.Elapsed;_logger.LogInformation($"[GetSingle] ==> 查询单条数据:{item.Id},耗时:{ts.TotalMilliseconds}ms.");return item;
}/// <summary>
/// 查询所有数据
/// </summary>
/// <returns></returns>
[HttpGet(Name = "GetAll")]
public async Task<IEnumerable<WeatherForecast>> GetAllAsync()
{_sw.Start();using var db = new LiteDatabaseAsync(_connectionString);var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));var list = await collection.FindAllAsync();_sw.Stop();TimeSpan ts = _sw.Elapsed;_logger.LogInformation($"[GetAll] ==> 查询所有数据:{list.Count()},耗时:{ts.TotalMilliseconds}ms.");return list;
}/// <summary>
/// 更新数据
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
[HttpPut(Name = "UpdateSingle")]
public async Task<bool> UpdateSingleAsync([FromBody] WeatherForecast item)
{_sw.Start();using var db = new LiteDatabaseAsync(_connectionString);var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));bool isOk = await collection.UpdateAsync(item);_sw.Stop();TimeSpan ts = _sw.Elapsed;_logger.LogInformation($"[UpdateSingle] ==> 更新单条数据:{item.Id},耗时:{ts.TotalMilliseconds}ms.");return isOk;
}/// <summary>
/// 批量更新
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
[HttpPut(Name = "UpdateBulk")]
public async Task<int> UpdateBulkAsync([FromBody] List<WeatherForecast> list)
{_sw.Start();using var db = new LiteDatabaseAsync(_connectionString);var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));int rcount = await collection.UpdateAsync(list);_sw.Stop();TimeSpan ts = _sw.Elapsed;_logger.LogInformation($"[UpdateSingle] ==> 批量更新数据:{rcount},耗时:{ts.TotalMilliseconds}ms.");return rcount;
}/// <summary>
/// Id 删除单条数据
/// </summary>
/// <param name="id">Guid</param>
/// <returns></returns>
[HttpDelete(Name = "DeleteSingle")]
public async Task<bool> DeleteSingleAsync(Guid id)
{_sw.Start();using var db = new LiteDatabaseAsync(_connectionString);var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));bool isOk = await collection.DeleteAsync(id);_sw.Stop();TimeSpan ts = _sw.Elapsed;_logger.LogInformation($"[DeleteSingle] ==> 删除单条数据:{id},耗时:{ts.TotalMilliseconds}ms.");return isOk;
}/// <summary>
/// 删除所有
/// </summary>
/// <returns></returns>
[HttpDelete(Name = "DeleteAll")]
public async Task<int> DeleteAllAsync()
{_sw.Start();using var db = new LiteDatabaseAsync(_connectionString);var collection = db.GetCollection<WeatherForecast>(nameof(WeatherForecast));int rcount = await collection.DeleteAllAsync();_sw.Stop();TimeSpan ts = _sw.Elapsed;_logger.LogInformation($"[DeleteAll] ==> 删除多条数据:{rcount},耗时:{ts.TotalMilliseconds}ms.");return rcount;
}
#endregion

关于 LiteDB & LiteDB.Async 的更多操作,请查看官方文档:

  • https://github.com/mbdavid/LiteDB
  • https://github.com/mlockett42/litedb-async

到这里项目结构就改造好了,此时我来启动项目运行看看,显示如下页面:

dotnet-swagger

控制台输出日志信息如下:

dotnet-serilog

执行上面的 CRUD 方法,日志信息(这里截取部分)记录执行时间如下:

2023-12-04 15:44:18.898 <> [INF] [AddSingle] ==> 插入一条数据:052816a8-607a-4682-b673-7ad21a588528,耗时:139.1579ms.
2023-12-04 15:44:32.010 <> [INF] [AddBulk] ==> 批量插入数据:1000,耗时:284.2237ms.
2023-12-04 15:45:05.059 <> [INF] [GetSingle] ==> 查询单条数据:000660df-7e70-4c32-9734-4e657e157509,耗时:306.4881ms.
2023-12-04 15:45:13.158 <> [INF] [GetAll] ==> 查询所有数据:2001,耗时:307.4817ms.
2023-12-04 15:45:51.955 <> [INF] [DeleteSingle] ==> 删除单条数据:000660df-7e70-4c32-9734-4e657e157509,耗时:426.993ms.
2023-12-04 15:46:05.279 <> [INF] [DeleteAll] ==> 删除多条数据:2000,耗时:670.6834ms.

注意:LiteDB 单次批量数据写入是 1000 条。

说明:更新方法参数需要拼接实体模型,此处就不在拼接测试,上面的方法执行有效,感兴趣的可以自行拼接实体模型参数测试。

LiteDB vs SQLite 对比

说道 LiteDB 数据库,这里不得不提一个类似的数据库 —— SQLite,它俩数据库很类似,但是定位又各不相同:

ItemLiteDBSQLite
文件类型Single data fileSingle data file
数据库类型Serverless NoSQLServerless relational database
事务支持/ACID通过 Transaction 类来控制通过 BEGIN、COMMITROLLBACK 语句来控制
稳定性 & 性能较高
编写语言C#/CSharpC
跨平台支持
开源协议MIThttps://github.com/mbdavid/LiteDB/blob/master/LICENSEhttps://github.com/sqlite/sqlite/blob/master/LICENSE.mdhttps://www.sqlite.org/copyright.html

官方文档:

  • SQLitehttps://www.sqlite.org/
  • LiteDBhttps://www.litedb.org/

说明:下面几个对比问题均由 CSDN 平台提供的 C知道 回答,仅供参考。

1、谈谈 sqlite 和 litedb 的 ACID 事务支持?

SQLiteLiteDB 都支持 ACID 事务,其中 ACID 是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

  • SQLite 中,事务是通过 BEGIN、COMMITROLLBACK 语句来控制的。SQLite 默认使用自动提交模式,也就是说,每个 SQL语句都会被立即提交。如果需要使用事务,可以使用 BEGIN 语句来开始一个事务,使用 COMMIT 语句来提交事务,或者使用 ROLLBACK 语句来回滚事务。SQLite 支持四种隔离级别:SERIALIZABLE、REPEATABLE READ、READ COMMITTED和READ UNCOMMITTED

  • LiteDB 中,事务是通过 Transaction 类来控制的。可以使用 Transaction 类的Begin 方法来开始一个事务,使用 Commit 方法来提交事务,或者使用 Rollback 方法来回滚事务。LiteDB 支持两种隔离级别:READ UNCOMMITTED和SNAPSHOT

总的来说,SQLiteLiteDB 都支持 ACID 事务,但是 SQLite 在大型项目中可能会存在性能问题,而 LiteDB 则更适合单机小游戏等小型项目。

2、谈谈 sqlite 和 litedb 的稳定性和可靠性?

SQLiteLiteDB 都是轻量级数据库,它们的稳定性和可靠性都非常高。SQLite 是一个嵌入式数据库,它的数据存储在单个文件中,因此非常适合嵌入式设备和移动应用程序。SQLite 的稳定性和可靠性得到了广泛的认可,它已经被广泛地应用于各种应用程序中,包括谷歌的 Android 操作系统。LiteDB 是一个 .NET 平台上的嵌入式 NoSQL 文档数据库,它的数据存储在单个文件中,非常适合 .NET 应用程序。LiteDB 的稳定性和可靠性也非常高,它已经被广泛地应用于各种 .NET 应用程序中。

3、谈谈 sqlite 和 litedb 的应用场景?

litedb

SQLiteLiteDB 都是轻量级的嵌入式数据库,适用于一些小型应用场景。其中,SQLite 是一种关系型数据库,支持 SQL 语句,适用于需要高度可靠性和稳定性的应用场景,例如浏览器、操作系统等。而 LiteDB 则是一种文档型数据库,支持类似 MongoDB 的文档查询语法,适用于需要快速开发和部署的小型应用场景,例如单机小游戏、桌面应用等。

LiteDB vs SQLite 性能测试

这里有一个 LiteDB v3 版本和 SQLite 的性能测试对比。

LiteDB-Perf 项目地址,https://github.com/mbdavid/LiteDB-Perf

A simple actions to compare SQLite and LiteDB v3.

Results(测试结果):

litedb-sqlite

  • Low is better(测试结果,时间越短越好)

参数项对比说明:

ItemLiteDBSQLite
#1DefaultDefault
#2EncryptedEncrypted
#3Exclusive mode and no journalNo journal

测试主机说明:

  • 原文:Tested on MacBook Pro 2012 i5, Win10, 8Gb RAM, SSD.
  • 译文:在 MacBook Pro 2012 i5、Win10、8Gb RAM、SSD 上测试。

此处我们使用的是 LiteDB v5.x 版本,对于上面的 sqlitelitedb 性能测试,感兴趣的小伙伴可以参照上面测试例子自行测试。

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

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

相关文章

MySQl int(1)、int(20) 的区别到底在哪里

MySQl int(1)、int(20) 的区别到底在哪里 常思一二&#xff0c;便得自然… int(1)数据类型介绍 在MySQL中&#xff0c;INT(1) 是一种定义整数类型的数据字段&#xff0c;其中的数字表示显示宽度而不是存储范围。具体说&#xff0c;INT(1) 中的数字 1 表示显示宽度&#xff0…

高级搜索——ST表,离线RMQ问题

文章目录 前言可重复贡献问题ST表的定义ST表的存储结构ST表的预处理预处理的实现 ST表的区间查询对于k的获取区间查询的实现 OJ链接 前言 对于查询区间最值的方法&#xff0c;我们常用的就是线段树&#xff0c;树状数组&#xff0c;单调队列&#xff0c;而树状数组更适合用于快…

【互斥锁不当使用导致的条件竞争】2021_DiceCTF_hashbrown

前言 这个题目还挺有意思的&#xff0c;他并不像之前做的题目直接给你一个贴脸的 UAF 等&#xff0c;而是把 UAF 放在了条件竞争的环境下&#xff0c;其实条件竞争这个漏洞在内核中经常出现。 这里题目没有去符号&#xff0c;所以逆向的难度不是很大&#xff0c;但作者似乎在…

Android蓝牙协议栈fluoride(二) - 软件框架

概述 fluoride 协议栈在整个软件框架中作为一个中间件的角色&#xff0c;向上对接APP&#xff0c;向下对接蓝牙芯片。fluoride采用C语言实现&#xff0c;与APP(Jave)通信采用JNI机制&#xff1b;与蓝牙芯片通信使用HCI硬件接口&#xff08;HCI软件协议参考蓝牙核心规范&#x…

毕设:《基于hive的音乐数据分析系统的设计与实现》

文章目录 环境启动一、爬取数据1.1、歌单信息1.2、每首歌前20条评论1.3、排行榜 二、搭建环境1.1、搭建JAVA1.2、配置hadoop1.3、配置Hadoop环境&#xff1a;YARN1.4、MYSQL1.5、HIVE(数据仓库)1.6、Sqoop&#xff08;关系数据库数据迁移&#xff09; 三、hadoop配置内存四、导…

FFA 2023 明日开幕,Flink 智能诊断、小红书流批一体实践精彩来袭

近年来&#xff0c;流批一体的技术思想势头火热&#xff0c;即“将批处理和流处理相结合&#xff0c;实现更好的数据处理能力”&#xff0c;已成功从理论层面走进现实世界。Flink 是一款高吞吐量、低延迟的流处理引擎&#xff0c;具备统一接口、高性能、低延迟、容错性和可扩展…

绑定域名简单教程

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f324;️安装Nginx环境 &…

2024黑龙江省职业院校技能大赛信息安全管理与评估赛项规程

2024黑龙江省职业院校技能大赛暨国赛选拔赛 “GZ032信息安全管理与评估”赛项规程 极安云科专注技能竞赛&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;及各大CTF&#xff0c;基于两大赛项提供全面的系统性培训&#xff0c;拥有完整的培训体系。团队…

【Qt开发流程】之元对象系统

描述 Qt的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架的核心机制之一&#xff0c;它提供了运行时类型信息&#xff08;RTTI&#xff09;和信号与槽&#xff08;Signals and Slots&#xff09;机制的支持。元对象系统在Qt中扮演了很重要的角色&#xff0c;它…

适合炎热天气的最佳葡萄酒有哪些?

每年的夏天&#xff0c;白葡萄酒和玫瑰红葡萄酒总会是葡萄酒爱好者的首选&#xff0c;这是为什么呢&#xff1f;随着春天的逝去&#xff0c;夏天悄悄地到来&#xff0c;空气变得炎热和沉重&#xff0c;树木变得越来越郁郁葱葱&#xff0c;白天的时间更长而晴朗了。多雨的五月变…

12.7作业

1. #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//***********窗口相关设置***********//设置窗体大小this->resize(540,410);this->setFixedSize(540,410);//取消菜单栏this->setWindowFlag(Qt::FramelessWindowHint);/…

SuperMap iObject.NET三维场景拖拽框选实现详解及完整源代码(一)——环境准备及项目配置

作者&#xff1a;超图研究院技术支持中心-于丁1 SuperMap iObject.NET三维场景拖拽框选实现详解及完整源代码&#xff08;一&#xff09;——环境准备及项目配置   三维场景框选是一种在三维空间中进行选择和操作的功能&#xff0c;它可以让使用者通过鼠标拖动来创建一个矩形…

Verilog学习 | 用initial语句写出固定的波形

initial beginia 0;ib 1;clk 0;#10ia 1; #20ib 0;#20ia 0; endalways #5 clk ~clk; 或者 initial clk 0;initial beginia 0;#10ia 1; #40ia 0; endinitial beginib 1;#30 ib 0; endalways #5 clk ~clk;

新书推荐——《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》

《Copilot和ChatGPT编程体验&#xff1a;挑战24个正则表达式难题》呈现了两方竞争的格局。一方是专业程序员David Q. Mertz&#xff0c;是网络上最受欢迎的正则表达式教程的作者。另一方则是强大的AI编程工具OpenAI ChatGPT和GitHub Copilot。 比赛规则如下&#xff1a;David编…

基于jsp+servlet的在线考试系统

基于jspservlet的在线考试系统, 演示地址:英语在线考试系统考生测试账号:用户名:stu,密码:stu,管理员测试账号用户名:admin,密码:admin &#xff08;源码里包含数据库文件&#xff09; 本系统分为两个角色&#xff0c;一个时考生&#xff0c;一个是管理员&#xff0c;考生可…

架构师一1.功能权限

1. RBAC 权限模型 系统采用 RBAC 权限模型&#xff0c;全称是 Role-Based Access Control 基于角色的访问控制。 简单来说&#xff0c;每个用户拥有多个角色&#xff0c;每个角色拥有多个菜单&#xff0c;菜单中存在菜单权限、按钮权限。这样&#xff0c;就形成了 “用户<-…

第二十一章网络通信总结博客

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

Linux 环境变量 与 命令行参数

什么是环境变量 从结构上来看&#xff0c;环境变量就是操作系统维护的一组&#xff1a;key-value 的键值对。 不知道你是否有一个疑问&#xff1a;为什么我们写代码编译链接 形成的可执行程序要运行起来需要带路径呢&#xff1f;Linux 内置的命令也是可执行程序&#xff0c;为…

html刷题笔记

1 em 12 pt 16 px 100% source元素为audio、video、picture元素指定多个媒体文件 margin是用来隔开元素与元素的间距&#xff1b;padding是用来隔开元素与内容的间隔。 margin用于布局分开元素使元素与元素互不相干&#xff1b;padding用于元素与内容之间的间隔&#xff0c;…