第8章 未执行缓存的强制清理操作导致显示异常解决方案

1 异常产生原因:

    由于未为Role实体定义相就的缓存强制销毁器类:Services.Customers.Caching.RoleCacheEventConsumer,从而导致Services.Events.EventPublisher.PublishAsync<TEvent>(TEvent @event)中的 consumers实例为0,如下图所示:

 2 Core.Events.EntityInsertedEvent

using Core.Domain;

namespace Core.Events

{

    /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

    /// <summary>

    /// 【实体插入事件--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类的属性成员在指定实体的1个实例执行持久化插入操作后,为实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免指定实体的列表渲染显示出现的异常。

    /// </remarks>

    /// </summary>

    public class EntityInsertedEvent<T> where T : BaseEntity

    {

        #region 拷贝构造方法

        /// <param name="entity">指定实体的1个指定实例。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     拷贝构造方法通过其参数实例,实例化该类中同一类型的属性成员。

        /// </remarks>

        /// </summary>

        public EntityInsertedEvent(T entity)

        {

            Entity = entity;

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【实体】

        /// <remarks>

        /// 摘要:

        ///     获取指定实体的1个指定实例。

        /// </remarks>

        /// </summary>

        public T Entity { get; }

        #endregion

    }

}

3 Core.Events.EntityUpdatedEvent

using Core.Domain;

namespace Core.Events

{

    /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

    /// <summary>

    /// 【实体更新事件--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类的属性成员在指定实体的1个实例执行持久化更新操作后,为实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免指定实体的列表渲染显示出现的异常。

    /// </remarks>

    /// </summary>

    public class EntityUpdatedEvent<T> where T : BaseEntity

    {

        #region 拷贝构造方法

        /// <param name="entity">指定实体的1个指定实例。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     拷贝构造方法通过其参数实例,实例化该类中同一类型的属性成员。

        /// </remarks>

        /// </summary>

        public EntityUpdatedEvent(T entity)

        {

            Entity = entity;

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【实体】

        /// <remarks>

        /// 摘要:

        ///     获取指定实体的1个指定实例。

        /// </remarks>

        /// </summary>

        public T Entity { get; }

        #endregion

    }

}

4 Core.Events. EntityDeletedEvent

using Core.Domain;

namespace Core.Events

{

    /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

    /// <summary>

    /// 【实体持久化/逻辑删除事件--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类的属性成员在指定实体的1个实例执行持久化/逻辑删除操作后,为实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免指定实体的列表渲染显示出现的异常。

    /// </remarks>

    /// </summary>

    public class EntityDeletedEvent<T> where T : BaseEntity

    {

        #region 拷贝构造方法

        /// <param name="entity">指定实体的1个指定实例。</param>

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     拷贝构造方法通过其参数实例,实例化该类中同一类型的属性成员。

        /// </remarks>

        /// </summary>

        public EntityDeletedEvent(T entity)

        {

            Entity = entity;

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【实体】

        /// <remarks>

        /// 摘要:

        ///     获取指定实体的1个指定实例。

        /// </remarks>

        /// </summary>

        public T Entity { get; }

        #endregion

    }

}

5 Core.Events.IEventPublisher

 namespace Core.Events

 {

    /// <summary>

    /// 【缓存移除事件触发--接口】

    /// <remarks>

    /// 摘要:

    ///     通过继承于该接口的具体实现类中的方法成员用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

    /// </remarks>

    /// </summary>

    public interface IEventPublisher

     {

        #region 方法

        /// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存的强制移除提供触发句柄)</typeparam>

        /// <param name="event">实体实例的变更事件类的1个实例,为缓存的强制移除提供触发句柄。</param>

        /// <summary>

        /// 【异步触发】

        /// <remarks>

        /// 摘要:

        ///     该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        Task PublishAsync<TEvent>(TEvent @event);

        /// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存的强制移除提供触发句柄)</typeparam>

        /// <param name="event">实体实例的变更事件类的1个实例,为缓存的强制移除提供触发句柄。</param>

        /// <summary>

        /// 【触发】

        /// <remarks>

        /// 摘要:

        ///     该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        void Publish<TEvent>(TEvent @event);

        #endregion

    }

}

6 Core.Events.EventPublisherExtensions

using Core.Domain;

namespace Core.Events

 {

    /// <summary>

    /// 【事件触发器扩展--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的成员方法以指定事件触发类的指定实例进行实例化,从而为执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项提供实例支撑。

    /// </remarks>

    /// </summary>

    public static class EventPublisherExtensions

     {

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【异步实体插入】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化插入新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static async Task EntityInsertedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

