You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server(.NET7)实现MSSQL数据服务器端缓存方案咨询

Blazor Server 服务器端定时缓存数据集实现方案

核心思路

完全可以通过服务器端缓存+定时刷新的方式解决多客户端重复查询数据库的问题。利用Blazor Server的服务器运行特性,在服务端维护一份全局缓存,每分钟主动从数据库拉取最新数据更新缓存,所有客户端直接从缓存读取数据,彻底避免重复DB查询。

具体实现步骤

1. 配置内存缓存

在Program.cs中注册内存缓存服务:

builder.Services.AddMemoryCache(options =>
{
    // 可选:设置缓存大小限制,避免内存溢出
    options.SizeLimit = 1024 * 1024 * 50; // 50MB
});

2. 实现定时刷新的后台服务

创建一个继承自BackgroundService的托管服务,负责每分钟刷新缓存:

public class DataRefreshService : BackgroundService
{
    private readonly IMemoryCache _cache;
    private readonly IDbDataService _dbService;
    private readonly ILogger<DataRefreshService> _logger;
    private readonly TimeSpan _refreshInterval = TimeSpan.FromMinutes(1);

    public DataRefreshService(IMemoryCache cache, IDbDataService dbService, ILogger<DataRefreshService> logger)
    {
        _cache = cache;
        _dbService = dbService;
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("数据缓存刷新服务启动");

        // 启动时先刷新一次缓存,避免客户端初始无数据
        await RefreshCacheAsync();

        while (!stoppingToken.IsCancellationRequested)
        {
            await Task.Delay(_refreshInterval, stoppingToken);
            await RefreshCacheAsync();
        }
    }

    private async Task RefreshCacheAsync()
    {
        try
        {
            // 按页面拉取对应数据集
            var dashboardChartData = await _dbService.GetDashboardChartDataAsync();
            var realtimeTableData = await _dbService.GetRealtimeTableDataAsync();

            // 更新缓存(设置永不过期,由后台主动刷新)
            _cache.Set("DashboardChartData", dashboardChartData);
            _cache.Set("RealtimeTableData", realtimeTableData);

            _logger.LogInformation("缓存已成功更新");
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "缓存更新失败,将使用旧数据");
        }
    }
}

然后在Program.cs注册该服务:

builder.Services.AddHostedService<DataRefreshService>();

3. 封装缓存读取服务

创建一个封装缓存操作的服务,简化组件调用:

public interface IDataCacheAccessor
{
    T GetCachedData<T>(string cacheKey);
}

public class DataCacheAccessor : IDataCacheAccessor
{
    private readonly IMemoryCache _cache;

    public DataCacheAccessor(IMemoryCache cache)
    {
        _cache = cache;
    }

    public T GetCachedData<T>(string cacheKey)
    {
        return _cache.TryGetValue(cacheKey, out T data) ? data : default;
    }
}

注册服务:

builder.Services.AddScoped<IDataCacheAccessor, DataCacheAccessor>();

4. Blazor组件中使用缓存

在大屏组件中注入服务并读取缓存数据:

@inject IDataCacheAccessor DataCacheAccessor
@inject IJSRuntime JSRuntime

<h3>实时数据图表</h3>
<ChartComponent Data="@_chartData" />

<h3>实时数据表格</h3>
<TableComponent Data="@_tableData" />

@code {
    private DashboardChartModel[] _chartData;
    private RealtimeTableModel[] _tableData;

    protected override void OnInitialized()
    {
        // 初始加载缓存数据
        RefreshDataFromCache();
    }

    // 可选:通过定时器让组件主动刷新(配合缓存更新频率)
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            await JSRuntime.InvokeVoidAsync("setInterval", () =>
            {
                RefreshDataFromCache();
                StateHasChanged();
            }, 60000); // 每分钟刷新一次组件
        }
    }

    private void RefreshDataFromCache()
    {
        _chartData = DataCacheAccessor.GetCachedData<DashboardChartModel[]>("DashboardChartData");
        _tableData = DataCacheAccessor.GetCachedData<RealtimeTableModel[]>("RealtimeTableData");
    }
}

5. 多服务器部署扩展(可选)

如果后续需要多服务器集群部署,将内存缓存替换为分布式缓存(如Redis)即可:

// 替换内存缓存为Redis分布式缓存
builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "your-redis-server:6379";
    options.InstanceName = "BlazorDataCache:";
});

后台服务和缓存访问服务无需修改,直接兼容。

参考资料

  • .NET 内存缓存官方文档:讲解内存缓存的配置、使用方式及最佳实践
  • .NET 托管服务(BackgroundService)官方文档:说明如何创建和部署定时后台任务
  • Blazor Server 服务注入文档:指导如何在Blazor组件中注入和使用服务

内容的提问来源于stack exchange,提问作者Stephen Pefanis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:22:57