浅析C#更改令牌ChangeToken

浅析C#更改令牌ChangeToken

什么是ChangeToken

ChangeToken是ASP.NET Core框架中的一个关键抽象,是用来告诉缓存或联接等系统何时应该使其存储的数据过期并重新生成的一种机制。它可以被用于许多场景,例如:文件缓存、分布式缓存、Razor导航等等。

ChangeToken以观察者模式的方式工作,即我们的应用程序会订阅一个ChangeToken,一旦变更发生,就会通知我们。同时,ChangeToken也可以用于取消订阅,以防止对象没有及时地销毁。

ChangeToken的使用

添加ChangeToken

假设我们有一个缓存系统,通过获取一个API的数据并将其存储在内存中以支持快速查询。为了最大限度地利用缓存,我们可以使用ChangeToken机制,在数据发生变化时使缓存过期并重新生成。

在ASP.NET Core中,我们可以使用MemoryCache,它是一个内存中的缓存系统。

// 新建MemoryCache实例
IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
// 获取一个ChangeToken依赖项(假设是API数据)
var apiDependency = new CancellationChangeToken(new CancellationTokenSource().Token);
// 添加缓存
cache.Set("api_data", GetApiData(), new MemoryCacheEntryOptions()
{
    AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10),
    SlidingExpiration = TimeSpan.FromSeconds(5),
    // 将ChangeToken依赖项绑定到缓存中
    ExpirationTokens = { apiDependency }
});
// 订阅ChangeToken的变更通知
apiDependency.RegisterChangeCallback(state =>
{
    // 当变更通知到达后,清空缓存
    cache.Remove("api_data");
}, null);

在上面的代码示例中,我们通过MemoryCache实例添加了一个缓存,缓存中的数据依赖于GetApiData()方法返回的API数据,并且在这个数据发生变化时缓存将过期并重新生成。这是通过将一个ChangeToken依赖项绑定到缓存中来实现的,当变更通知到达时,我们会将缓存从MemoryCache中删除。同时,我们也订阅了这个ChangeToken,以便在变更通知到达时能够及时更新缓存。

取消ChangeToken

还可以通过CancellationTokenSource.Cancel()方法来取消ChangeToken的订阅,这可以方便我们在对象没有及时销毁时进行操作。

IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
var apiDependency = new CancellationChangeToken(new CancellationTokenSource().Token);

// ...

// 取消ChangeToken订阅
cancellationTokenSource.Cancel();

示例

示例1:在API数据更改时过期缓存

在这个示例中,我们模拟了一个获取API数据的方法,并将其存储在MemoryCache缓存中。我们使用了ChangeToken机制来在API数据发生更改时使缓存过期,并重新生成。

IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

public IActionResult GetApiData()
{
    // 新建一个ChangeToken依赖项
    var apiDependency = new CancellationChangeToken(new CancellationTokenSource().Token);

    // 添加缓存
    cache.Set("api_data", GenerateData(), new MemoryCacheEntryOptions()
    {
        AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10),
        SlidingExpiration = TimeSpan.FromSeconds(5),
        ExpirationTokens = { apiDependency }
    });

    // 订阅ChangeToken的变更通知
    apiDependency.RegisterChangeCallback(state =>
    {
        // 当API数据发生更改时,通知MemoryCache中“api_data”缓存过期
        cache.Remove("api_data");
    }, null);

    // 返回MemoryCache中的数据
    var data = cache.Get<string>("api_data");
    return Ok(data);
}

public IActionResult UpdateApiData()
{
    // 模拟API数据的更新操作
    UpdateData();

    // 当API数据更新时,取消之前的ChangeToken订阅
    cancellationTokenSource.Cancel();

    return Ok();
}

private string GenerateData()
{
    return "API Data " + DateTime.Now.ToString();
}

private void UpdateData(){
    // 省略更新操作
}

示例2:在数据库操作时过期缓存

在这个示例中,我们模拟了一个使用Entity Framework Core进行数据读取的操作,并将其存储在MemoryCache缓存中。我们使用ChangeToken机制在数据库中进行插入/更新/删除操作时使缓存过期,并重新生成。

IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

public IActionResult GetUserData(int userId)
{
    // 新建一个ChangeToken依赖项
    var dbDependency = new ChangeToken();

    // 从数据库获取数据,并添加到缓存中
    var data = _dbContext.Users.Find(userId);
    cache.Set($"user_{userId}", data, new MemoryCacheEntryOptions()
    {
        AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10),
        SlidingExpiration = TimeSpan.FromSeconds(5),
        ExpirationTokens = { dbDependency }
    });

    // 订阅ChangeToken的变更通知
    dbDependency.RegisterChangeCallback(state =>
    {
        // 当数据变更时,通知MemoryCache中的缓存过期
        cache.Remove($"user_{userId}");
    }, null);

    // 返回MemoryCache中的数据
    var userData = cache.Get<User>($"user_{userId}");
    return Ok(userData);
}