         {

             await eventPublisher.PublishAsync(new EntityInsertedEvent<T>(entity));

         }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【实体插入】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化插入新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static void EntityInserted<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

         {

             eventPublisher.Publish(new EntityInsertedEvent<T>(entity));

         }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【异步实体更新】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化更新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static async Task EntityUpdatedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

         {

             await eventPublisher.PublishAsync(new EntityUpdatedEvent<T>(entity));

         }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【异步实体更新】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化更新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static void EntityUpdated<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

        {

            eventPublisher.Publish(new EntityUpdatedEvent<T>(entity));

        }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【异步实体删除】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化删除新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static async Task EntityDeletedAsync<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

        {

            await eventPublisher.PublishAsync(new EntityDeletedEvent<T>(entity));

        }

        /// <typeparam name="T">泛型类型实例(这里特指:1个指定实体的类型实例)</typeparam>

        /// <param name="eventPublisher">事件触发类的1个指定实例。</param>

        /// <param name="entity">指定实体的1/n实例。</param>

        /// <summary>

        /// 【实体删除】

        /// <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行持久化删除新操作后,执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public static void EntityDeleted<T>(this IEventPublisher eventPublisher, T entity) where T : BaseEntity

        {

            eventPublisher.Publish(new EntityDeletedEvent<T>(entity));

        }

    }

 }

7 Core.Events.IConsumer<T>

namespace Services.Events

{

    /// <typeparam name="T">泛型类型实例(这里特指:实体插入事件类的类型实例、实体更新事件类的类型实例或实体持久化/逻辑删除事件类的类型实例)</typeparam>

    /// <summary>

    /// 摘要:

    ///     通过继承于该接口具体实现类中的方法成员,在指定实体的1个实例执行插入、更新或持久化/逻辑删除操作时,为实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免指定实体的列表渲染显示出现的异常。

    /// </summary>

    public interface IConsumer<T>

    {

        /// <param name="eventMessage">实体插、更新或持久化/逻辑删除事件类的1个指定实例。</param>

        /// <summary>

        /// 【异步句柄事件】

        ///  <remarks>

        /// 摘要:

        ///     在指定实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体实例的分布式缓存的强制移除操作提供数据支撑,从而为新变更的实例缓存操作,预留出相应的内存空间。

        /// </remarks>

        /// </summary>

        Task HandleEventAsync(T eventMessage);

    }

}

8 Core.Events.EventPublisher

using Core.Events;

using Core.Infrastructure;

namespace Services.Events

{

    /// <summary>

    /// 【缓存移除事件触发--类】

    /// <remarks>

    /// 摘要:

    ///     通过该类中的方法成员用于实例化缓存项的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

    /// </remarks>

    /// </summary>

    public class EventPublisher : IEventPublisher

    {

        #region 方法--接口实现

        /// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存项的强制移除提供触发句柄)</typeparam>

        /// <param name="event">实体实例的变更事件类的1个实例,为缓存项的强制移除提供触发句柄。</param>

        /// <summary>

        /// 【异步触发】

        /// <remarks>

        /// 摘要:

        ///     该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public virtual async Task PublishAsync<TEvent>(TEvent @event)

        {

            //获取所有继承于“IConsumer”接口具体实现类的实例。

            var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();

            foreach (var consumer in consumers)

            {

                try

                {

                    //在指定实体的1个实例执行插入、更新或持久化/逻辑删除操作后,触发执行缓存项的强制移除句柄,从而移除缓存数据库中该实体所有相关的缓存项。

                    await consumer.HandleEventAsync(@event);

                }

                catch (Exception exception)

                {

                    try

                    {

                    }

                    catch

                    {

                        // ignored

                    }

                }

            }

        }

        /// <typeparam name="TEvent">泛型类型实例(这里特指:实体实例的变更事件类的类型实例,为缓存项的强制移除提供触发句柄)</typeparam>

        /// <param name="event">实体实例的变更事件类的1个实例,为缓存项的强制移除提供触发句柄。</param>

        /// <summary>

        /// 【触发】

        /// <remarks>

        /// 摘要:

        ///     该方法用于实例化缓存的强制移除句柄的实例,触发执行缓存项的强制移除句柄,从分布式缓存数据库移除1/n个缓存项。

        /// </remarks>

        /// </summary>

        public virtual void Publish<TEvent>(TEvent @event)

