Java 七牛缓存刷新

来源:互联网 发布:java 线程模型 编辑:程序博客网 时间:2024/05/16 09:37

由于七牛提供的文档不怎么好懂(有的功能根本在api中在不到答案),另外百度搜索的答案也不尽如意。折腾了两天,终于搞懂了通过调用七牛提供的API去刷新缓存!!

场景:APP中关于帮助说明原先都是写死的html静态文件,每次更改内容都是直接去服务器去改,很不方便也不安全,然后现在想通过后台去维护这些数据,而我们公司使用的就是七牛来管理文件的。所以现在的需求就是:①、通过后台使用七牛来管理这些文件;②、app不做任何更改。


1、通过后台使用七牛来管理文件。参考官网api,地址:http://developer.qiniu.com/code/v7/sdk/java.html。


2、既然App不做任何更改,所以需要做到覆盖上传。在实际开发时,发现覆盖能成功覆盖文件内容,但是缓存那是相当的严重!本来可以通过在访问地址后台带上随机的参数可以获取最新的文件内容,但是违背了“app不做任何更改”的原则。最后发现可以通过七牛提供的api去刷新缓存:

private static final String MAC_NAME = "HmacSHA1";private static final String ENCODING = "UTF-8";/** * 刷新七牛缓存 *  * @param url * @param params * @param codePage * @return * @throws Exception */public synchronized static String postDataByAuthorization(String url, String jsonString, String codePage)throws Exception {HttpPost method = new HttpPost(url);// 设置请求和传输超时时间RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(200 * 1000).setConnectTimeout(200 * 1000).build();method.setConfig(requestConfig);// Authorization值为 "QBox <ak>:<token>"method.addHeader("Authorization", "QBox " + QiniuUtil.ACCESS_KEY + ":" + getTokenOfQiniu());method.setHeader("Content-type", "application/json; charset=utf-8");method.setHeader("Accept", "application/json");method.setEntity(new StringEntity(jsonString, Charset.forName(codePage)));CloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpResponse response = httpClient.execute(method);return EntityUtils.toString(response.getEntity());}/** * 获取七牛缓存刷新的token *  * @return * @throws Exception */private static String getTokenOfQiniu() throws Exception {byte[] sign = hmacSHA1Encrypt("/v2/tune/refresh\n", QiniuUtil.SECRET_KEY);String encodedSign = EncodeUtils.urlsafeEncodeString(sign);return encodedSign;}/** * 使用 HMAC-SHA1 签名方法对对encryptText进行签名 *  * @param encryptText 被签名的字符串 * @param encryptKey 密钥 * @return * @throws Exception */public static byte[] hmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception {byte[] data = encryptKey.getBytes(ENCODING);// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);// 生成一个指定 Mac 算法 的 Mac 对象Mac mac = Mac.getInstance(MAC_NAME);// 用给定密钥初始化 Mac 对象mac.init(secretKey);byte[] text = encryptText.getBytes(ENCODING);// 完成 Mac 操作return mac.doFinal(text);}</span>

说明:

1、在刷新缓存过程中,主要是token大家不知道怎么生成,也是我费时最多的!可以参考我上面生成token的代码,也可以参考官网通过shell命令生成token(地址:http://developer.qiniu.com/article/fusion/api/refresh.html#refresh-request-message);

2、遗憾的是,通过api去刷新缓存也不是实时的,还是会有大概10分钟左右的缓存时间,不过总比一直缓存这强......我也是醉了。


好了最后总结,如果不想被缓存这么,可以在生成文件的时候,传入随机的key,这样访问的地址就不固定了,也就不会出现缓存问题;如果访问url必须固定,可以在url地址后加上随机参数(例如v=20160921154089881212);如果不能增加参数,想我遇到的这种情况一样的,就像我这样调用api就好了。



1 0
原创粉丝点击