我有一个S3存储桶,其上面有CloudFront CDN.
这个S3存储桶是"不可变的",这意味着一旦我在那里上传文件,我就永远不会删除它或更新它.所有客户端都可以非常积极地缓存来自S3/CloudFront的文件.
目前,Etags工作得非常好,客户大多数时间都会收到304回复.但是获得304响应仍然需要通过更积极的缓存来避免往返.
所以我想要这样的行为:
CloudFront CDN缓存永远不会失效,因为S3缓存永远不会更改.CloudFront不需要再次向S3询问文件多次.我想我已经使用CloudFront分配设置成功配置了它.
CloudFront应该使用标头提供所有文件Cache-Control: max-age=365000000, immutable(截至2016年,immutable是一个新的,部分支持的值)
我不明白我怎样才能达到预期的效果.我应该在CloudFront或S3级别处理吗?我已经阅读了一些关于为每个S3文件配置适当标头的内容.是不是有一个全局设置来提供我可以使用的自定义http标头的所有文件?
caching cache-control amazon-s3 amazon-web-services amazon-cloudfront
我不是那么有经验,但我在一些大型Java EE项目(使用maven2)上工作,使用非常独特的方式来处理不同平台上的安装/交付.
1)其中之一是使用快照进行开发,然后发布组件和主要Web应用程序的maven版本.因此交付是:
团队将使用该文件将新的应用程序版本放在不同的平台上.我认为这个过程是严格的,并且允许你总是容易地保持生产中传递的不同配置,但它不是很灵活,过程有点沉重,它让我们有时做一些肮脏的事情,比如重写一类战争补丁回归......这是一个电子商务网站,每月有1000万独立访客,可用率为99.89%.
2)我看到的另一个是检查每个平台上的源,然后将快照工件安装在本地存储库中.然后,应用程序服务器将使用.m2文件夹的这些快照.没有真正的交付流程,因为要将新版本投入生产,我们只需要更新组件/ webapps的来源,做一些maven clean install并重新启动应用程序服务器.我认为它更灵活,但我看到一些缺点,这种方法对我来说似乎很危险.这个网站有一个前台,我不知道数字,但它远远少于第一个.它还为13万人公司的大多数员工提供了一个很大的后台.
我想根据网站,公众展示和所需的可用性,我们必须根据需要调整交付策略.
我不是在问这个解决方案是最好的,但想知道你是否看到了不同的东西,以及你会在哪种情况下使用哪种策略?
我只是想了解使用访问者模式的主要好处.
这是一个Java实现示例
///////////////////////////////////
// Interfaces
interface MamalVisitor {
void visit(Mammal mammal);
}
interface MammalVisitable {
public void accept(MamalVisitor visitor);
}
interface Mammal extends MammalVisitable {
public int getLegsNumber();
}
///////////////////////////////////
///////////////////////////////////
// Model
class Human implements Mammal {
@Override
public void accept(MamalVisitor visitor) { visitor.visit(this); }
@Override
public int getLegsNumber() { return 2; }
}
//PIRATE HAS A WOOD LEG
class Pirate extends Human {
@Override
public int getLegsNumber() { return 1; }
public int getWoodLegNumber() { return 1; } …Run Code Online (Sandbox Code Playgroud) 在回答有关此问题的问题时:https://stackoverflow.com/a/9872630/82609
我试着做以下事情:
Comparator<String>[] comparators = new Comparator[] {...};
Run Code Online (Sandbox Code Playgroud)
有用!但以下不是:
Comparator<String>[] comparators = new Comparator<String>[] {...};
Run Code Online (Sandbox Code Playgroud)
在相关问题上,我做了以下假设:
我想这是因为最初的数组合约可能是这样的:
如果你创建一个X类型的数组,你将永远不能在其中放入任何IS-NOT-AN X.如果你尝试,你会得到一个ArrayStoreException
因此,允许使用泛型创建的数组会导致不同的规则,例如:
如果你创建一个类型的数组
X<Y>,你将永远不能放置任何IS-NOT-AN X.如果你尝试,你将得到一个ArrayStoreException.但是你可以添加两个X<Y>和X<Z>对象,因为类型擦除!
但是考虑一下,它真的会成为一个问题:
Comparator<String>[] comparators = new Comparator<String>[] {...};
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么它不可能,因为使用这样的东西会:
最后,我们可以使用具有泛型类型引用的数组,并且由于不可能创建具有泛型类型的数组,我想很多人甚至不知道它是可能的.
我只是想知道是否有人知道这个选择背后的原因?
这有点像强迫人们使用List<String> = new ArrayList();而不是使用List<String> = new ArrayList<String>();
dimitrisli你从约书亚布洛赫的着名书中给出了一个很好的例子.正如您/他解释的那样,使用泛型数组+协方差并且可能导致ClassCastException是危险的,而我们期望使用协方差从数组中获取ArrayStoreException.
但请注意以下内容仍然合法且导致相同:
List<String>[] stringLists = new List[1];
List<Integer> intList = Arrays.asList(42);
Object[] objects = stringLists;
objects[0] = intList;
String s = stringLists[0].get(0);
Run Code Online (Sandbox Code Playgroud)
但是,它会在编译时生成未经检查的强制转换警告,正如您所提到的,在运行时会产生ClassCastException.
当我使用带有edgengram的分析器(min = 3,max = 7,front)+ term_vector = with_positions_offsets
使用text ="CouchDB"的文档
当我搜索"couc"时
我的亮点是"cou"而不是"couc"
似乎我的亮点仅在于最小匹配令牌"cou",而我希望在准确的令牌上(如果可能)或至少找到最长的令牌.
它使用term_vector = with_positions_offsets分析文本时工作正常
删除term_vector = with_positions_offsets的性能有什么影响?
在Monad中定义多个flatMap(或>>=/ bind在Haskell中)方法是否有意义?极少数单子我实际使用(Option,Try,Either投影)只定义一个flatMap方法.
例如,定义一个flatMap方法Option可以生成一个函数Try吗?那么这样Option[Try[User]]就会被夷为平地Option[User]?(考虑失去异常不是问题......)
或者monad应该只定义一个flatMap方法,采用产生相同类型monad的函数?我想在这种情况下,Either预测不会是monad?是吗?
我想从一些网址下载图片.对于一些图片它工作正常,但对于其他人我得到403错误.
例如,这个:http://blog.zenika.com/themes/Zenika/img/zenika.gif
此图片访问不需要任何身份验证.您可以单击链接上的自己,并使用200状态代码验证它是否可用于您的浏览器.
以下代码生成异常:new java.net.URL(url).openStream().同样的,在引擎盖下org.apache.commons.io.FileUtils.copyURLToFile(new java.net.URL(url), tmp)使用相同的openStream()方法.
java.io.IOException: Server returned HTTP response code: 403 for URL: http://blog.zenika.com/themes/Zenika/img/zenika.gif
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626) ~[na:1.7.0_45]
at java.net.URL.openStream(URL.java:1037) ~[na:1.7.0_45]
at services.impl.DefaultStampleServiceComponent$RemoteImgUrlFilter$class.downloadAsTemporaryFile(DefaultStampleServiceComponent.scala:548) [classes/:na]
at services.impl.DefaultStampleServiceComponent$RemoteImgUrlFilter$class.services$impl$DefaultStampleServiceComponent$RemoteImgUrlFilter$$handleImageUrl(DefaultStampleServiceComponent.scala:523) [classes/:na]
Run Code Online (Sandbox Code Playgroud)
我使用Scala/Play Framework开发.我试图使用内置的AsyncHttpClient.
// TODO it could be better to use itetarees on the GET call becase I think AHC load the whole body in memory
WS.url(url).get.flatMap { res =>
if (res.status >= 200 && res.status < 300) {
val bodyStream = res.getAHCResponse.getResponseBodyAsStream …Run Code Online (Sandbox Code Playgroud) 我正在寻找的是某种程度上相当于在SQL中做:
WHERE 1 = 0
Run Code Online (Sandbox Code Playgroud)
我正在寻找这样的东西,因为我正在构建一个类型安全的DSL来对我的域执行查询,支持连接和析取.有时,添加一个永远不匹配任何内容的查询可能更容易,而不是在代码中处理它.
例如,在我的用例中:
StampleFilters().underCategoryIds(sharedCategoryIds.toList)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它不能按预期工作,因为它sharedCategoryIds是空的,因此它会导致查询$(),但不会过滤任何内容.对于一个空列表,我宁愿构建一个永远不会返回任何内容的查询.
有没有一种简单的方法来做这样的事情,对表演没有任何影响?
我可能会添加一些查询,{ somefield: unexistingvalue }但我想知道是否没有更好的.
编辑
我希望表达式是可组合的.我的意思是它应该在查询中工作,例如$or(exp1,exp2,exp3)在哪里例如exp1永远不匹配的表达式.
如果您有任何建议,那么解释为什么一个比其他人更好以及它如何影响查询引擎性能(或不是)会更好
我有一个使用Facebook的Flux架构开发的网络应用程序.该页面有两个视图:一个显示TODO项目列表.第二个视图显示一组随机的TODO项目.
显然,商店需要管理两个问题.第一个是可用的TODO列表.第二个是随机选择的TODO项目列表.
因此TODOStore,我有一个,他唯一关心的是管理可用的TODO项目.它有行动loadTODOs,addTODO,deleteTODO,editTODO.在启动时,此商店不会加载所有TODO项目.我希望它仅在必要时从数据库中检索TODO项目列表.
第二家商店是RandomTODOListStore.它的职责是管理随机选择的TODO项目.在我看来RandomTODOListStore应该通过TODOStore使用来访问TODO项目TODOStore.getTODOItems().
function RandomTODOListStore() {
var $randomTODOs = [];
dispatcher.register(function(payload) {
var action = payload.action;
switch (action.actionType) {
case Constants.LOAD_RANDOM_TODO:
loadRandomTODO();
break;
}
});
function loadRandomTODO() {
$randomTODOs = selectRandom(TODOStore.getTODOList());
emit("change");
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题是,如前所述,TODOStore它不会在启动时加载TODO项目.
问题是:"如何RandomTODOListStore保证TODOStore已经检索到TODO项目?" .
假设我有一个ReactElementclassName,我想在其className中添加一个新类,而不覆盖现有的className.我该怎么做?
我尝试了以下但它确实覆盖了现有的className:
var hello = <Hello name="World" className="base"/>;
hello = React.cloneElement(hello,{className: "text1"});
hello = React.cloneElement(hello,{className: "text2"});
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案有效
var hello2 = <Hello name="World" className="base"/>;
hello2 = React.cloneElement(hello2,{className: hello2.props.className + " test1"});
hello2 = React.cloneElement(hello2,{className: hello2.props.className + " test2"});
Run Code Online (Sandbox Code Playgroud)
但是这样安全ReactElement.props吗?它是ReactElement的公共API的一部分,并且应该在将来保持反向兼容吗?我无法在文档中找到它.
还有另一种方法来实现这一目标吗?