第9章 CURD操作与MemoryCache缓存的强制清理的实现
1 重构 Data.Repository<TEntity>
using Core.Caching;
using Core.Domain;
using Core.Events;
using Microsoft.EntityFrameworkCore;
namespace Data
{
///<typeparam name="TEntity">泛型类型实例(这里特指:1个指定实体的类型实例)。</typeparam>
/// <summary>
/// 【仓储--类】
/// <remarks>
/// 摘要:
/// 通过该类中的泛型方法成员实例,为指定实体的CURD操作提供方法支撑。
/// </remarks>
/// </summary>
public class Repository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity
{
#region 变量--私有/保护
private readonly IEventPublisher _eventPublisher;
private readonly EFCoreContext _context;
private readonly IStaticCacheManager _staticCacheManager;
#endregion
#region 拷贝构造方法
/// <param name="context">EFCore上下文类的1个指定实例 。</param>
/// <param name="staticCacheManager">分布式缓存接口实例。</param>
/// <summary>
/// 【拷贝构造方法】
/// <remarks>
/// 摘要:
/// 通过拷贝构造方法,对当前类中的同名变量成员进行实例化。
/// </remarks>
/// </summary>
public Repository(IEventPublisher eventPublisher,
EFCoreContext context,
IStaticCacheManager staticCacheManager)
{
_eventPublisher = eventPublisher;
_context = context;
_staticCacheManager = staticCacheManager;
}
#endregion
#region 属性--接口实现
/// <summary>
/// 【表】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定实体的可查询接口(IQueryable)的1个指定实例,该实例中存储着1个指定实体的所有实例。
/// 说明:
/// 1、IQueryable继承于IEnumerable。在此之上,增加了一些属性和扩展方法。但是,关键不在这些属性和方法上,而是Queryable实现了革命性的新行为特性。
/// 2、IQueryable革命性的特性是且有"延迟加载(lazy loading)特性,可查询接口(IQueryable)的1个指定实例在内存中没有任何的实例数据,只调用该实例的ToList/ToListAsync方法才能把实例数据加载的内存中。
/// </remarks>
/// </summary>
public IQueryable<TEntity> Table => _context.GetDbSet<TEntity>().AsQueryable();
#endregion
#region 方法--私有/保护
/// <param name="getAllAsync">1个具有返回值的泛型异步委托方法实例,该泛型异步委托方法实例用于获取1个指定实体的所有实例。</param>
/// <param name="getCacheKey">1个具有返回值的委托方法实例,委托方法实例用于获取缓存键类的1个指定实例。</param>
/// <summary>
/// 【异步获取实体】
/// <remarks>
/// 摘要:
/// 直接从指定表中1个指定实体的所有实例;或从分布式缓存数据库获取1个指定实体的所有实例,并把所有实例存储到列表实例中。
/// </remarks>
/// <returns>
/// 列表实例,该实例存储着1个指定实体的所有实例。
/// </returns>
/// </summary>
protected virtual async Task<IList<TEntity>> GetEntitiesAsync(Func<Task<IList<TEntity>>> getAllAsync, Func<IStaticCacheManager, CacheKey> getCacheKey)
{
//如果不存在缓存键实例,则直接从持久化表中获取1个指定实体的所有实例。
if (getCacheKey == null)
return await getAllAsync();
//如果存在缓存键实例,则从分布式缓存数据库获取1个指定实体的所有实例。
var cacheKey = getCacheKey(_staticCacheManager)
?? _staticCacheManager.PrepareKeyForDefaultCache(EntityCacheDefaults<TEntity>.AllCacheKey);
return await _staticCacheManager.GetAsync(cacheKey, getAllAsync);
}
/// <param name="query">以“IQueryable”实例进行存储的1个指定类型的数据源(枚举数接口实例=长串型,包含:数组、列表、字典等)。</param>
/// <param name="includeDeleted">指示是否包含指定实体中所有的逻辑删除项。</param>
/// <summary>
/// 【逻辑删除过滤】
/// <remarks>
/// 摘要:
/// 获取指定实体中所有的实例或未被逻辑删除的所有实例。
/// 说明:
/// 1、由于政策因素,一些数据不能进行物理删除,只能进行逻辑删除,但以要在数据加载时,只加载非逻辑删除实例,达到减少内存消耗目标。
/// 2、逻辑删除实例只具有数据纪录作用,而在渲染显示时已经无任何的意义,所以必须对处于逻辑删除状态的实例进行过滤。
/// 3、在实际网站中,所有的数据都财富和资本,所以程序中只调用逻辑联删除而不调用物理删除。
/// </remarks>
/// <returns>
/// 1个指定实体的可查询接口(IQueryable)实例,该实例中存储着1个指定实体的所有的实例或未被逻辑删除的所有实例。
/// </returns>
/// </summary>
protected virtual IQueryable<TEntity> AddDeletedFilter(IQueryable<TEntity> query, in bool includeDeleted)
{
if (includeDeleted)
return query;
if (typeof(TEntity).GetInterface(nameof(ISoftDeletedEntity)) == null)
return query;
return query.OfType<ISoftDeletedEntity>().Where(entry => !entry.Deleted).OfType<TEntity>();
}
#endregion
#region 方法--接口实现
/// <param name="func">1个具有返回值的泛型委托方法实例,该泛型委托方法实例用于获取1个指定实体的1/n个实例。</param>
/// <param name="getCacheKey">1个具有返回值的委托方法实例,委托方法实例用于获取缓存键类的1个指定实例。</param>
/// <param name="includeDeleted">指示是否包含指定实体中所有的逻辑删除项,默认值:true,即指定实体的所有实例。</param>
/// <summary>
/// 【异步获取所有实例】
/// <remarks>
/// 摘要:
/// 以异步操作方式,直接从数据库的指定表中或缓存数据库中获取1个指定实体的所有实例,并把这些实例存储到1个列表实例中。
/// </remarks>
/// <returns>
/// 1个列表实例,该实例存储着1个指定实体的所有实例。
/// </returns>
/// </summary>
public virtual async Task<IList<TEntity>> GetAllAsync(Func<IQueryable<TEntity>, IQueryable<TEntity>> func = null, Func<IStaticCacheManager, CacheKey> getCacheKey = null, bool includeDeleted = true)
{
async Task<IList<TEntity>> getAllAsync()
{
var query = AddDeletedFilter(Table, includeDeleted);
query = func != null ? func(query) : query;
return await query.ToListAsync();
}
return await GetEntitiesAsync(getAllAsync, getCacheKey);
}
/// <param name="id">1个指定的长整型编号值。</param>
/// <param name="getCacheKey">1个具有返回值的委托方法实例,委托方法实例用于获取缓存键类的1个指定实例,默认值:null,即不存在缓存键实例。</param>
/// <param name="includeDeleted">指示是否包含指定实体中所有的逻辑删除项,默认值:true,即指定实体的所有实例。</param>
/// <summary>
/// 【异步通过编号值获取】
/// <remarks>
/// 摘要:
/// 直接从指定表中1个指定实体的1个指定实例;或从分布式缓存数据库获取1个指定实体的1个指定实例(即使该实例处于逻辑删除状态,也获取该实例)。
/// </remarks>
/// <returns>
/// 返回:
/// 1个指定实体的1个指定实例。
/// </returns>
/// </summary>
public virtual async Task<TEntity> GetByIdAsync(long? id, Func<IStaticCacheManager, CacheKey> getCacheKey = null, bool includeDeleted = true)
{
//如果1个指定的长整型编号值,没有值;或该编号值为:0,则直接退出当前方法。
if (!id.HasValue || id == 0)
return null;
// 通过异步委托方法,从指定表中获取1个指定实体的1个指定实例。
async Task<TEntity> getEntityAsync()
{
return await AddDeletedFilter(Table, includeDeleted).FirstOrDefaultAsync(entity => entity.Id == Convert.ToInt32(id));
}
//如果不存在缓存键实例,则直接返回1个指定实体的1个指定实例。
if (getCacheKey == null)
return await getEntityAsync();
//如果存在缓存键实例,则把1个指定实体的1个指定实例,缓存到分布式缓存数据库中。
var cacheKey = getCacheKey(_staticCacheManager)
?? _staticCacheManager.PrepareKeyForDefaultCache(EntityCacheDefaults<TEntity>.ByIdCacheKey, id);
//从分布式缓存数据库返回1个指定实体的1个指定实例。
return await _staticCacheManager.GetAsync(cacheKey, getEntityAsync);
}
/// <param name="entity">列表实例,该实例存储着指定实体的1/n个指定实例。</param>
/// <param name="publishEvent">指示在指定实体的1个指定实例持久化更新操作成功后,是否从缓存数据库中强制移除与该实体相关的缓存项,默认值:true,即从缓存数据库中强制移除与该实体相关的缓存项。</param>
/// <summary>
/// 【异步插入】
/// <remarks>
/// 摘要:
/// 把指定实体的1/n个指定实例持久化插入到指定表中后,并从缓存数据库中移除与该实体相关的所有缓存项。
/// </remarks>
/// </summary>
public virtual async Task InsertAsync(TEntity entity, bool publishEvent = true)
{
if (entity == null)
throw new ArgumentNullException(nameof(entity));
await _context.GetDbSet<TEntity>().AddAsync(entity);
await _context.SaveChangesAsync();
//在插入操作执行后,从分布式缓存数据为中强制移除指定体相关的所有缓存项,从而缓存数据库重新缓存加载指定实体的所有实例,最终避免该实体的列表出现渲染显示异常。
if (publishEvent)
await _eventPublisher.EntityInsertedAsync(entity);
}
/// <param name=" entities">列表实例,该实例存储着指定实体的1/n个指定实例。</param>
/// <param name="publishEvent">指示在指定实体的1个指定实例持久化更新操作成功后,是否从缓存数据库中移除与该实体相关的缓存项,默认值:true,即从缓存数据库中移除与该实体相关的缓存项。</param>
/// <summary>
/// 【异步插入】
/// <remarks>
/// 摘要:
/// 把指定实体的1/n个指定实例持久化插入到指定表中后,并从缓存数据库中移除与该实体相关的所有缓存项。
/// </remarks>
/// </summary>
public virtual async Task InsertAsync(IList<TEntity> entities, bool publishEvent = true)
{
if (entities == null)
throw new ArgumentNullException(nameof(entities));
_context.GetDbSet<TEntity>().AddRange(entities);
await _context.SaveChangesAsync();
//如果不存在触发器实例,则直接退出当前方法。
if (!publishEvent)
return;
//如果存在触发器实例,从分布式缓存数据为中强制移除指定体相关的所有缓存项。
foreach (var entity in entities)
await _eventPublisher.EntityInsertedAsync(entity);
}
/// <param name="entity">指定实体的1个指定实例。</param>
/// <param name="publishEvent">指示在指定实体的1个指定实例持久化更新操作成功后,是否从缓存数据库中移除与该实体相关的缓存项,默认值:true,即从缓存数据库中移除与该实体相关的缓存项。</param>
/// <summary>
/// 【异步更新】
/// <remarks>
/// 摘要:
/// 把指定实体的1个指定实例持久化更新到指定表中后,并从缓存数据库中移除与该实体相关的所有缓存项。
/// </remarks>
/// </summary>
public virtual async Task UpdateAsync(TEntity entity, bool publishEvent = true)
{
if (entity == null)
throw new ArgumentNullException(nameof(entity));
_context.GetDbSet<TEntity>().Update(entity);
await _context.SaveChangesAsync();
//在更新操作执行后,从分布式缓存数据为中强制移除指定体相关的所有缓存项。
if (publishEvent)
await _eventPublisher.EntityUpdatedAsync(entity);
}
/// <param name=" entities">列表实例,该实例存储着指定实体的1/n个指定实例。</param>
/// <param name="publishEvent">指示在指定实体的1个指定实例持久化更新操作成功后,是否从缓存数据库中移除与该实体相关的缓存项,默认值:true,即从缓存数据库中移除与该实体相关的缓存项。</param>
/// <summary>
/// 【异步更新】
/// <remarks>
/// 摘要:
/// 把指定实体的1/n个指定实例持久化更新到指定表中后,并从缓存数据库中移除与该实体相关的所有缓存项。
/// </remarks>
/// </summary>
public virtual async Task UpdateAsync(IList<TEntity> entities, bool publishEvent = true)
{
if (entities == null)
throw new ArgumentNullException(nameof(entities));
if (entities.Count == 0)
return;
_context.GetDbSet<TEntity>().UpdateRange(entities);
await _context.SaveChangesAsync();
//如果不存在触发器实例,则直接退出当前方法。
if (!publishEvent)
return;
//如果存在触发器实例,从分布式缓存数据为中强制移除指定体相关的所有缓存项。
foreach (var entity in entities)
await _eventPublisher.EntityUpdatedAsync(entity);
}
/// <param name="entity">指定实体的1个指定实例。</param>
/// <param name="publishEvent">指示在指定实体的1个指定实例持久化更新操作成功后,是否从缓存数据库中移除与该实体相关的缓存项,默认值:true,即从缓存数据库中移除与该实体相关的缓存项。</param>
/// <summary>
/// 【异步删除】
/// <remarks>
/// 摘要:
/// 把指定实体的1个指定实例从指定表中物理删除后,并从缓存数据库中移除与该实体相关的所有缓存项。
/// </remarks>
/// </summary>
public virtual async Task DeleteAsync(TEntity entity, bool publishEvent = true)
{
switch (entity)
{
case null:
throw new ArgumentNullException(nameof(entity));
case ISoftDeletedEntity softDeletedEntity:
softDeletedEntity.Deleted = true;
_context.GetDbSet<TEntity>().Update(entity);
await _context.SaveChangesAsync();
break;
default:
_context.GetDbSet<TEntity>().Remove(entity);
await _context.SaveChangesAsync();
break;
}
//如果存在触发器实例,从分布式缓存数据为中强制移除指定体相关的所有缓存项。
if (publishEvent)
await _eventPublisher.EntityDeletedAsync(entity);
}
/// <param name="entities">列表实例,该实例存储着指定实体的1/n个指定实例。</param>
/// <param name="publishEvent">指示在指定实体的1个指定实例持久化更新操作成功后,是否从缓存数据库中移除与该实体相关的缓存项,默认值:true,即从缓存数据库中移除与该实体相关的缓存项。</param>
/// <summary>
/// 【异步删除】
/// <remarks>
/// 摘要:
/// 把指定实体的1/n个指定实例从指定表中物理删除后,并从缓存数据库中移除与该实体相关的所有缓存项。
/// </remarks>
/// </summary>
public virtual async Task DeleteAsync(IList<TEntity> entities, bool publishEvent = true)
{
if (entities == null)
throw new ArgumentNullException(nameof(entities));
if (entities.OfType<ISoftDeletedEntity>().Any())
{
foreach (var entity in entities)
{
if (entity is ISoftDeletedEntity softDeletedEntity)
{
softDeletedEntity.Deleted = true;
_context.GetDbSet<TEntity>().Update(entity);
await _context.SaveChangesAsync();
}
}
}
else
{
_context.GetDbSet<TEntity>().RemoveRange(entities);
await _context.SaveChangesAsync();
}
//如果不存在触发器实例,则直接退出当前方法。
if (!publishEvent)
return;
//如果存在触发器实例,从分布式缓存数据为中强制移除指定体相关的所有缓存项。
foreach (var entity in entities)
await _eventPublisher.EntityDeletedAsync(entity);
}
#endregion
}
}
2 Web.Controllers.CacheController
using Core.Domain.Customers;
using Data;
using Microsoft.AspNetCore.Mvc;
namespace Web.Controllers
{
public class CacheController : Controller
{
private readonly IRepository<Role> _repositoryRole;
public CacheController(IRepository<Role> repositoryRole)
{
_repositoryRole = repositoryRole;
}
public async Task<IActionResult> Index()
{
//IList<Role> _roleList = await _repositoryRole.GetAllAsync(query => { return query; }, null);
//如果cache => default不为:null,那么在添加实例时必须触发指定实例所有相关缓存的清理操作,列表实例会由继续调用中以前所缓存的数据(不包含新添加的实例),从而导致新添加的实例不能在列表视图中渲染显示出来。
//如果cache => default为:null,则直接从数据库指定表中获取数据,所以不存在上述问题。
IList<Role> _roleList = await _repositoryRole.GetAllAsync(query => { return query; }, cache => default);
return View(_roleList);
}
public IActionResult Create()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Create(Role model)
{
model.Active = true;
await _repositoryRole.InsertAsync(model);
return RedirectToAction("Index");
}
public async Task<IActionResult> Edit(long id)
{
Role _role = await _repositoryRole.GetByIdAsync(id, cache => default);
return View(_role);
}
[HttpPost]
public async Task<IActionResult> Edit(Role model)
{
await _repositoryRole.UpdateAsync(model);
return RedirectToAction("Index");
}
public async Task<IActionResult> Delete(long id)
{
//由于“_role”实例用于物理删除操作,所以“GetByIdAsync”方法不用包含“cache => default”参数实例。
Role _role = await _repositoryRole.GetByIdAsync(id);
await _repositoryRole.DeleteAsync(_role);
return RedirectToAction("Index");
}
public async Task<IActionResult> CreateTen()
{
List<Role> _roleList =new List<Role>();
for(int i = 0; i < 10; i++)
{
Role _role = new Role() { Name="RoleTen", Active=true, Remark=$"Remark_{i}"};
_roleList.Add(_role);
}
await _repositoryRole.InsertAsync(_roleList);
return RedirectToAction("Index");
}
public async Task<IActionResult> EditTen()
{
//由于是批量编辑操作,所以“GetAllAsync”方法不用包含“cache => default”参数实例。
IList<Role> _roleList = await _repositoryRole.GetAllAsync(query => { return query.Where(role=>role.Name.Equals("RoleTen"));});
for (int i = 0; i < _roleList.Count; i++)
{
_roleList[i].Remark += "_Edit";
}
await _repositoryRole.UpdateAsync(_roleList);
return RedirectToAction("Index");
}
public async Task<IActionResult> DeleteTen()
{
//由于是批量删除操作,所以“GetAllAsync”方法不用包含“cache => default”参数实例。
IList<Role> _roleList = await _repositoryRole.GetAllAsync(query => { return query.Where(role => role.Name.Equals("RoleTen")); });
await _repositoryRole.DeleteAsync(_roleList);
return RedirectToAction("Index");
}
}
}
对以上功能更为具体实现和注释见230510_009ShopRazor(CURD操作与MemoryCache缓存的强制清理的实现)。
相关文章:

第9章 CURD操作与MemoryCache缓存的强制清理的实现
1 重构 Data.Repository<TEntity> using Core.Caching; using Core.Domain; using Core.Events; using Microsoft.EntityFrameworkCore; namespace Data { ///<typeparam name"TEntity">泛型类型实例(这里特指:1个指定实体的类型实例)。</typepa…...

TCP 协议特性详解
TCP 协议特性总结 TCP协议特点TCP协议段格式TCP原理确认应答(安全机制)超时重传(安全机制)连接管理(安全机制)(面试高频题)三次握手四次挥手 滑动窗口(效率机制)流量控制(…...

电子招投标采购系统源码:采购过程更规范,更透明
满足采购业务全程数字化, 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的全过程管理。 电子招标采购,是指在网上寻源和采购产品和服务的过程。对于企业和企业主来说,这是个既省钱又能提高供应链效率的有效方法…...

一篇了解智慧网关
智慧网关是指基于互联网技术的智能网关,能够连接不同的物联网设备和传感器,实现数据采集、信息传递、远程控制、通信管理等功能。作为物联网架构中的核心设备之一,智慧网关在智能家居、智慧城市、智能制造、智能交通、智能农业等领域得到了广…...

自学软件测试,从10K到40K的技术路线,也就是这些东西...
如果有一天我从梦中醒来时,发现自己的几年自动化测试工程师经验被抹掉,重新回到了一个小白的状态。我想要重新自学自动化测试,然后找到一份自己满意的测试工作,我想大概只需要6个月的时间就够了,如果比较顺利的话&…...

Qt libqrencode二维码——QtWidgets
前言 之前写过二维码的程序,但是在U盘上,没带,又重新找的网上资料写的。 网上二维码的生成,大多用到是第三方库libqrencode,这也一样: 效果图 本来是个动图的,都被和谐了,所以换成截图&…...

KDZD绝缘子表面电导盐密度测试仪
一、简介 智能电导盐密测试仪,也称为直读式等值盐密度测试仪,专为测试智能电导盐密度而设计。系统内置智能电导盐密度计算公式,读数直观。 人机交互采用真彩TFT液晶屏,操作简单,测试参数和结果一目了然。仪器自带微型打…...

如何降低电动汽车软件的开发成本和风险?
大多数的汽车制造商无法从销售电动汽车(EV)中获得利润,但计划快速进入市场的电动汽车初创公司是无法承担这样的损失的。 由于飙升的电池价格、高昂的组件成本和低迷的销量削弱了盈利能力,电动汽车初创公司必须将视线转到软件开发…...

使用pytest和allure框架实现自动化测试报告优化
目录 -x出现一条测试用例失败就退出测试 生成测试报告json pytest: 需要安装pytest和pytest-html(生成html测试报告) pip install pytest 和 pip install pytest-html 命名规则 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头…...

chatGPT免费站点分享
下面的应该都能用,试试吧... ChatGPT是一种人工智能聊天机器人,能够生成虚拟语言和交互回复。使用ChatGPT,您可以与机器人进行真实的交互,让机器人根据您提出的问题或请求来生成回复。但是,在使用ChatGPT时࿰…...

【计算机网络】已知一个/27网络中有一个地址是 167.199.170.82,问这个网络的网络掩码,网络前缀长度和网络后缀长度是多少?网络前缀是多少?
目录 题: 1. 网络掩码 2.网络前缀长度 3.网络前缀 4.网络后缀长度 题: 已知一个/27网络中有一个地址是 167.199.170.82, 问这个网络的网络掩码,网络前缀长度和网络后缀长度是多少?网络前缀是多少? 1.…...

Java8 - Stream
介绍 Java8中有两大最为重要的改变。第一个是 Lambda 表达式; 另外一个则是 Stream API(java.util.stream.*)。Stream是 Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream …...

什么样的冷链保温箱,既环保又实用?
冷链物流运输已经应用在了很多行业中,作为冷链物流运输中的重要设备——冷链保温箱,起到了举足轻重的作用。如果选择不当,选到了劣质产品,尤其是化学行业或者食品行业,就有可能造成试剂失效或者是影响粮食食品安全问题…...

Eclipse的介绍与安装
Eclipse简介 Eclipse 是一个开放源代码的,基于 Java 的可扩展开发平台。Eclipse官方版是一个集成开发环境(IDE),可以通过安装不同的插件实现对其它计算机语言编辑开发,如C、Php、Python等等。 Eclipse的下载 下载时需要访问网址 http://…...

<IBM AIX> 《AIX中HA的网卡IP确认方法》
《HA网卡确认方法》 1 HA IP地址类型2HA IP地址设置原则3 HA网卡日常查看方法3.1 查看hosts文件3.2 查看网卡和IP 4 通过命令方式直接查看5 直接查看HA配置4 HA网卡SMIT查看方法(暂不完整)4.1 根据hosts文件确认IP对应的别名4.2 根据serviceIP确认Persis…...

AMB300系列母线槽红外测温解决方案某锂电厂房项目案例分享
安科瑞 耿敏花 一、 行业背景 近年来,在国家政策引导与技术革新驱动的双重作用下,锂电产业保持快速增长态势,产业规模持续扩大,同时新能源产业工厂锂电池生产线对于电的依赖性很高,因而对供电设备的可靠性提出…...

go语言学习——4
文章目录 Map Map map是一种特殊的数据结构:一种元素对pair的无序集合,pair的一个元素是key,对应一个value,这种结构也称为“关联数组或字典”引用类型 map声明 var map1 map[keytype] valuetype var map1 map[string] intmap可以…...

vulnhub-RAVEN:2(MYSQL-UDF提权,手工提权/工具自动提权)
镜像下载:Raven: 2 ~ VulnHub 实验环境:kali:192.168.78.128 vulnhub镜像:192.168.78.133 1、kali查看本地ip地址,以便使用nmap扫描ip段存活主机 2、nmap扫描IP段,发现靶机的IP地址为192.168.78.133 4、访问…...

如何完整地掌握一个机器学习模型
如何完整地掌握一个机器学习模型 要全面地学习、掌握一个机器学习模型,可以遵循以下步骤: 基础理论学习:了解该模型的背后数学原理和推导过程,包括假设、损失函数、优化方法等。 学习算法实现:通过查阅论文、教程或…...

Nevron Open Vision for .NET 2022.3 Crack
Nevron Open Vision for .NET 适用于 Blazor、WPF、WinForms 和 Xamarin.Mac 的领先用户界面组件 Nevron Open Vision for .NET 是一套高级 UI 组件,可帮助您从单个代码库开发功能丰富的 Web (Blazor WebAssembly) 和桌面 (WinFor…...

【Linux】冯诺依曼体系结构以及操作系统的初步认知
🏖️作者:malloc不出对象 ⛺专栏:Linux的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、冯诺依曼体系结构二、操…...

盖雅工场重磅发布「劳动力账户」,助力企业实现全面工时成本管理
2023年5月10日,亚太地区领先的劳动力管理云服务商盖雅工场宣布,在原有的智能排班和实时考勤系统基础之上,正式推出全新模块「劳动力账户」,通过为企业里的每一位员工建立劳动力账户,实现工时与成本的全面管控ÿ…...

数据结构与算法基础(青岛大学-王卓)(2)
第二弹火爆来袭中 这波是单链表的内容整理,废话不多说,上小龙虾呀(又到了龙虾季节了,哎,口水直流了~~) beautiful的分割线 文章目录 第二弹火爆来袭中这波是单链表的内容整理,废话不多说,上小龙虾呀(又到了…...

水产亚硝酸盐偏高解决办法,饮用水亚硝酸盐超标
使用常规的离子交换树脂处理含硫酸盐水中的硝酸盐是困难的。因为树脂几乎交换了水中的所有的硫酸盐后,才与水中的硝酸盐交换。也就是说,硫酸盐的存在会降低树脂对硝酸盐的去除能力。采用Tulsimer A-62MP除硝酸盐树脂优先交换硝酸盐,对硝酸盐的…...

linux 设备树详解
设备树 描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。 树的主干就是系统总线&#x…...

STM32 学习笔记_7 定时器中断:输出比较
输出比较 电机相关比较重要。 OC Output Compare(IC 是输入捕获,CC代指这两个单元),用于输出一定频率和占空比的PWM波形。 右下角四个就是CCR。只有通用计时器和高级计时器有,共用一个cnt计数器,高级计数…...

HTML购物车示例(勾选、删除、添加和结算功能)
以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID。 以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID以下…...

MySQL原理(十):主从架构
前言 上一篇介绍了 MySQL 的表分区和分库分表,这一篇将介绍主从架构相关的内容。 主从架构 常见的主从架构模式有四种: 一主多从架构:适用于读大于写的场景,采用多个从库来分担数据库系统的读压力。多主架构:适用于…...

一文了解Moonbeam智能合约
智能合约:区块链交易的基石 20世纪90年代,Nick Szabo首次提出智能合约的概念,这是一个建立在自动化、加密安全世界之上的数字化市场。在这种数字化市场中,交易和业务可以在无需信任的情况下进行,无需中间人。 以太坊…...

【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程
【加解密篇】利用HashCat解密RAR压缩包加密文件 在取证知识里挖呀挖呀挖—【蘇小沐】 文章目录 【加解密篇】利用HashCat解密RAR压缩包加密文件1.实验环境2.RAR加密压缩包 (一)john软件1.使用CMD命令: run\rar2john.exe (二&…...