        {

            //获取所有继承于“IConsumer”接口具体实现类的实例。

            var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();

            foreach (var consumer in consumers)

                try

                {

                    //在指定实体的1个实例执行插入、更新或持久化/逻辑删除操作后,触发执行缓存项的强制移除句柄,从而移除缓存数据库中该实体所有相关的缓存项。

                    consumer.HandleEventAsync(@event).Wait();

                }

                catch (Exception exception)

                {

                    try

                    {

                    }

                    catch

                    {

                        // ignored

                    }

                }

        }

        #endregion

    }

}

9 Services.Customers.Caching.CacheEventConsumer

using Core.Domain.Customers;

using Services.Caching;

namespace Services.Customers.Caching

{

    /// <summary>

    /// 摘要:

    ///     通过该类中的方法成员,在角色实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免角色实体的列表渲染显示出现的异常。

    /// </summary>

    public class RoleCacheEventConsumer : CacheEventConsumer<Role>

    {

       

    }

}

注意:

    RoleCacheEventConsumer类必须被定义,且注意其具体定义内容,否则会因角色实例的分布式缓存的未被强制移除,从而导致角色实体的列表渲染显示出现的异常。

10 重构Program.cs文件

using Core.Configuration;

using Core.Infrastructure;

using Data;

using Data.Configuration;

using Microsoft.EntityFrameworkCore;

using Framework.Infrastructure.Extensions;

using Core.Caching;

using LinqToDB.DataProvider.SqlServer;

using Core.Events;

using Services.Events;

using System.Reflection;

var builder = WebApplication.CreateBuilder(args);

//如果启动项中不存在“appsettings.json”文件,则通过.Net(Core)的内置方法自动新建“appsettings.json”文件。

builder.Configuration.AddJsonFile("appsettings.json", true, true);

//把当前程序中所有继承了“IConfig”接口的具体实现类的实例,依赖注入到.Net(Core)内置依赖注入容器实例中,如果需要并把这些数据持久化存储到"appsettings.json"文件。

builder.Services.ConfigureApplicationSettings(builder);

builder.Services.AddScoped<INopFileProvider, NopFileProvider>();

builder.Services.AddSingleton<ILocker, MemoryCacheManager>();

builder.Services.AddSingleton<IStaticCacheManager, MemoryCacheManager>();

builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));

builder.Services.AddSingleton<IEventPublisher, EventPublisher>();

var typeFinder = Singleton<ITypeFinder>.Instance;

var consumers = typeFinder.FindClassesOfType(typeof(IConsumer<>)).ToList();

foreach (var consumer in consumers)

    foreach (var findInterface in consumer.FindInterfaces((type, criteria) =>

    {

        var isMatch = type.IsGenericType && ((Type)criteria).IsAssignableFrom(type.GetGenericTypeDefinition());

        return isMatch;

    }, typeof(IConsumer<>)))

        builder.Services.AddScoped(findInterface, consumer);

//注意:在动态对EntityFrameworkCore中间件进行实例化时,必须使用“AddDbContextPool” 内置方法替换“AddDbContext”内置方法,

//否则就会出现异常:“System.InvalidOperationException: The service collection cannot be modified because it is read-only”

builder.Services.AddDbContextPool<EFCoreContext>(options => {

    //从单例实例的字典成员实例中获取当前程序所有配置相关数据。

    AppSettings _appSettings = Singleton<AppSettings>.Instance;

    //从应用配置类实例中获取数据库连接相关数据。

    DataConfig _dataConfig = _appSettings.Get<DataConfig>();

    //说明:如果想要“EntityFrameworkCore”中间件支持多数据库软件,则把选择条件中的所有中间件都注入到依赖注入到.Net(Core)框架内置容器即可,

    //选择条件来限定当前程序只支持所设定的1个数据库软件,当然“DataConfig”类与“appsettings.json”文件也必须为支持多数据库软件进行重构。

    if (_dataConfig.DataProvider.ToString().Equals("sqlserver", StringComparison.InvariantCultureIgnoreCase))

    {

        //通过“DbContextOptionsBuilder”实例中的参数实例,为“Microsoft.EntityFrameworkCore.SqlServer”中间件的实例化提供参数实例,

        //最终把“Microsoft.EntityFrameworkCore.SqlServer”中间件实例,依赖注入到.Net(Core)框架内置容器中。

        //IIS发布部署连接字符串必须使用“SQL Server身份认证数据库连接方式,才能实现发布部署程序与数据库的CURD的操作。

        options.UseSqlServer(_dataConfig.ConnectionString);

    }

});

//通过AddRazorRuntimeCompilation依赖注入中间件实现页面修改热加载(Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation)

builder.Services

    .AddControllersWithViews()

