浅析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技术站