public IActionResult AddUser(User user)
{
    _dbContext.Users.Add(user);
    _dbContext.SaveChanges();

    // 当在数据库中插入新数据时,取消之前的ChangeToken订阅
    cancellationTokenSource.Cancel();

    return Ok();
}

public IActionResult UpdateUser(User user)
{
    _dbContext.Users.Update(user);
    _dbContext.SaveChanges();

    // 当在数据库中更新数据时,取消之前的ChangeToken订阅
    cancellationTokenSource.Cancel();

    return Ok();
}

public IActionResult DeleteUser(int userId)
{
    var user = _dbContext.Users.Find(userId);
    _dbContext.Users.Remove(user);
    _dbContext.SaveChanges();

    // 当在数据库中删除数据时,取消之前的ChangeToken订阅
    cancellationTokenSource.Cancel();

    return Ok();
}

以上两个示例演示了ChangeToken的使用方式,可以根据实际场景进行相应的调整和变化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析C#更改令牌ChangeToken - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • Directory文件类的实例讲解

    当我们在进行网站或者应用程序的开发时,通常需要对文件进行管理。其中一个重要的文件类是Directory文件类。在这个话题中,我们将详细讲解Directory文件类的实例。 Directory文件类的作用 Directory是一个文件类,用于对文件夹进行操作。通过Directory文件类,我们可以创建、复制、移动、删除、枚举文件夹中的文件或子文件夹等操作。 D…

    C# 2023年6月1日
    00
  • c#数据绑定之向查询中添加参数(.Net连接外部数据库)

    C# 数据绑定之向查询中添加参数(.Net连接外部数据库) 在C#中,我们可以使用.NET连接外部数据库,实现数据绑定等操作。在查询数据时,有时需要向查询中添加参数,以实现更加精准的查询结果。 1. 添加数据库连接 首先,我们需要添加数据库连接,使用SqlConnection类来连接数据库。连接字符串可以通过Visual Studio中的数据源管理器来获取。…

    C# 2023年6月1日
    00
  • C#操作SQLite数据库之读写数据库的方法

    C#操作SQLite数据库之读写数据库的方法 SQLite简介 SQLite是一款轻型、自包含且无需服务器的SQL数据库引擎,支持大部分的SQL标准,其数据存储在单个磁盘文件中,并使用标准的SQL查询语句进行访问。因此,SQLite具有许多优点,如具有跨平台跨语言访问、开源、简单易用、占用空间小、速度快等等。因此,SQLite是很多开发人员的首选数据库。 C…

    C# 2023年6月1日
    00
  • c#显示当前在线人数示例

    下面是“c#显示当前在线人数示例”的完整攻略。 简介 在网站或应用程序的开发中,有时需要统计当前在线用户数。本文将展示如何使用C#编写代码来实现这一功能。 步骤 步骤1:设置计数器 为了记录当前在线用户数,我们需要设置一个计数器。我们可以使用Application对象的Application[“OnlineCount”]属性来实现这一点。 Applicati…

    C# 2023年6月7日
    00
  • C#实现获取Excel中图片所在坐标位置

    获取Excel中图片所在坐标位置主要涉及到读取Excel文件、解析Excel文件和处理Excel文件中的图片等技术。下面是一些概述步骤: 步骤一:引入所需的依赖项 引入 Microsoft.Office.Interop.Excel 库,该库可用于操作Excel。 引入 System.Drawing 库,该库可用于处理图像。 步骤二:读取Excel文件 使用 …

    C# 2023年6月7日
    00
  • C# 单元测试全解析

    C# 单元测试全解析 前言 单元测试在软件开发过程中是一个至关重要的环节,可以确保代码的质量与正确性。而C#作为一种强类型编程语言,提供了方便易用的单元测试框架。本文将全面讲解C#中的单元测试包括:单元测试框架的介绍、搭建单元测试环境、编写单元测试用例、运行单元测试。希望本文能够对C#单元测试的学习与实践有所帮助。 单元测试框架介绍 单元测试框架是C#中用于…

    C# 2023年5月31日
    00
  • c#打包文件解压缩的实例

    C#打包文件解压缩的实例攻略 在C#开发过程中,我们经常需要对一些文件进行打包和解压缩。在此分享一下C#打包文件解压缩的实例攻略。 第一步:引用相关命名空间 使用C#进行文件打包与解压缩,需要用到System.IO.Compression和System.IO.Compression.FileSystem两个命名空间。因此,在程序中需要引用这两个命名空间。 u…

    C# 2023年6月1日
    00
  • C#使用log4net打日志

    当开发大型项目时,通常需要在软件中记录日志以便于后期查看、分析和定位问题。log4net是一个开源的日志记录框架,可用于C#应用程序中。本文将介绍如何使用log4net在C#应用程序中记录日志。 安装log4net 首先需要安装log4net。可以通过NuGet包管理器安装log4net,也可以手动下载log4net的二进制文件。 NuGet安装方法如下: …

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部