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

第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个指定实体的所有实例。

        /// 说明:

        ///     1IQueryable继承于IEnumerable。在此之上,增加了一些属性和扩展方法。但是,关键不在这些属性和方法上,而是Queryable实现了革命性的新行为特性。

        ///     2IQueryable革命性的特性是且有"延迟加载(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原理确认应答&#xff08;安全机制&#xff09;超时重传&#xff08;安全机制&#xff09;连接管理&#xff08;安全机制&#xff09;(面试高频题)三次握手四次挥手 滑动窗口&#xff08;效率机制&#xff09;流量控制&#xff08…...

电子招投标采购系统源码:采购过程更规范,更透明

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

一篇了解智慧网关

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

自学软件测试,从10K到40K的技术路线,也就是这些东西...

如果有一天我从梦中醒来时&#xff0c;发现自己的几年自动化测试工程师经验被抹掉&#xff0c;重新回到了一个小白的状态。我想要重新自学自动化测试&#xff0c;然后找到一份自己满意的测试工作&#xff0c;我想大概只需要6个月的时间就够了&#xff0c;如果比较顺利的话&…...

Qt libqrencode二维码——QtWidgets

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

KDZD绝缘子表面电导盐密度测试仪

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

如何降低电动汽车软件的开发成本和风险?

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

使用pytest和allure框架实现自动化测试报告优化

目录 -x出现一条测试用例失败就退出测试 生成测试报告json pytest&#xff1a; 需要安装pytest和pytest-html(生成html测试报告&#xff09; pip install pytest 和 pip install pytest-html 命名规则 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头…...

chatGPT免费站点分享

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

【计算机网络】已知一个/27网络中有一个地址是 167.199.170.82,问这个网络的网络掩码,网络前缀长度和网络后缀长度是多少?网络前缀是多少?

目录 题&#xff1a; 1. 网络掩码 2.网络前缀长度 3.网络前缀 4.网络后缀长度 题&#xff1a; 已知一个/27网络中有一个地址是 167.199.170.82&#xff0c; 问这个网络的网络掩码&#xff0c;网络前缀长度和网络后缀长度是多少&#xff1f;网络前缀是多少&#xff1f; 1.…...

Java8 - Stream

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

什么样的冷链保温箱,既环保又实用?

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

Eclipse的介绍与安装

Eclipse简介 Eclipse 是一个开放源代码的&#xff0c;基于 Java 的可扩展开发平台。Eclipse官方版是一个集成开发环境(IDE)&#xff0c;可以通过安装不同的插件实现对其它计算机语言编辑开发&#xff0c;如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查看方法&#xff08;暂不完整&#xff09;4.1 根据hosts文件确认IP对应的别名4.2 根据serviceIP确认Persis…...

AMB300系列母线槽红外测温解决方案某锂电厂房项目案例分享

安科瑞 耿敏花 一、 行业背景 近年来&#xff0c;在国家政策引导与技术革新驱动的双重作用下&#xff0c;锂电产业保持快速增长态势&#xff0c;产业规模持续扩大&#xff0c;同时新能源产业工厂锂电池生产线对于电的依赖性很高&#xff0c;因而对供电设备的可靠性提出…...

go语言学习——4

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

vulnhub-RAVEN:2(MYSQL-UDF提权,手工提权/工具自动提权)

镜像下载&#xff1a;Raven: 2 ~ VulnHub 实验环境&#xff1a;kali&#xff1a;192.168.78.128 vulnhub镜像&#xff1a;192.168.78.133 1、kali查看本地ip地址&#xff0c;以便使用nmap扫描ip段存活主机 2、nmap扫描IP段&#xff0c;发现靶机的IP地址为192.168.78.133 4、访问…...

如何完整地掌握一个机器学习模型

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

Nevron Open Vision for .NET 2022.3 Crack

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

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

6.9本日总结

一、英语 复习默写list11list18&#xff0c;订正07年第3篇阅读 二、数学 学习线代第一讲&#xff0c;写15讲课后题 三、408 学习计组第二章&#xff0c;写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语&#xff1a;复习l默写sit12list17&#…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...

el-amap-bezier-curve运用及线弧度设置

文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 ‌el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。‌ 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...