Distributed Cache(分布式緩存)-SqlServer


Net Core 緩存系列:

    1、NetCore IMemoryCache 內存緩存

    2、Distributed Cache(分布式緩存)-SqlServer

    3、Distributed Cache(分布式緩存)-Redis

歡迎交流學習!!! GitHub源碼

分布式緩存是由多個應用服務器共享的緩存,通常作為外部服務存儲在單個應用服務器上,常用的有SqlServer,Redis,NCache。

分布式緩存可以提高ASP.NET Core應用程序的性能和可伸縮性,尤其是應用程序由雲服務或服務器場托管時。

分布式緩存的特點:

  • 跨多個服務器請求,保證一致性。
  • 應用程序的服務器重啟或部署時,緩存數據不丟失。
  • 不使用本地緩存(如果是多個應用服務器會出現不一致及數據丟失的風險)

Sql Server Distrubuted Cahce configure and application

1、Nuget下載安裝包

 2、使用sql-cache 工具創建緩存列表

     Win+r 打開cmd命令,輸入如下指令,創建緩存表,

dotnet sql-cache create "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache

如遇到以下error,需要安裝dotnet-sql-cache,命令如下。(Note: NetCore 3.1 對應的dotnet-sql-chche version 3.1.13)

dotnet tool install --global dotnet-sql-cache

如果看到如下提示,證明緩存表創建成功:

緩存表結構:

3、在請求管道中添加DistributedCache(Note:這里建議ConnectionString,SchemaName,TableName最好寫在配置文件里,在本章最后簡單介紹下如果在NetCore console 里配置使用appsettings.json

public static IServiceCollection ConfigureServices(this IServiceCollection services)
{
            var configuration = BuildConfiguration();
            services.AddSingleton<IConfiguration>(configuration);
            services.AddDistributedSqlServerCache(options=> 
            {
                options.ConnectionString = configuration["SqlServerDistributedCache:ConnectionString"];
                options.SchemaName =configuration["SqlServerDistributedCache:SchemaName"];
                options.TableName = configuration["SqlServerDistributedCache:TableName"];
            });
            services.AddTransient<ISqlServerService, SqlServerService>();
            return services;
}
View Code

4、通過構造函數依賴注入IDistributedCache

private readonly IDistributedCache _cacheService;

public SqlServerService(IDistributedCache cacheService)
{
      this._cacheService = cacheService;
}

最簡單的方式是直接使用IDistributedCache Extension方法,提供了String類型的cache value還是比較常用的。

以下是簡單封裝實現,根據需求更改即可。

 public class SqlServerService: ISqlServerService
    {
        private readonly IDistributedCache _cacheService;

        public SqlServerService(IDistributedCache cacheService)
        {
            this._cacheService = cacheService;
        }

        public async Task SetAsync(string key, byte[] value, object expiration = null, bool isAbsoluteExpiration = false)
        {
            var options = this.BuildDistributedCacheEntryOptions(expiration, isAbsoluteExpiration);
            await _cacheService.SetAsync(key, value, options);
        }

        public async Task SetAsync(string key, string value, object expiration = null, bool isAbsoluteExpiration = false)
        {
            var options = this.BuildDistributedCacheEntryOptions(expiration, isAbsoluteExpiration);
            await _cacheService.SetStringAsync(key, value, options);
        }

        public async Task<byte[]> GetAsync(string key)
        {
            return await _cacheService.GetAsync(key);
        }

        public async Task<string> GetStringAsync(string key)
        {
            return await _cacheService.GetStringAsync(key);
        }

        public async Task RemoveAsync(string key)
        {
            await _cacheService.RemoveAsync(key);
        }

        public async Task RefreshAsync(string key)
        {
            await _cacheService.RefreshAsync(key);
        }

        private DistributedCacheEntryOptions BuildDistributedCacheEntryOptions(object expiration = null, bool isAbsoluteExpiration = false)
        {
            var options = new DistributedCacheEntryOptions();
            if (expiration != null)
            {
                if (expiration is TimeSpan)
                {
                    if (isAbsoluteExpiration)
                        options.SetAbsoluteExpiration((TimeSpan)expiration);
                    else
                        options.SetSlidingExpiration((TimeSpan)expiration);
                }
                else if (expiration is DateTimeOffset)
                {
                    options.SetAbsoluteExpiration((DateTimeOffset)expiration);
                }
                else
                {
                    throw new NotSupportedException("Not support current expiration object settings.");
                }
            }
            return options;
        }
    }
View Code

這里主要說下DistributedCacheEntryOptions這個類,作用是設置緩存項的過期時間

public class DistributedCacheEntryOptions
{
    public DistributedCacheEntryOptions()
    public DateTimeOffset? AbsoluteExpiration { get; set; }//絕對過期時間
    public TimeSpan? AbsoluteExpirationRelativeToNow { get; set; }//絕對過期時間
public TimeSpan? SlidingExpiration { get; set; } //滑動過期時間(如果在滑動過期時間內刷新,將重新設置滑動過去時間,對應IDistributedCache中的Refresh方法)
}

OK,Sql Server IDistributeCache 就介紹到這里。

 

附加:NetCore Console 中使用appsettings.json文件

1、Nuget下載安裝packages

 2、添加appsettings.json文件,修改property->copy always

"SqlServerDistributedCache": {
    "ConnectionString": "",
    "SchemaName": "",
    "TableName": ""
  }

3、構建Configuration對象並添加到請求管道

public static IServiceCollection ConfigureServices(this IServiceCollection services)
{
            var configuration = BuildConfiguration();
            services.AddSingleton<IConfiguration>(configuration);
            services.AddDistributedSqlServerCache(options=> 
            {
                options.ConnectionString = configuration["SqlServerDistributedCache:ConnectionString"];
                options.SchemaName = configuration["SqlServerDistributedCache:SchemaName"];
                options.TableName = configuration["SqlServerDistributedCache:TableName"];
            });
            services.AddTransient<ISqlServerService, SqlServerService>();
            return services;
}

        private static IConfigurationRoot BuildConfiguration()
        {
            var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile($"appsettings.json", true, true)
                .AddJsonFile($"appsettings.{env}.json", true, true)
                .AddEnvironmentVariables();
            return builder.Build();
        }
View Code

這里是根據環境變量“ASPNETCORE_ENVIRONMENT”讀取不同的appsettings文件,比如Development,Staging,Product

4、通過構造函數注入使用IConfiguration對象即可。

完整代碼地址: Github

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM