`
wisfly
  • 浏览: 62953 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Google Guava Cache:本地缓存,过期实现

 
阅读更多


小伙伴们,我开了一家海淘护肤品淘宝店,搜索店铺“禾子蝶的海淘铺”,正品保证,欢迎进店选购哦。谢谢!

 

Google Guava Cache:本地缓存实现,支持多种缓存过期策略,具体看官网:http://ifeve.com/google-guava/

使用案例:

1:先依赖guava的jar包

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
 </dependency>

2:添加配置文件VcodeCacheManager.java

package com.cmcc.util;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

public class VcodeCacheManager {


    public static Cache<String, String> cacheTicket = CacheBuilder.newBuilder().expireAfterWrite(7200, TimeUnit.SECONDS) // 过期时间7200s,TimeUnit.SECONDS可改
            .maximumSize(1000)// 最大缓存数量
            .build();
   
    public static String getTicket(String key) {
        if(key == null){
            return "";
        }
        try {
            return cacheTicket.get(key, new Callable<String>() {
                public String call() throws Exception {
                    return "";
                }
            });
        } catch (ExecutionException e) {
        }
        return null;
    }
    public static void putTicket(String key, String value) {
        cacheTicket.put(key, value);
    }
   
   
    public static void remove(String key) {
        cacheTicket.invalidate(key);
    }
}
3:使用由于微信的分享使用有效期为7200s,需要将所需的ticket的值放到cacheTicket缓存中,过期后就更新ticket值,这样每次取到ticket都是有效的。

package com.cmcc.controller.rest.share;

import java.io.IOException;
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.HttpException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.cmcc.util.Constant;
import com.cmcc.util.StringUtil;
import com.cmcc.util.VcodeCacheManager;
import com.cmcc.util.alipay.util.httpClient.HttpProtocolHandler;
import com.cmcc.util.alipay.util.httpClient.HttpRequest;
import com.cmcc.util.alipay.util.httpClient.HttpResponse;
import com.cmcc.util.alipay.util.httpClient.HttpResultType;

@RestController
@RequestMapping(value = "/share")
public class ShareController {
   
    @RequestMapping(value = "/shareOthers", method = RequestMethod.GET)
    public @ResponseBody String shareContent() throws HttpException, IOException {
           String ticketResult;
           String ticketVal = VcodeCacheManager.getTicket("ticket");
           if(StringUtil.isEmpty(ticketVal)){
                HttpRequest request = new HttpRequest(HttpResultType.BYTES);
                //设置编码集
                request.setCharset(Constant.CHARSET);
                request.setMethod(HttpRequest.METHOD_GET);
                request.setUrl(Constant.TOKEN_URL);
                request.setQueryString("grant_type=client_credential"+"&appid="+Constant.APPID+"&secret="+Constant.APPSECRET);
              
                HttpResponse response;
                HttpProtocolHandler httpProtocolHandler = HttpProtocolHandler.getInstance();
                response = httpProtocolHandler.execute(request,"","");
                String tokenStr = response.getStringResult();
                JSONObject tokenObj = JSONObject.fromObject(tokenStr);
               
                String accessToken = (String) tokenObj.get("access_token");
                //accessToken用于查询ticket。
                request.setUrl(Constant.TICKET_URL);
                request.setQueryString("access_token="+accessToken+"&type=jsapi");
                response = httpProtocolHandler.execute(request,"","");
                String ticketStr = response.getStringResult();
                JSONObject ticketObj = JSONObject.fromObject(ticketStr);
                String ticket = (String) ticketObj.get("ticket");
                VcodeCacheManager.putTicket("ticket", ticket);
                ticketResult=ticket;
           }else{
               ticketResult=ticketVal;
           }
        return ticketResult;
    }
   
}

package com.cmcc.util.alipay.util.httpClient;

import org.apache.commons.httpclient.NameValuePair;

/* *
 *类名:HttpRequest
 *功能:Http请求对象的封装
 *详细:封装Http请求
 *版本:3.3
 *日期:2011-08-17
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */
说明:HttpRequest用于request请求
public class HttpRequest {

    /** HTTP GET method */
    public static final String METHOD_GET        = "GET";

    /** HTTP POST method */
    public static final String METHOD_POST       = "POST";

    /**
     * 待请求的url
     */
    private String             url               = null;

    /**
     * 默认的请求方式
     */
    private String             method            = METHOD_POST;

    private int                timeout           = 0;

    private int                connectionTimeout = 0;

    /**
     * Post方式请求时组装好的参数值对
     */
    private NameValuePair[]    parameters        = null;

    /**
     * Get方式请求时对应的参数
     */
    private String             queryString       = null;

    /**
     * 默认的请求编码方式
     */
    private String             charset           = "GBK";

    /**
     * 请求发起方的ip地址
     */
    private String             clientIp;

    /**
     * 请求返回的方式
     */
    private HttpResultType     resultType        = HttpResultType.BYTES;

    public HttpRequest(HttpResultType resultType) {
        super();
        this.resultType = resultType;
    }

    /**
     * @return Returns the clientIp.
     */
    public String getClientIp() {
        return clientIp;
    }

    /**
     * @param clientIp The clientIp to set.
     */
    public void setClientIp(String clientIp) {
        this.clientIp = clientIp;
    }

    public NameValuePair[] getParameters() {
        return parameters;
    }

    public void setParameters(NameValuePair[] parameters) {
        this.parameters = parameters;
    }

    public String getQueryString() {
        return queryString;
    }

    public void setQueryString(String queryString) {
        this.queryString = queryString;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public int getConnectionTimeout() {
        return connectionTimeout;
    }

    public void setConnectionTimeout(int connectionTimeout) {
        this.connectionTimeout = connectionTimeout;
    }

    public int getTimeout() {
        return timeout;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    /**
     * @return Returns the charset.
     */
    public String getCharset() {
        return charset;
    }

    /**
     * @param charset The charset to set.
     */
    public void setCharset(String charset) {
        this.charset = charset;
    }

    public HttpResultType getResultType() {
        return resultType;
    }

    public void setResultType(HttpResultType resultType) {
        this.resultType = resultType;
    }

}

说明:HttpProtocolHandler类是用于Response回复

package com.cmcc.util.alipay.util.httpClient;

import org.apache.commons.httpclient.HttpException;
import java.io.IOException;
import java.net.UnknownHostException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.FilePartSource;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/* *
 *类名:HttpProtocolHandler
 *功能:HttpClient方式访问
 *详细:获取远程HTTP数据
 *版本:3.3
 *日期:2012-08-17
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class HttpProtocolHandler {

    private static String              DEFAULT_CHARSET                     = "GBK";

    /** 连接超时时间,由bean factory设置,缺省为8秒钟 */
    private int                        defaultConnectionTimeout            = 8000;

    /** 回应超时时间, 由bean factory设置,缺省为30秒钟 */
    private int                        defaultSoTimeout                    = 30000;

    /** 闲置连接超时时间, 由bean factory设置,缺省为60秒钟 */
    private int                        defaultIdleConnTimeout              = 60000;

    private int                        defaultMaxConnPerHost               = 30;

    private int                        defaultMaxTotalConn                 = 80;

    /** 默认等待HttpConnectionManager返回连接超时(只有在达到最大连接数时起作用):1秒*/
    private static final long          defaultHttpConnectionManagerTimeout = 3 * 1000;

    /**
     * HTTP连接管理器,该连接管理器必须是线程安全的.
     */
    private HttpConnectionManager      connectionManager;

    private static HttpProtocolHandler httpProtocolHandler                 = new HttpProtocolHandler();

    /**
     * 工厂方法
     *
     * @return
     */
    public static HttpProtocolHandler getInstance() {
        return httpProtocolHandler;
    }

    /**
     * 私有的构造方法
     */
    private HttpProtocolHandler() {
        // 创建一个线程安全的HTTP连接池
        connectionManager = new MultiThreadedHttpConnectionManager();
        connectionManager.getParams().setDefaultMaxConnectionsPerHost(defaultMaxConnPerHost);
        connectionManager.getParams().setMaxTotalConnections(defaultMaxTotalConn);

        IdleConnectionTimeoutThread ict = new IdleConnectionTimeoutThread();
        ict.addConnectionManager(connectionManager);
        ict.setConnectionTimeout(defaultIdleConnTimeout);

        ict.start();
    }

    /**
     * 执行Http请求
     *
     * @param request 请求数据
     * @param strParaFileName 文件类型的参数名
     * @param strFilePath 文件路径
     * @return
     * @throws HttpException, IOException
     */
    public HttpResponse execute(HttpRequest request, String strParaFileName, String strFilePath) throws HttpException, IOException {
        HttpClient httpclient = new HttpClient(connectionManager);

        // 设置连接超时
        int connectionTimeout = defaultConnectionTimeout;
        if (request.getConnectionTimeout() > 0) {
            connectionTimeout = request.getConnectionTimeout();
        }
        httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);

        // 设置回应超时
        int soTimeout = defaultSoTimeout;
        if (request.getTimeout() > 0) {
            soTimeout = request.getTimeout();
        }
        httpclient.getHttpConnectionManager().getParams().setSoTimeout(soTimeout);

        // 设置等待ConnectionManager释放connection的时间
        httpclient.getParams().setConnectionManagerTimeout(defaultHttpConnectionManagerTimeout);

        String charset = request.getCharset();
        charset = charset == null ? DEFAULT_CHARSET : charset;
        HttpMethod method = null;

        //get模式且不带上传文件
        if (request.getMethod().equals(HttpRequest.METHOD_GET)) {
            method = new GetMethod(request.getUrl());
            method.getParams().setCredentialCharset(charset);

            // parseNotifyConfig会保证使用GET方法时,request一定使用QueryString
            method.setQueryString(request.getQueryString());
        } else if(strParaFileName.equals("") && strFilePath.equals("")) {
            //post模式且不带上传文件
            method = new PostMethod(request.getUrl());
            ((PostMethod) method).addParameters(request.getParameters());
            method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; text/html; charset=" + charset);
        }
        else {
            //post模式且带上传文件
            method = new PostMethod(request.getUrl());
            List<Part> parts = new ArrayList<Part>();
            for (int i = 0; i < request.getParameters().length; i++) {
                parts.add(new StringPart(request.getParameters()[i].getName(), request.getParameters()[i].getValue(), charset));
            }
            //增加文件参数,strParaFileName是参数名,使用本地文件
            parts.add(new FilePart(strParaFileName, new FilePartSource(new File(strFilePath))));
           
            // 设置请求体
            ((PostMethod) method).setRequestEntity(new MultipartRequestEntity(parts.toArray(new Part[0]), new HttpMethodParams()));
        }

        // 设置Http Header中的User-Agent属性
        method.addRequestHeader("User-Agent", "Mozilla/4.0");
        HttpResponse response = new HttpResponse();

        try {
            httpclient.executeMethod(method);
            if (request.getResultType().equals(HttpResultType.STRING)) {
                response.setStringResult(method.getResponseBodyAsString());
            } else if (request.getResultType().equals(HttpResultType.BYTES)) {
                response.setByteResult(method.getResponseBody());
            }
            response.setResponseHeaders(method.getResponseHeaders());
        } catch (UnknownHostException ex) {

            return null;
        } catch (IOException ex) {

            return null;
        } catch (Exception ex) {

            return null;
        } finally {
            method.releaseConnection();
        }
        return response;
    }

    /**
     * 将NameValuePairs数组转变为字符串
     *
     * @param nameValues
     * @return
     */
    protected String toString(NameValuePair[] nameValues) {
        if (nameValues == null || nameValues.length == 0) {
            return "null";
        }

        StringBuffer buffer = new StringBuffer();

        for (int i = 0; i < nameValues.length; i++) {
            NameValuePair nameValue = nameValues[i];

            if (i == 0) {
                buffer.append(nameValue.getName() + "=" + nameValue.getValue());
            } else {
                buffer.append("&" + nameValue.getName() + "=" + nameValue.getValue());
            }
        }

        return buffer.toString();
    }
}

 

小伙伴们,我开了一家海淘护肤品淘宝店,搜索店铺“禾子蝶的海淘铺”,正品保证,欢迎进店选购哦。谢谢!
分享到:
评论

相关推荐

    SpringBoot加入Guava Cache实现本地缓存代码实例

    在本文中,我们将介绍如何在 SpringBoot 项目中使用 Guava Cache 实现本地缓存。Guava Cache 是一个高性能的缓存框架,由 Google 开发维护。它提供了一个灵活的缓存机制,可以根据实际需求进行配置。 首先,我们...

    Guava-Cache本地缓存案例代码

    Guava Cache是Google Guava库中的一个强大特性,它提供了高效的本地缓存解决方案,用于存储经常访问的数据,以减少对远程服务或计算的调用,从而提高应用性能。本案例代码将详细介绍Guava Cache的使用,包括缓存的...

    使用google guava 实现定时缓存功能

    综上所述,Google Guava的定时缓存功能使得我们能够轻松地在Java应用中实现高效的缓存机制,有效减少计算和网络请求的负担,提升整体性能。通过灵活的配置和丰富的API,我们可以根据具体需求定制合适的缓存策略。在...

    如何基于LoadingCache实现Java本地缓存

    LoadingCache 是 Guava 库提供的一种缓存实现方式,本文将详细介绍如何基于 LoadingCache 实现 Java 本地缓存。 一、Guava 介绍 Guava 是 Google 开源的一套工具库,其中提供的 cache 模块非常方便,是一种与 ...

    guava-cache.rar

    Guava Cache是Google Guava库中的一个强大特性,它提供了高效的本地缓存解决方案。在许多应用程序中,我们经常需要缓存数据以减少不必要的数据库查询或远程服务调用,提高系统性能。尽管分布式缓存如Redis在高并发和...

    第七章 企业项目开发--本地缓存guava cache1

    总结,Guava Cache是Java开发中实现本地缓存的一个强大工具,它的灵活性和丰富的特性使得缓存管理变得高效且易于维护。在实际项目中,合理地利用Guava Cache,可以显著提升系统性能,减少不必要的I/O操作。同时,...

    springbt_guava_cache.7z

    2. Guava Cache:Google的Guava库中的Cache模块,是一个强大的本地缓存解决方案,支持线程安全、容量限制、自动过期等功能,适用于需要高性能缓存场景。 二、集成Guava Cache 在Spring Boot项目中,我们需要以下...

    Guava-CacheDemo.rar

    Guava Cache是Google Guava库中的一个功能强大的本地缓存实现,它为Java开发者提供了高效、易用的缓存解决方案。Guava Cache的设计目标是为了帮助应用程序在内存中存储经常访问的数据,以减少对远程服务或者数据库的...

    springboot使用GuavaCache做简单缓存处理的方法

    SpringBoot 使用 GuavaCache 实现简单缓存处理 在本篇文章中,我们将介绍如何使用 GuavaCache 在 SpringBoot 项目中实现简单的缓存处理。缓存机制可以减少对外部服务的查询请求,从而提高应用程序的性能。 问题...

    springboot本地缓存(guava与caffeine).docx

    Spring Boot 本地缓存(Guava 与 Caffeine) Spring Boot 中的本地缓存是指在应用程序中存储和检索数据的机制...在 Spring Boot 中,我们可以使用 Guava 或 Caffeine 来实现本地缓存,提高应用程序的性能和响应速度。

    google开源项目guava.jar包

    此外,Guava的Cache模块则提供了一种内存缓存机制,可以根据预设策略自动清除过期的数据,有效提升了应用性能。 Guava对原生类型(如int、char等)提供了泛型支持,避免了装箱拆箱带来的额外开销。例如,Ints、...

    Guava-Cache-Demo:演示如何使用 Guava 缓存

    Guava Cache 是 Google 开源库 Guava 提供的一种高效、易用的缓存解决方案,它旨在帮助开发者在 Java 应用程序中实现本地缓存策略,以提高性能和减少对远程服务的调用。在这个名为 "Guava-Cache-Demo" 的项目中,...

    Guava常用类库 v33.0.0.zip

    2. **缓存机制**:Guava的Cache模块允许开发者创建本地缓存,它可以自动管理资源,如基于引用的过期策略和大小限制。这有助于提高应用程序的性能,减少对远程服务的调用。 3. **并发工具**:Guava提供了强大的并发...

    spring-cache-demo:spring整合guava和redis实现本地和远程缓存

    Guava Cache是Google Guava库的一部分,它是一个强大的本地缓存解决方案。Guava Cache提供了线程安全的缓存实现,支持自定义过期策略、容量限制等特性。在Spring Cache中,Guava Cache可以作为缓存管理器,用于存储...

    guava-r09-jarjar.jar

    2. **缓存**:Guava的Cache模块允许开发者创建本地缓存,可以自动管理缓存项的过期和大小限制。 3. **函数式编程**:Guava提供了Function接口和其他相关类,支持函数式编程风格,可以方便地进行操作转换。 4. **...

    Java缓存Map设置过期时间实现解析

    Guava是一个由Google开源的Java库,提供了LoadingCache来缓存数据。LoadingCache是一个线程安全的本地缓存解决方案,提供缓存回收机制,监控缓存加载/命中情况,灵活强大的功能,简单易上手的API。 4. ExpiryMap...

    spring-boot-redis-guava-caffeine-cache:springboot 使用 redis guava caffeine 缓存示例

    Guava Cache是Google Guava库的一部分,提供了一个本地内存缓存解决方案。在Spring Boot中,我们可以创建一个`CacheManager`的实现,使用`GuavaCacheManager`并配置缓存大小、过期策略等。Guava Cache适用于对数据...

    Getting Started with Google Guava code

    2. **缓存**:Guava 提供了一个强大的本地缓存实现,允许你轻松地创建和管理缓存,支持基于引用的自动过期和手动刷新策略。 3. **并发工具**:Guava 提供了线程安全的数据结构,如 LoadingCache 和 Lists....

    springboot 使用 redis guava caffeine 缓存示例.zip

    Guava Cache是Google Guava库提供的一个本地缓存解决方案,它提供了丰富的缓存配置选项,如过期策略、容量限制等。在Spring Boot中使用Guava Cache,需要添加Guava依赖,并配置缓存管理器: ```xml &lt;groupId&gt;...

    google guava

    Guava的Cache模块是其一大亮点,它提供了一种强大的本地缓存解决方案。开发者可以通过自定义加载函数、过期策略、大小限制等方式来管理缓存。缓存的使用可以显著提高应用程序的性能,减少对远程服务或数据库的访问...

Global site tag (gtag.js) - Google Analytics