设为首页 收藏本站
查看: 1837|回复: 0

[经验分享] [转] .net core Session , Working with a distributed cache

[复制链接]

尚未签到

发表于 2017-7-1 18:42:19 | 显示全部楼层 |阅读模式
  本文转自:https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed
By Steve Smith+  
Distributed caches can improve the performance and scalability of ASP.NET Core apps, especially when hosted in a cloud or server farm environment. This article explains how to work with ASP.NET Core's built-in distributed cache abstractions and implementations.+  
View or download sample code+  

What is a Distributed Cache

A distributed cache is shared by multiple app servers (see Caching Basics). The information in the cache is not stored in the memory of individual web servers, and the cached data is available to all of the app's servers. This provides several advantages:+  


    •   Cached data is coherent on all web servers. Users don't see different results depending on which web server handles their request

    •   Cached data survives web server restarts and deployments. Individual web servers can be removed or added without impacting the cache.

    •   The source data store has fewer requests made to it (than with multiple in-memory caches or no cache at all).


  +  



Note

If using a SQL Server Distributed Cache, some of these advantages are only true if a separate database instance is used for the cache than for the app's source data.+  

Like any cache, a distributed cache can dramatically improve an app's responsiveness, since typically data can be retrieved from the cache much faster than from a relational database (or web service).+  
Cache configuration is implementation specific. This article describes how to configure both Redis and SQL Server distributed caches. Regardless of which implementation is selected, the app interacts with the cache using a common IDistributedCache interface.+  

The IDistributedCache Interface

The IDistributedCache interface includes synchronous and asynchronous methods. The interface allows items to be added, retrieved, and removed from the distributed cache implementation. The IDistributedCache interface includes the following methods:+  
Get, GetAsync+  
Takes a string key and retrieves a cached item as a byte[] if found in the cache.+  
Set, SetAsync+  
Adds an item (as byte[]) to the cache using a string key.+  
Refresh, RefreshAsync+  
Refreshes an item in the cache based on its key, resetting its sliding expiration timeout (if any).+  
Remove, RemoveAsync+  
Removes a cache entry based on its key.+  
To use the IDistributedCache interface:+  


    •   Specify the dependencies needed in project.json.

    •   Configure the specific implementation of IDistributedCache in your Startup class's ConfigureServices method, and add it to the container there.

    •   From the app's `Middleware or MVC controller classes, request an instance of IDistributedCache from the constructor. The instance will be provided by Dependency Injection (DI).


  +  



Note

There is no need to use a Singleton or Scoped lifetime for IDistributedCache instances (at least for the built-in implementations). You can also create an instance wherever you might need one (instead of using Dependency Injection), but this can make your code harder to test, and violates the Explicit Dependencies Principle.+  

The following example shows how to use an instance of IDistributedCache in a simple middleware component:+  




Copy

C#
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Caching.Distributed;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DistCacheSample
{
public class StartTimeHeader
{
private readonly RequestDelegate _next;
        private readonly IDistributedCache _cache;
public StartTimeHeader(RequestDelegate next,
           IDistributedCache cache)
{
_next = next;
            _cache = cache;
}
public async Task Invoke(HttpContext httpContext)
{
string startTimeString = "Not found.";
            var value = await _cache.GetAsync("lastServerStartTime");
            if (value != null)
            {
                startTimeString = Encoding.UTF8.GetString(value);
            }
httpContext.Response.Headers.Append("Last-Server-Start-Time", startTimeString);
await _next.Invoke(httpContext);
}
}

// Extension method used to add the middleware to the HTTP request pipeline.
public static class StartTimeHeaderExtensions
{
public static IApplicationBuilder UseStartTimeHeader(this IApplicationBuilder builder)
{
return builder.UseMiddleware<StartTimeHeader>();
}
}
}

In the code above, the cached value is read, but never written. In this sample, the value is only set when a server starts up, and doesn't change. In a multi-server scenario, the most recent server to start will overwrite any previous values that were set by other servers. The Get and Set methods use the byte[] type. Therefore, the string value must be converted using Encoding.UTF8.GetString (for Get) and Encoding.UTF8.GetBytes (for Set).+  
The following code from Startup.cs shows the value being set:+  




Copy