    .AddRazorRuntimeCompilation();

//把具体现类和中间件注入到内置依赖注入容器后,并把.NetCore框架内置依赖注入容器接口实例所存储的当前程序中的具体现类和中间件的实例通过“Engine”(引擎)单例实例存储到单例类的字典属性成员实例中。

//注意:从依赖注入到.Net(Core)框架内置容器中,获取“IServiceProvider”接口实例,必须定义在最后,

//否则“GetServices”/“GetRequiredService”方法将有可能不能获取取1个指定类的实例,因为该类的实例还没有依赖注入到.Net(Core)框架内置容器中。

builder.Services.ConfigureApplicationServices(builder);

var app = builder.Build();

// Configure the HTTP request pipeline.

if (!app.Environment.IsDevelopment())

{

    app.UseExceptionHandler("/Home/Error");

    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.

    app.UseHsts();

}

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

/*注意:

    .net7最好不要直接使用app.UseEndpointsapp.UseMvc来集成路由匹配模式,否则会出现:“ASP0014”警告信息,

为了避免该警告信息直接使用最小APIapp.MapControllerRoute来集成路由匹配模式。

 */

app.MapControllerRoute(

        name: "areaRoute",

        pattern: $"{{area:exists}}/{{controller=Install}}/{{action=Index}}/{{id?}}");

//动态实例化EntityFrameworkCore中间件,必须把InstallRefactoring/Index设定为默认启动页面,

//否则依然会因为当前类的拷贝构造方法实例化EntityFrameworkCore中间件是在程序启动前就被实例化的,如果无数据库如果数据库连接字符串,

//那么就会因EntityFrameworkCore中间件实例中不包含数据库如果数据库连接字符串,从而造成上述异常。

app.MapControllerRoute(

      name: "default",

      pattern: "{controller=InstallRefactoring}/{action=Index}/{id?}");

// 通过.NetCore框架的内置管道接口实例,实例化“IServiceProvider”接口实例,同时把继承于“IStartup”所有具体现类中的中间件实例集成到.NetCore框架内置管道中。

app.ConfigureRequestPipeline();

app.Run();

对以上功能更为具体实现和注释见230509_008ShopRazor(未执行缓存的强制清理操作导致显示异常解决方案)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis(连接池)

SpringBoor环境下使用redis连接池 依赖&#xff1a; <dependencies><dependency><groupId>com.yugabyte</groupId><artifactId>jedis</artifactId><version>2.9.0-yb-11</version></dependency><dependency><…

SpringBoot基础篇3(SpringBoot+Mybatis-plus案例)

环境搭建&#xff1a;配置起步依赖pom.xml和配置文件application.yml 1.创建模块时&#xff0c;勾选的依赖有springMVC和MySQL驱动 2.手动添加的依赖有&#xff1a;MyBatis-plus、Druid、lombok <dependencies><dependency><groupId>org.springframework.…

行为型模式-解释器模式

解释器模式 概述 如上图&#xff0c;设计一个软件用来进行加减计算。我们第一想法就是使用工具类&#xff0c;提供对应的加法和减法的工具方法。 //用于两个整数相加 public static int add(int a,int b){return a b; }//用于两个整数相加 public static int add(int a,int …

使用护眼灯台灯哪个牌子好用来保护眼睛?真正做到护眼台灯品牌

现在的家长很多人觉得家里已经有灯光了&#xff0c;没必要在买台灯。但事实上台灯有很多优点&#xff0c;尤其对于小孩子来说&#xff1a;1.提供更好的光线:台灯能够提供更加明亮的光线&#xff0c;有助于保护眼睛健康。2.提高工作效率:台灯光线舒适可提高工作效率或学习效率。…

CPU 架构(x86/ARM)简介

CPU 架构通过指令集的方式一般可分为 复杂指令集&#xff08;CISC&#xff09; 和 精简指令集&#xff08;RISC&#xff09; 两类&#xff0c;CISC 主要是 x86 架构&#xff0c;RISC 主要是 ARM 架构&#xff0c;还有 MIPS、RISC-V、PowerPC 等架构。 本文重点介绍 x86 和 ARM…

SpringBoot整合Nacos配置中心和注册中心

一、背景 公司项目中使用的Nacos作为服务的注册中心和配置中心&#xff0c;但是呢公司的这一套Nacos是经过封装了的&#xff0c;而且封装的不是很友好&#xff0c;想着自己搭建一套标注的Nacos配置中心和服务中心 二、Nacos配置中心和注册中心搭建 2.1 依赖引入 <!--注册…

【Linux】shell编程之循环语句

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、循环语句二、for循环语句1.for 语句的结构2.for语句应用示例 三、while 循环语句1.while 循环语句结构2.while语句应用示例 四、until 循环五、跳出循环六、死循…

新品发布全线添员,九号全力奔向“红海”深处?

5月10日&#xff0c;九号公司2023新品发布会声势达到顶峰。此次发布会的看点为九号电动2023产品线的更新&#xff0c;电动家族再添多员大将。 随着人们出行选择的多样化&#xff0c;国内短途出行工具发展迎来井喷期。在传统的电动两轮车市场上&#xff0c;雅迪、爱玛等品牌仍然…

今年这面试难度,我给跪了……

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;又得准备面试了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&a…

关于cartographer建立正确关系树的理解

正确的TF关系map----odom----base_link----laser base_link是固定在机器人本体上的坐标系&#xff0c;通常选择飞控 其中map–odom 的链接是由cartographer中lua文件配置完成的 map_frame "map", tracking_frame "base_link", published_frame "b…

MySQL日志

目录 错误日志 查询日志 二进制日志 慢查询日志 redo log 和 undo log &#xff08;事务日志&#xff09; redo log&#xff1a; undo log&#xff1a; mysql> show variables like log_%; 返回所有以"log_"开头的系统变量和它们的值&#xff0c;这些变量控…

研读Rust圣经解析——Rust learn-12(智能指针)

研读Rust圣经解析——Rust learn-12&#xff08;智能指针&#xff09; 智能指针智能指针选择Box<T>使用场景创建Box使用Box在堆上存储递归类型数据解决 通过 Deref trait 将智能指针当作常规引用处理追踪指针的值创建自定义的智能指针&#xff08;*&#xff09; Deref隐式…

开源智慧家居

与家居行业、服务行业等伙伴协同合作&#xff0c;努力创造社会价值&#xff0c;提升行业整体服务 水平&#xff0c;树立家居服务业统一售后标准&#xff0c;构建品质、高效、有温度的居家生活服务新生态。 为企业商家和个人客户提供家居配送、搬运、安装、维修、保养等服务。 …

IPC:匿名管道和命名管道

一 管道初级测试 写两个小程序&#xff0c;一个负责向管道发数据&#xff0c;一个从管道接收数据&#xff1b; pipe.cpp #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } pipe2.cpp #inclu…

Java线程池及其实现原理

线程池概述 线程池&#xff08;Thread Pool&#xff09;是一种基于池化思想管理线程的工具&#xff0c;经常出现在多线程服务器中&#xff0c;如MySQL。 线程过多会带来额外的开销&#xff0c;其中包括创建销毁线程的开销、调度线程的开销等等&#xff0c;同时也降低了计算机…

【设计模式】单例模式(懒汉和饿汉模式详解)

目录 1.设计模式是什么&#xff1f; 2.单例模式 1.概念&#xff1a; 2.如何设计一个单例 1.口头约定&#xff08;不靠谱&#xff09; 2.使用编程语言的特性来处理 3.使用"饿汉模式"设计单例 1.详细步骤 2.完整代码 4.使用"饿汉模式"设计单例 1.详…

为什么我在大厂待了三个月就选择离开?我聊聊应届生该选择大厂还是小公司

我在互联网大厂只待了3个月就离开了&#xff0c;主要原因不是大厂的福利或者薪资不够好&#xff0c;只是因为我发现在大厂里每天都有开不完的会&#xff0c;忙碌到没有自己的生活。当时我每天10点上班&#xff0c;晚上要工作到11甚至是12点&#xff0c;甚至半夜两三点都接到过工…

Flowable+React+bpmn-js实现工作流

由于新东家使用的是React&#xff0c;不是Vue&#xff0c;而自己一直想做一个关于工作流的应用出来&#xff0c;断断续续&#xff0c;花了几个月的时间&#xff0c;开发了工作流的功能&#xff0c;后面会继续完善。 技术栈 前端 前端是基于React开发的&#xff0c;使用了ant…

OpenCV 直方图统计函数 cv::calcHist算是彻底弄明白了

参数说明 void calcHist( const Mat* images, int nimages,const int* channels, InputArray mask,OutputArray hist, int dims, const int* histSize,const float** ranges, bool uniform true, bool accumulate false );images 图像数组。每个图像的大小要一致&#xff0c…

最强算法视频公开课!(内容硬核,完全免费!

和录友们汇报一下&#xff0c;代码随想录算法公开课已经更新完毕了。 由我亲自录制了140期算法视频&#xff0c;覆盖了 《代码随想录》纸质版上全部题目的讲解。 视频全部免费开放在B站&#xff1a;代码随想录 目录就在视频播放的右边&#xff0c;完全按照代码随想录的顺序讲…