• httpcache4j 一个不错的httpcache 处理包


    httpcache4j实现了http 的rfc2616 大部分协议约定,可以用来方便的控制资源的cache,同时也是遵循了http 的cache 规范
    以下是一个参考使用

    demo 说明

    就是一个对于图片下载的服务处理,第一次请求数据会cache(本地磁盘)后边请求就不需要了

    项目准备

    • pom.xml
      有一些冗余的包引用,可以不用管
     
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.dalong</groupId>
        <artifactId>myhashids</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <encoding>UTF-8</encoding>
            <java.version>1.8</java.version>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.22</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.7.21</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.httpcache4j</groupId>
                <artifactId>httpcache4j-core</artifactId>
                <version>5.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.httpcache4j.storage</groupId>
                <artifactId>storage-file</artifactId>
                <version>5.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.httpcache4j.resolvers</groupId>
                <artifactId>resolvers-commons-httpclient</artifactId>
                <version>5.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.httpcache4j.resolvers</groupId>
                <artifactId>resolvers-httpcomponents-httpclient</artifactId>
                <version>5.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.httpcache4j.resolvers</groupId>
                <artifactId>resolvers-ning-async</artifactId>
                <version>5.1.0</version>
            </dependency>
            <dependency>
                <groupId>org.hashids</groupId>
                <artifactId>hashids</artifactId>
                <version>1.0.3</version>
            </dependency>
        </dependencies>
    </project>
     
    • 代码使用
      Application.java
     
    package com.dalong;
    import org.codehaus.httpcache4j.HTTPRequest;
    import org.codehaus.httpcache4j.HTTPResponse;
    import org.codehaus.httpcache4j.cache.FilePersistentCacheStorage;
    import org.codehaus.httpcache4j.cache.HTTPCache;
    import org.codehaus.httpcache4j.client.HTTPClientResponseResolver;
    import org.codehaus.httpcache4j.util.IOUtils;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URI;
    import java.net.URISyntaxException;
    /**
     * @author dalong
     */
    public class Application {
        public static void main(String[] args) throws URISyntaxException, IOException {
           httpCacheLearning();
        }
        public  static  void httpCacheLearning() throws URISyntaxException, IOException {
            File file  =new File("./mycache");
            FilePersistentCacheStorage filePersistentCacheStorage =new FilePersistentCacheStorage(file);
            HTTPCache httpCache =new HTTPCache(filePersistentCacheStorage, HTTPClientResponseResolver.createMultithreadedInstance());
            HTTPResponse httpResponse=  httpCache.execute(new HTTPRequest(new URI("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1604414122241&di=89d0b74128a600ebf054830beabf3535&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fwallpaper%2F1307%2F10%2Fc3%2F23153395_1373426315898.jpg")));
            InputStream inputStream = httpResponse.getPayload().get().getInputStream();
            byte[] bytes =  IOUtils.toByteArray(inputStream);
            System.out.println(new String(bytes));
            httpCache.shutdown();
        }
    }
    • 运行效果

    说明第二次请求走的是本地存储,不需要再次请求图片,同时我们尝试断开网络连接也是可以使用的

    说明

    golang 的httpcache 也是一个特别好用的库,使用简单,而且高效(支持了多种cache 的处理,redis,memcache,disk,s3,memory。。。以及cache 的合并。。。)httpcache4j 已经很久没有维护了,但是是一个设计不错的包,提供了各种扩展接口,我们直接可以复用,实际上对于httpcache4j的cache 处理上有点感觉不是很灵活的地方是数据以及元数据,httpcache 设计的时候就比较简单,直接存储字节数组到后端存储中,内容就是http 请求相应回来的数据

    参考资料

    https://tools.ietf.org/html/rfc2616#section-13
    https://github.com/httpcache4j/httpcache4j
    https://github.com/gregjones/httpcache

  • 相关阅读:
    苹果新的编程语言 Swift 语言进阶(五)--控制流
    苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型
    苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
    苹果新的编程语言 Swift 语言进阶(二)--基本类型
    第一篇 android架构是如何满足设计目标的?
    第三篇 android 应用开发模式之MVC模式及Observer模式
    第二篇 android应用开发模式之模板模式
    为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?
    Mecanim动画模型规范
    HTC Vive 体验的折腾经历
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/13933571.html
Copyright © 2020-2023  润新知