C#
public void Configure(IApplicationBuilder app,
    IDistributedCache cache)
{
    var serverStartTimeString = DateTime.Now.ToString();
    byte[] val = Encoding.UTF8.GetBytes(serverStartTimeString);
    cache.Set("lastServerStartTime", val);
app.UseStartTimeHeader();



Note

Since IDistributedCache is configured in the ConfigureServices method, it is available to the Configure method as a parameter. Adding it as a parameter will allow the configured instance to be provided through DI.+  

Using a Redis Distributed Cache

Redis is an open source in-memory data store, which is often used as a distributed cache. You can use it locally, and you can configure an Azure Redis Cache for your Azure-hosted ASP.NET Core apps. Your ASP.NET Core app configures the cache implementation using a RedisDistributedCache instance.+  
You configure the Redis implementation in ConfigureServices and access it in your app code by requesting an instance of IDistributedCache (see the code above).+  
In the sample code, a RedisCache implementation is used when the server is configured for a Staging environment. Thus the ConfigureStagingServices method configures the RedisCache:+  




Copy

C#
/// <summary>
/// Use Redis Cache in Staging
/// </summary>
/// <param name="services"></param>
public void ConfigureStagingServices(IServiceCollection services)
{
    services.AddDistributedRedisCache(options =>
    {
        options.Configuration = "localhost";
        options.InstanceName = "SampleInstance";
    });
}



Note

To install Redis on your local machine, install the chocolatey package http://chocolatey.org/packages/redis-64/ and run redis-server from a command prompt.+

Using a SQL Server Distributed Cache

The SqlServerCache implementation allows the distributed cache to use a SQL Server database as its backing store. To create SQL Server table you can use sql-cache tool, the tool creates a table with the name and schema you specify.+  
To use sql-cache tool add SqlConfig.Tools to the tools section of the project.json file and run dotnet restore.+  




Copy

C#
"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": {
"version": "1.0.0-preview2-final",
"imports": "portable-net45+win8+dnxcore50"
},
  "Microsoft.Extensions.Caching.SqlConfig.Tools": "1.0.0-preview2-final"
},

Test SqlConfig.Tools by running the following command+  




Copy

none
C:\DistCacheSample\src\DistCacheSample>dotnet sql-cache create --help

sql-cache tool  will display usage, options and command help, now you can create tables into sql server, running "sql-cache create" command :+  




Copy

none
C:\DistCacheSample\src\DistCacheSample>dotnet sql-cache create "Data Source=(localdb)\v11.0;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache
info: Microsoft.Extensions.Caching.SqlConfig.Tools.Program[0]
Table and index were created successfully.

The created table have the following schema:+  
+  
Like all cache implementations, your app should get and set cache values using an instance of IDistributedCache, not a SqlServerCache. The sample implements SqlServerCache in the Production environment (so it is configured in ConfigureProductionServices).+  




Copy

C#
/// Use SQL Server Cache in Production
/// </summary>
/// <param name="services"></param>
public void ConfigureProductionServices(IServiceCollection services)
{
    services.AddDistributedSqlServerCache(options =>
    {
        options.ConnectionString = @"Data Source=(localdb)\v11.0;Initial Catalog=DistCache;Integrated Security=True;";
        options.SchemaName = "dbo";
        options.TableName = "TestCache";
    });
}



Note

The ConnectionString (and optionally, SchemaName and TableName) should typically be stored outside of source control (such as UserSecrets), as they may contain credentials.+  

Recommendations

When deciding which implementation of IDistributedCache is right for your app, choose between Redis and SQL Server based on your existing infrastructure and environment, your performance requirements, and your team's experience. If your team is more comfortable working with Redis, it's an excellent choice. If your team prefers SQL Server, you can be confident in that implementation as well. Note that A traditional caching solution stores data in-memory which allows for fast retrieval of data. You should store commonly used data in a cache and store the entire data in a backend persistent store such as SQL Server or Azure Storage. Redis Cache is a caching solution which gives you high throughput and low latency as compared to SQL Cache.+  
Additional resources:+  


  • In memory caching
  • Redis Cache on Azure
  • SQL Database on Azure

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390144-1-1.html 上篇帖子: 免费开源的 .NET 分布式组件库 Exceptionless Foundatio 下篇帖子: Visual Studio 20周年软件趋势随想
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表