问题 appfabric缓存清除所有对象


是否有建议的方法来清除DataCache中的所有对象?

我可以使用DataCache.GetObjectsByAllTags方法,但这需要一个区域,我无法使用,因为我需要在多个缓存主机之间共享对象。


12600
2018-06-20 14:14


起源



答案:


读一下这个答案: ASP.Net AppFabric Cache缺少Flush / Clear和Count / GetCount方法?


3
2018-06-20 14:31



所以我想这种方法不可用。 - np-hard


答案:


读一下这个答案: ASP.Net AppFabric Cache缺少Flush / Clear和Count / GetCount方法?


3
2018-06-20 14:31



所以我想这种方法不可用。 - np-hard


DataCache对象上没有简单的.Clear(),但使用以下内容将清除Appfabric主机上的缓存:

/ *假设DataCache是​​一个正确设置的Microsoft.ApplicationServer.Caching.Client.DataCache对象* /

public void Clear()
{
   Parallel.ForEach(DataCache.GetSystemRegions(), region =>
   {
      DataCache.ClearRegion(region);
      var sysRegion = DataCache.GetSystemRegionName(region);
      DataCache.ClearRegion(sysRegion);
   });
}

问题是,如果您在配置中设置了DataCacheLocalCacheProperties,您仍将从本地副本中提取项目,直到超时或通知发生。我仍然在寻找一种方法来立即使本地副本中的项目无效。


7
2017-07-05 13:41



我事后应该尝试一些相当明显的东西。将DataCache对象设置为null然后重新初始化也会导致重新创建DataCache的本地副本。似乎希望清除AppFabric和本地IIS。 - PMontgomery
wouldnt系统区域列表只给我目标主机上的区域名称?因为区域名称是主机的本地名称 - np-hard
@np_hard我不确定你在这里问的是什么。是指GetSystemRegions是返回缓存客户端上的区域还是仅返回区域 一 缓存集群中的节点?我在缓存集群中的两个节点上看到的是GetCacheStatistics <CacheName>返回从缓存中删除的项目,缓存大小在两个节点上都降为0。 - PMontgomery
GetSystemRegions()返回一堆名为Default_Region_ <number>的区域,这不是我实际放入数据的任何区域的名称。 - Frank Schwieterman
弗兰克,当让AppFabric完成所有管理时,您应该看到编号为0000到1023的区域(如果内存正确地为我服务)。如果您正在使用命名区域,则会丢失AppFabric的整个“分布式/复制”部分,因为该区域将仅存在于一个缓存主机上。如果你 是 但是,使用命名区域时,您仍应该能够使用您正在使用的区域的名称调用ClearRegion(string regionName)。对不起,如果我不能确定。与AppFabric合作的项目不久。 - PMontgomery


$hostname = 'server.lan'
$endpoints = New-Object -TypeName System.Collections.Generic.List[Microsoft.ApplicationServer.Caching.DataCacheServerEndpoint]
$endpoints.Add((New-Object -TypeName Microsoft.ApplicationServer.Caching.DataCacheServerEndpoint -ArgumentList $hostname, 22233))
$cache = ( New-Object -TypeName Microsoft.ApplicationServer.Caching.DataCacheFactory -ArgumentList ( New-Object -TypeName Microsoft.ApplicationServer.Caching.DataCacheFactoryConfiguration -Property @{ Servers = $endpoints } ) ).GetCache('Pricing')
$cache.GetSystemRegions() | %{ $cache.ClearRegion( $_ ) }

0
2018-06-03 16:22





这是刷新我使用的缓存的方法。为了验证缓存项是否已清除,我在命令shell中运行了get-cachestatistics。

public void Clear()
{
   Parallel.ForEach(DataCache.GetSystemRegions(), new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, region =>
   {
      DataCache.ClearRegion(region);
   });
}

0
2017-10-27 01:12