0%

hive中没有group_concat

mysql中有group_concat进行分组之后连接多个字段,非常好用,最近使用hive时需要用到相同的功能,一开始写的是mysql语句,结果发现报错了,hive中没有这个function

好吧,没有的话就得找一下有没有可替代的方法,后来找到了concat_ws和collect_set进行组合来解决

1
2
3
4
select dcm.doc_id as doc_id,concat_ws(',',collect_set(cate.NAME)) as name
from dcm
left join cate on cate.id = dcm.categories_id
group by dcm.doc_id

SYN Flood攻击

在说SYN Flood攻击之前先说一下SYN超时重试

SYN超时重试

这个指的是server端接收到client发出的SYN后回了SYN-ACK后client掉线了,server端没有接收到client传回来的ACK,这时,server端会重发SYN-ACK,默认重发5次,重试的间隔从1s开始指数递增,时间间隔分别为1s、2s、4s、8s、16s,在第五次发送后需要等待32s才知道第五次也超时了,所以一共需要63sserver端才会断开这个TCP连接

SYN Flood

SYN Flood攻击就是利用的SYN超时重试的机制,给server端发送一个SYN之后就断掉,然后server端需要等待63s才会断开连接,这样可以将服务器的syn连接的队列耗尽,导致正常请求无法进行连接

那么如何防止呢?

linux提供了一个tcp_syncookies的参数,作用是当SYN队列满了后,TCP会通过源地址端口、目标地址端口和时间戳打造一个特别的Sequence Number发回去,如果是攻击者,则不会响应,如果是正常连接,则会把这个SYN Cookie发回来,然后服务端可以通过cookie建立连接,即使该连接不在SYN队列中

还有三个参数也是用来调整这个问题的

  • tcp_synack_retries 设置重试次数,可以减少重试次数
  • tcp_max_syn_backlog 设置syn连接数,可以增大syn连接数
  • tcp_abort_on_overflow 处理不过来的话就直接拒绝连接

简单工厂模式

简单工厂模式是提供一个创建对象实例的功能,而无需关心具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private final TransactionManager transactionManager;

public SimpleTransactionFactory(TransactionManager transactionManager) {
Assert.notNull(transactionManager, "TransactionManager must not be null");
this.transactionManager = transactionManager;
}


@Override
public Transaction createTransaction(String name, int timeout) throws NotSupportedException, SystemException {
if (timeout >= 0) {
this.transactionManager.setTransactionTimeout(timeout);
}
this.transactionManager.begin();
return new ManagedTransactionAdapter(this.transactionManager);
}

用户只要产品,而不关心产品如何生产,其需要在工厂类中包含必要的逻辑判断,根据客户端的选择来动态实例化相关的类,但是每次添加新的产品,都需要在工厂中加入新的判断逻辑

Nginx配置优化

name相同问题

在使用@FeignClient的时候,发现多个@FeignClient中的name相同就无法启动,当然了,这是因为bean名称重复了,创建bean的时候报的错,但是如何解决呢?

可以配置不同的contextId来进行解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@FeignClient(name = "SPRINGCLOUD2-PROVIDER",contextId = "DeptClient",fallbackFactory = DeptClientFallBackFactory.class)
public interface DeptClient {

@GetMapping(value = "/dept/get/{id}")
CommonResult<Dept> get(@PathVariable("id") long id);

@GetMapping("/timeout")
String timeout();
}


@FeignClient(name = "SPRINGCLOUD2-PROVIDER",contextId = "DeptClient1",fallbackFactory = DeptClientFallBackFactory.class)
public interface DeptClient1 {

@GetMapping(value = "/dept/get/{id}")
CommonResult<Dept> get(@PathVariable("id") long id);

@GetMapping("/timeout")
String timeout();
}

为什么可以这样解决呢?

阅读全文 »

elasticsearch6.x查询优化

查询缓存

Elasticsearch的查询缓存实现了LRU置换算法:当缓存变满时,最近最少使用的数据被置换以便为新数据腾出空间

使用查询缓存和请求缓存来加快查询速度

1
index.queries.cache.enabled: true

查找查询慢的原因

查看热点线程

1
GET /_nodes/hot_threads

Shiro简介

Shiro是一个开源的安全框架,可以进行身份认证、访问控制授权、会话管理以及加密等

  • Authentication 身份验证
  • Authorization 授权
  • Session Management 用户session管理器
  • Crytography 加密
阅读全文 »

ip存储

ip使用long类型进行存储即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static long ipToLong(String ipString) throws NumberFormatException {
long result = 0;
String[] terms = ipString.split("\\.");
if (terms.length != 4) {
return -1;
}
result += Long.parseLong(terms[0]) << 24;
result += Long.parseLong(terms[1]) << 16;
result += Long.parseLong(terms[2]) << 8;
result += Long.parseLong(terms[3]);
return result;
}

public static String longToIp(long ipLong) {
return (ipLong >>> 24) + "." +
((ipLong >>> 16) & 0xFF) + "." +
((ipLong >>> 8) & 0xFF) + "." +
(ipLong & 0xFF);
}

public static void main(String[] args) {
long result = ipToLong("255.255.255.255");
System.out.println(result);
System.out.println(longToIp(result));
}

Lucene的Field域

Field属性中有几个需要说明一下

  • 是否分词(tokenized)
    • 是:做分词处理,将Field值进行分词,目的是为了索引,如商品名称、描述等
    • 否:不做分词处理,如商品id、订单号等
  • 是否索引(indexed)
    • 是:进行索引,将Field分词后的词或整个Field值进行索引,存储到索引域,目的是为了搜索,如商品名称进行分词后进行索引,而订单号不进行分词也要进行索引,可用于作为查询条件
    • 否:不索引,如文件路径、图片路劲等不会进行查询条件的不进行索引
  • 是否存储(stored)
    • 是:将Field值存储在文档域中,存储在文档域中的Field才可以从Document中获取
    • 否:不存储Field值,对于内容过大的可以不放到field中存储,如果需要展示可以从数据库中获取

集群发现机制

elasticsearch默认的discovery机制是zen discovery,zen discovery机制是elasticsearch的内建模块,提供了多播和单播两种发现方式,集群发现节点间通信是依赖于transport module

集群发现分为几个子模块

ping

这是一个节点使用发现机制去寻找其他节点的进程,同时支持多播和单播方式的发现

unicast单播

1
discovery.zen.ping.unicast.hosts: ["0.0.0.0"]