KKFileView(十二)——文件缓存处理

2021SC@SDUSC

本次报告讨论一些文件缓存的处理,主要设计四个类CacheService、CacheServiceJDKImpl类、CacheServiceRedisImpl类、CacheServiceRocksDBImpl类,他们的关系如下图所示,显然后三个实现了CacheService的接口

KKFileView(十二)——文件缓存处理_第1张图片

 

 一、redis缓存

1.介绍


Redis是一个key-value存储系统,它支持的value类型相对较多,包括string、list、set和zset,这些数据都支持push/pop/add/remove及交并补等操作,而且这些操作都是原子性的,在此基础上,redis支持各种不同方式的排序。为了保证效率,数据是缓存在内存中的,Redis会周期性的把数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave同步
Redis通常将数据存储到内存中,或被配置为使用虚拟内存,Redis有一个很重要的特点就是它可以实现持久化数据,通过两种方式可以实现数据持久化,一是RDB快照方式,将内存中的数据不断写入磁盘, 二是使用类似MySql的AOF日志方式,记录每次更新的日志,前者性能较高,但是可能会引起一定程度的数据丢失,后者相反,Redis支持即将数据到多台子数据库上,这种特性提高读取数据性能非常有益


2.本项目中redis主要用于通过文件名缓存文件,通过redis缓存判断文件名是否存在,用的的机制为缓存映射(MapCache)


        Redisson的分布式的RMapCache Java对象在基于RMap的前提下实现了针对单个元素的淘汰机制。同时仍然保留了元素的插入顺序。映射缓存(MapCache)它能够保留插入元素的顺序,并且可以指明每个元素的过期时间(专业一点叫元素淘汰机制)。另外还为每个元素提供了监听器,提供了4种不同类型的监听器。有:添加、过期、删除、更新四大事件。
如:

  @Override
    public void putPDFCache(String key, String value) {
        RMapCache convertedList = redissonClient.getMapCache(FILE_PREVIEW_PDF_KEY);
        convertedList.fastPut(key, value);
    }

添加pdf映射

  @Override
    public String getPDFCache(String key) {
        RMapCache convertedList = redissonClient.getMapCache(FILE_PREVIEW_PDF_KEY);
        return convertedList.get(key);
    }

通过文件名查找文件

  @Override
    public String getPDFCache(String key) {
        RMapCache convertedList = redissonClient.getMapCache(FILE_PREVIEW_PDF_KEY);
        return convertedList.get(key);
    }

清理缓存,之前报告中提到过每晚3点执行一次清理缓存 

@Override
    public void cleanCache() {
        cleanPdfCache();
        cleanImgCache();
        cleanPdfImgCache();
    }

 

二、 CacheServiceJDKImpl

方法和上面一样,

 public void initCache(){
        initPDFCachePool(CacheService.DEFAULT_PDF_CAPACITY);
        initIMGCachePool(CacheService.DEFAULT_IMG_CAPACITY);
        initPdfImagesCachePool(CacheService.DEFAULT_PDFIMG_CAPACITY);
        initMediaConvertCachePool(CacheService.DEFAULT_MEDIACONVERT_CAPACITY);
    }

    @Override
    public void putPDFCache(String key, String value) {
        pdfCache.put(key, value);
    }

    @Override
    public void putImgCache(String key, List value) {
        imgCache.put(key, value);
    }

三、RocksDB缓存

rocksdb是一款由Facebook使用C/C++开发的嵌入式的持久化的KV数据库

基于Google的LevelDB改进而来,redis是基于内存的会存在丢失情况,而RocksDB不会丢失且性能极好(硬盘和SSD)。

属于单机数据库,且同一库只可被一个进程读取写入。(线程安全需要用事务)

适用场景

​ 1.对写性能要求很高,同时有较大内存来缓存SST块以提供快速读的场景;

​ 2.SSD等对写放大比较敏感以及磁盘等对随机写比较敏感的场景;

3.需要变长kv存储的场景;

4.小规模元数据的存取;

不适合场景

​ 1.大value的场景,需要做kv分离;

​ 2.大规模数据的存取

RocksDB与Redis缓存的区别为

Redis 是一个远程内存数据存储(类似于 memcached)。它是一个服务器。单个 Redis 实例非常高效,但完全不可扩展(就 CPU 而言)。 Redis 集群是可扩展的(就 CPU 而言)。
RocksDB 是一个嵌入式键/值存储(类似于 BerkeleyDB 或更确切地说是 LevelDB)。它是一个库,支持多线程和基于日志结构合并树的持久性。

总的来说,Redis 比 RocksDB 具有更多的功能。它可以原生地理解复杂数据结构的语义,例如列表和数组。

相比之下,RocksDB 将存储的值视为一团数据。如果您想进行任何进一步的处理,您需要将数据带到您的程序中并在那里进行处理(换句话说,您不能将处理委托给数据库引擎(又名 RocksDB))。
RocksDB 仅在单个服务器上运行。 Redis 有一个集群版本(虽然它不是免费的)
Redis 是为内存计算而构建的,虽然它也支持将数据备份到持久存储,但主要用例是内存用例。相比之下,RocksDB 通常用于持久化数据,并且在大多数情况下将数据存储在持久性介质上。
RocksDB 有更好的多线程支持(特别是对于读——写仍然受到并发访问的影响)。
 

 

你可能感兴趣的:(java)