1、容量限制中尺寸和重量的差异
GuavaCache提供了缓存总量的限制,并支持两个维度的限制。在这里,我们首先需要澄清尺寸和重量概念之间的区别和关系。
一般来说,限制容器容量的最初目的是防止过度使用内存导致内存溢出,因此本质是限制内存使用。从实现级别来看,它通常是根据总内存使用量和每个记录的估计字节数来估计的,这将转换为对缓存记录数的限制。这种方法相对简单,易于理解。然而,当单个缓存记录占用的字节数非常不同时,基于数字控制的结果将不够准确。
例如:
有必要将缓存的最大总量限制为M。缓存记录的可能大小范围为1k~k。每个缓存的估计值为50k。将缓存容器的最大容量设置为1w。如果存储的所有记录大小为1k,则总内存使用量仅为10M(内存未被有效使用);如果存储了k条记录,则内存使用量将为0M,这比预期的内存使用量大得多(容易导致内存溢出)。
为了解决这个问题,GuavaCache提供了一种相对精确的控制策略,即基于权重的总量控制。根据某些规则,计算每个值记录的权重值,然后根据权重值计算总金额。
在上面的示例中,我们根据权重进行设置。假设1k对应于基本重量1,k可以转换为重量。因此:
将最大缓存大小限制为M。1k对应于1的重量。Nk代表N的重量,因此我们可以将总重量限制为50w。这样,如果存储了1k条记录,您可以缓存多达5w条记录;如果所有记录的大小都为k,则最多只能缓存0条记录。要存储的最大记录数根据存储数据的大小而不同,但最终占用的记录总数可以基本一致。
因此,基于权重的控制方法更适合于对容器体积控制精度有严格要求的场景。您可以在创建容器时为每个记录指定权重计算策略(例如根据字符串长度或字节数组长度计算权重)。
2、使用约束描述
在实际使用中,这些参数之间存在一定的使用限制,应特别注意:
如果未指定权重实现逻辑,则maximumSize用于根据容器中缓存记录的数量限制最大容量;在这种情况下,即使设置了maximumWeight,它也不会生效。
如果指定了权重实现逻辑,则必须使用maximumWeight根据容器中每个缓存记录的总权重值限制最大容量。
为了简单描述,从缓存容器中删除数据的操作称为数据消除。根据不同的触发类型,我们可以将数据清理和消除策略分为被动消除和主动消除。
当容器中的缓存数量接近(未达到)最大阈值集时,将触发番石榴缓存的数据清理机制,并基于LRU或FIFO删除一些不常见的键值对。这样,您需要在创建容器时指定其maximumSize或maximumWeight,然后根据大小或重量进行判断并执行上述清理操作。
、基于到期时间
从输出结果可以看出,即使数据尚未过期,在插入第三条记录时,缓存容器将自动删除最初写入的key1记录,并为插入新数据腾出空间。这是因为触发了GuavaCache的被动消除机制,以确保缓存容器中的数据量始终在可控范围内。
GuavaCache支持基于创建时间或访问时间的数据过期处理。在实际使用中,您可以根据具体需要选择相应的方法。