格言“640 KB 应该对任何人都足够”曾经被广泛接受。 关于谁说的存在一些分歧,但现在普遍认为没有人知道计算中的“足够”意味着什么。
因此,在设置缓存时,您必须删除或驱逐一些缓存数据,并估计它们可以容纳的数据量。 没有 赶出,如果缓存已满,则不会接受任何传入的数据添加请求,因为没有从缓存中删除数据。
图1 用一个简单的插图解释了这一点:
启用驱逐意味着您的缓存将根据使用情况或与其他缓存项相比的优先级删除数据。 一旦从缓存中逐出较旧/较低优先级的项目,这将为传入数据释放空间,这些数据可以添加到缓存中。 图2 为清楚起见说明了这一点。
我们将讨论如何 NCache 支持和处理不同的驱逐策略,以及如何在缓存上启用它。
NCache 更多信息 配置驱逐 – NCache 配套文档 NCache 客户端 API 文档
驱逐政策 NCache
NCache 提供各种形式的驱逐以适应任何用例。
最近最少使用 (LRU)
最常用的驱逐政策之一是 LRU. 与最近访问的项目相比,此驱逐策略允许缓存驱逐长时间未使用的最旧的缓存项目。 数据根据其最后访问时间被逐出。 当从缓存中获取或更新缓存项时,访问时间将更新为每个缓存项的时间戳。
假设您的缓存包含客户正在查看的产品的数据。 一旦您的缓存快满了,驱逐一段时间未查看的产品是有意义的。
最不常用 (LFU)
此驱逐策略驱逐不常用的缓存项。 在 LFU 数据根据其使用频率/对项目的点击次数被驱逐。 例如,如果一个项目被访问 5 次,则它比被访问 20 次的项目更适合驱逐。 这对于客户正在查看热销商品并且您需要逐出缓存的情况很有用。 驱逐不像热销商品那样被访问的商品不会影响您的用户体验。
基于优先级的驱逐
基于优先级的驱逐 首先从缓存中驱逐不太重要的数据。 如果您可以优先考虑缓存数据,则必须采用此驱逐策略来更好地控制数据被驱逐的方式。 在将缓存项添加到缓存时指定优先级。 您可以指定以下优先级中的任何优先级:
- 低
- 低于正常值
- 正常
- 偏多
- 高
- 不可移除 - 此优先级指定不应驱逐缓存项,只能使用配置 NCache API。
这是您可以在将每个项目添加到缓存时轻松指定其优先级的方法:
1 2 3 4 5 6 7 8 9 |
Product product = FetchProductFromDB(1001); string key = $"Product:{product.ProductID}"; CacheItem cacheItem = new CacheItem(product) { Priority = CacheItemPriority.High }; cache.Add(key, cacheItem); |
NCache 更多信息 配置驱逐 – NCache 配套文档 NCache 客户端 API 文档
大量搬迁物品
在逐出期间,将批量删除项目,以便单独逐出项目不会影响性能。 NCache 根据您的要求,您可以轻松自定义两次连续批量驱逐之间的批量大小和延迟。
在 Alachisoft.NCache.Service.exe.config 文件 %NCHOME%/bin/服务,您可以通过以下标签配置这些设置。 有关更多详细信息,请参阅有关文档 配置驱逐设置.
驱逐的体积大小
您可以在一次批量调用中指定要删除的项目数。
1 |
<add key="NCacheServer.EvictionBulkRemoveSize" value="1000"/> |
驱逐批量删除延迟
您可以指定驱逐删除调用之间的延迟(以秒为单位),如此处所示。 零值意味着不会延迟驱逐,并且项目将继续驱逐。
1 |
<add key="NCacheServer.EvictionBulkRemoveDelay" value="5"/> |
通过 Web 管理器启用驱逐
您可以通过一系列简单的步骤启用驱逐。 启用逐出后,您可以自定义逐出比率(要逐出的缓存总大小的百分比)并指定策略和优先级。
通过配置文件启用驱逐
您还可以通过更改缓存配置文件(配置文件)。 在下面 <cache-settings>
标记,添加以下内容 <eviction-policy>
标签:
1 2 3 |
<cache-settings ...> <eviction-policy enabled="True" default-priority="normal" policy="priority" eviction-ratio="5%"/> </cache-settings> |
NCache 更多信息 配置驱逐 – NCache 配套文档 版本比较
集群环境中的驱逐
- 一旦启用驱逐,驱逐由智能处理 NCache 在每个缓存拓扑中:
- 分区/副本分区缓存: In 分区的 和 副本分区 拓扑,因为每个节点都有数据分区,所以每个节点都有责任驱逐自己的数据。 对于partition-of-replica中的replica节点,数据从active节点移除时会自动移除。
- 复制缓存: In 已复制 拓扑,每个节点都有相同的数据集,所以只有集群协调器负责驱逐。
- 镜像缓存: In 镜子 缓存,活动节点负责对整个缓存进行驱逐。
结论
要在缓存上应用缓存操作而不会出现任何中断,您需要确保缓存保留新数据并驱逐任何不需要的数据。 这就是驱逐发挥作用的地方。 配置驱逐很简单,剩下的由 NCache 本身。