日常生活中,你一定有过这样的经历,一盒牛奶在冰箱里放久了,却忘了扔掉。 接下来发生的事情是你的冰箱里有不新鲜的牛奶,占用空间,没有用,只有食用才会有害。 同样,缓存中的数据也应该带有到期日期。 任何长期保存在缓存中的数据都会变得陈旧(如牛奶),没有用处,只会占用缓存中的空间。 两种情况下的解决方案都是相似的: 把它扔掉!
这篇博客的全部内容是解释过期策略,以保持缓存中的数据新鲜并丢弃过时的数据。
缓存数据过期:需求和概念
假设您正在运行一个电子商务网站,并且您在缓存中添加了这些产品的信息。 在很长一段时间内,产品的信息都保留在缓存中,不会被更改。 但是现在由于某种原因,数据源中已经更新了一些产品的价格。 在这种情况下,会发生数据不一致,因为您的客户仍在查看旧价格,这实际上是过时的缓存数据。
NCache 提供过期时间,您可以在其中设置数据的时间限制,一旦达到限制,数据将不再有效。 无效数据需要在预定义后从缓存中删除 清洁间隔。 这是一个间隔(由您设置),在此之后所有过期的项目都会自动从缓存中删除。 因此,任何过期的项目都不会立即从缓存中删除。
到期类型 NCache
NCache 提供以下策略来满足用户的需求:
- 绝对/默认绝对到期
- 滑动/默认滑动到期
我们将仔细研究这两种类型及其用法。
绝对到期
在该策略中,为需要失效的项目指定了一个绝对时间。 指定的时间保持在 UTC 时间格式,因此,在任何区域中指定的时间都会在缓存服务器上转换为 UTC 时间格式。 时间范围可以从 几秒钟到几小时到几天到几个月,并且在时间过去后,该项目无效或过期。 为了清楚起见,请看图 1:
使用案例: 对于您可以估计任何项目需要在缓存中保留多长时间的情况。 例如,如果限时产品推出,24 小时后无法销售,则添加该项目,绝对过期 24 小时,之后,该产品从缓存中过期。
让我们看一下代码示例,该示例显示在缓存中添加一个 5 分钟后过期的项目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Pre-condition: Cache is already connected // Get product from database against given product ID Product product = FetchProductFromDB(1001); // Generate a unique cache key for this product string key = $"Product:{product.ProductID}"; // Create a new CacheItem for this product with expiry var cacheItem = new CacheItem(product); var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); cacheItem.Expiration = expiration; cache.Insert(key, cacheItem); |
滑动到期
顾名思义,这种策略将数据保存在缓存中,只要它正在使用。 因此,特定时间未使用的数据将失效。 每次访问任何添加了滑动过期的数据时,该数据在缓存中存在的持续时间都会延长。 例如,如果任何具有 30 秒滑动间隔的项目在 30 秒内未被访问,则它已过期。 类似地,如果在 30 秒内访问它,则缓存中的项目的寿命会再超过 30 秒。
使用案例: 假设您有一个应用程序需要访问用户的凭据。 只要用户处于活动状态并使用应用程序,您就希望向用户提供访问权限。 在可以通过跟踪活动用户来维护会话的情况下,滑动到期可以帮助您。
在下面给出的示例中,产品添加了 5 分钟的滑动到期:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Get product from database against given product ID Product product = FetchProductFromDB(1001); // Generate a unique cache key for this product string key = $"Product:{product.ProductID}"; // Create a new CacheItem for this product with expiry var cacheItem = new CacheItem(product); var expiration = new Expiration(ExpirationType.Sliding, TimeSpan.FromMinutes(5)); cacheItem.Expiration = expiration; cache.Insert(key, cacheItem); |
默认到期策略
NCache 还允许您添加默认过期时间,以帮助您节省手动配置它的工作量。 这些只能使用配置 NCache Web 管理器或配置文件(稍后在博客中显示)。 以下是默认值:
- 默认绝对值
- 默认滑动
- 默认绝对更长
- 默认滑动更长
所有过期策略的默认值默认为 5 秒。 请参阅 默认到期 详细解释 NCache 文档。
使用配置过期 NCache 网络管理员
您可以启用到期并使用设置持续时间 NCache 网络管理器。 让我来告诉你怎么做:
使用配置文件配置过期
您还可以在 NCache 使用配置文件(配置文件) 安装在 NCache 默认安装目录。 在下面标签,有一个标签如下图:
1 2 3 4 5 |
<expiration-policy enabled="True"> <absolute-expiration longer-enabled="False" longer-value="5" default-enabled="False" default-value="30"/> <sliding-expiration longer-enabled="False" longer-value="5" default-enabled="False" default-value="20"/> </expiration-policy> |
同样,您可以指定从缓存中删除过期项目的清理间隔,如下所示:
1 2 3 |
<cache-settings ... > <cleanup interval="15sec"/> </cache-settings> |
批量清除过期物品
缓存中的所有过期项都被批量删除,以避免删除单个项造成的性能挫折。 但是,您可以配置要删除的项目的批量大小以及两次连续批量删除过期数据之间的延迟。 NCache 附带一个 Alachisoft.NCache.Service.exe.config 文件放在安装目录下 NCache 并具有以下可配置标签:
1 2 |
<add key="NCacheServer.ExpirationBulkRemoveSize" value="10"/> <add key="NCacheServer.ExpirationBulkRemoveDelay" value="0"/> |
要知道的事实
- 如果在缓存中添加了任何没有过期(绝对或滑动)的项目,它将永远保留在缓存中,直到手动删除。
- 您将不得不重新启动 NCache 使用配置文件配置任何内容以使更改生效后的服务。
- In NCache, 对于不同的拓扑,过期的工作方式不同,一切都在 集群环境中的过期.
总结一下!
因此,到目前为止,我们讨论的所有内容都概括为一个事实,即缓存中的陈旧数据需要有效管理,而过期是实现此目的的方法。 这是一种根据您提供的技术使缓存中的数据过期的技术。 NCache 帮助您轻松处理这些事情。