代码之家  ›  专栏  ›  技术社区  ›  Shai Givati

获取磁盘持久化Ehcache数据的大小

  •  0
  • Shai Givati  · 技术社区  · 7 年前

    当我的应用程序停止运行时,我使用Ehcache 3.4将一些数据持久化到磁盘,并为磁盘持久化设置一些最大大小。

    PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
    .with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))) 
    .withCache("threeTieredCache",
        CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
            ResourcePoolsBuilder.newResourcePoolsBuilder()
                .heap(10, EntryUnit.ENTRIES) 
                .offheap(1, MemoryUnit.MB) 
                .disk(20, MemoryUnit.MB, true) 
            )
    ).build(true);
    

    我在Ehcache库中找不到用于返回磁盘持久化数据当前大小的API。有什么要做的吗?当尺寸超过所需尺寸时会发生什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Henri    7 年前

    如果您要求20MB,磁盘空间将达到20MB,然后将开始收回。

    此外,还有一个 统计API。我所说的非正式,是指内部的东西可能会改变或消失。但现在,它就在那里。您可以检索缓存的统计信息,然后检索底层的统计信息。

    @Test
    public void test() throws IOException {
      StatisticsService statisticsService = new DefaultStatisticsService();
    
      try(PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
        .with(CacheManagerBuilder.persistence("myData"))
        .using(statisticsService)
        .withCache("threeTieredCache",
          CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
            ResourcePoolsBuilder.newResourcePoolsBuilder()
              .heap(10, EntryUnit.ENTRIES)
              .offheap(1, MemoryUnit.MB)
              .disk(20, MemoryUnit.MB, true)
          )
        ).build(true)) {
    
        Cache<Long, String> cache = persistentCacheManager.getCache("threeTieredCache", Long.class, String.class);
        for(long i = 0; i < 1000; i++) {
          cache.put(i, "test");
        }
        System.out.println("Length: " + getFolderSize("mydata"));
        TierStatistics tierStatistics = statisticsService
          .getCacheStatistics("threeTieredCache")
          .getTierStatistics()
          .get("Disk");
        System.out.println("Occupied: " + tierStatistics.getOccupiedByteSize());
        System.out.println("Allocated: " + tierStatistics.getAllocatedByteSize());
      }
    }
    
    private long getFolderSize(String folder) throws IOException {
      return Files.walk(Paths.get(folder))
        .filter(p -> p.toFile().isFile())
        .mapToLong(p -> p.toFile().length())
        .sum();
    }