ES API

1.maven引入ElasticSearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>

more >>

京东ElasticSearch应用

    京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况。
    我们把订单数据存储在MySQL中,但显然只通过DB来支撑大量的查询是不可取的。同时对于一些复杂的查询,MySQL支持的不够友好,所以订单中心系统使用了ElasticSearch来承载订单查询的主要压力。

more >>

提升系统性能

    提升Web应用的性能从未像今天这样刻不容缓。在线经济活动的比例日益提高,就连发展中国家和地区的经济活动都已经有5%以上在线进行了。在这个超级链接、随时在线的现代世界,用户的期望也远非昔日可比。如果你的网站不能马上响应,你的应用不能立即运行,用户转身就会投奔你的竞争对手。

more >>

分布式锁用Redis还是Zookeeper

为什么用分布式锁?
    在讨论这个问题之前,我们先来看一个业务场景:
        系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。
        由于系统有一定的并发,所以会预先将商品的库存保存在redis中,用户下单的时候会更新redis的库存。

more >>

解决数据库跨库查询

前言
    在服务做微服务改造后,原先单库join查询已经不能满足要求,每个拆分的微服务对应一个数据库实例,而且部署在不同的服务器上,那么解决“跨库查询”就势在必行了。
微服务结构
    以下几个思路仅供参考:

more >>

为什么ArrayList集合中不能使用foreach增删改

    编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。
    请看下面两段代码,哪段代码会报错呢,或者都成功呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<String> arrayList1 = new ArratList<String>();
arrayList1.add("1");
arrayList1.add("2");
for(String s : arrayList1) {
if("1".equals(s)) {
arrayList1.remove(s);
}
}

List<String> arrayList2 = new ArratList<String>();
arrayList2.add("2");
arrayList2.add("1");
for(String s : arrayList2) {
if("1".equals(s)) {
arrayList2.remove(s);
}
}

more >>

SQL别用count查找是否存在

根据某一条件从数据库表中查询“有”与“没有”,只有两种状态,那为什么在写SQL的时候,还要SELECT COUNT(*)呢?无论是刚入道的程序员新星,还是久经沙场的程序员老白,还是一如既往的count.
目前多数人的写法
    多次review代码,发现如下现象:
        业务代码中,需要根据一个或多个条件,查询是否存在记录,不关心有多少条记录。普遍的SQL及代码写法如下:

1
2
3
4
5
6
7
8
9
// SQL写法
SELECT COUNT(*) FROM TABLE WHERE COLCOMN1 = 'A' AND COLCOMN2 = 'B'
// java写法
int num = XXdao.countXXbyXXX(paramer);
if(num > 0) {
// 当存在时,执行这里的代码
} else {
// 当不存在时,执行这里的代码
}

    是不是感觉很OK,没有什么问题。

more >>

一个HTTP请求的曲折经历

从一个经典的面试题说起,输入URL到页面展现的过程:
    1.输入URL后,会先进行域名解析。优先查找本地host文件有无对应的IP地址,没有的话去本地DNS服务器查找,还不行的话,本地DNS服务器会去找根DNS服务器需要一个域服务器的地址进行查询,域服务器将要查询的域名的解析服务器地址返回给本地DNS,本地DNS去这里查询就OK了。
    2.浏览器拿到服务器的IP地址后,会向它发送HTTP请求。HTTP请求经由一层层的处理、封装、发出之后,最终经由网络到达服务器,建立TCP/IP连接,服务器接收到请求并开始处理。
    3.服务器构建响应,再经由一层层的处理、封装、发出后,到达客户端,浏览器处理请求。
    4.浏览器开始渲染页面,解析HTML,构建render树,根据render树的节点和CSS的对应关系,进行布局,绘制画面。

more >>

分布式系统消息异常

1.异步处理模型
    一旦谈到分布式、微服务等这些具有很高逼格的代名词,总能让你在面试中脱颖而出,不是因为这些词的英文翻译的好,而是现代互联网乃至企业级开发确实在分布式、微服务等模式下取得了良好的架构效果。无论是微服务,还是之前的SOA,总是离不开异步处理模型,小到程序中IO的处理,大到系统间的信息交互,处处都有异步的身影。

more >>