【问题标题】:Getting the size of disk persisted Ehcache data获取磁盘持久化 Ehcache 数据的大小
【发布时间】:2017-09-05 10:50:25
【问题描述】:

当我的应用程序出现故障时,我使用 Ehcache 3.4 将一些数据持久化到磁盘,并为磁盘持久性设置了一些最大大小。 来自 Ehcache 文档的示例:

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。有什么办法吗?当尺寸超过所需尺寸时会发生什么?

【问题讨论】:

    标签: java ehcache


    【解决方案1】:

    如果您要求 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();
    }
    

    【讨论】:

    • 正是我需要的
    猜你喜欢
    • 2018-01-21
    • 2016-09-02
    • 2014-05-05
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多