# 02-知识点

## 一.ElasticSearch

elasticSearch 和 mysql的对比

| elasticSearch |      mysql     |
| :-----------: | :------------: |
|    索引index    |   相当于  数据库db   |
|     类型type    |     相当于  表     |
|   文档document  | 相当于  表的一条记录row |

分词器：中文分词器（IK）

## 二.elasticsearch-head

```
elasticsearch-head是一个node的项目，运行之后可以以图形化界面显示连接的es的   
索引、类型、文档、以及健康状态
```

## 三.Logstash

```
可用于同步数据库中的数据到elasticsearch  
可以定时执行脚本从mysql中读取数据，同步到elasticsearch中或输出到控制台 
定时支持corn脚本  
在logstash的bin目录下执行脚本：logstash -f 脚本.conf  

也可以自己代码实现，然后用定时器执行   
```

## 四.RabbitMQ 消息中间件

```
消息中间件的应用场景：异步处理、应用解耦、流量削锋
异步处理：发送邮件、发送短信
应用解耦
流量削锋

RabbitMQ是Erlang语言开发的
```

ActiveMQ 和 RabbitMQ对比

| ActiveMQ |  RabbitMQ |
| :------: | :-------: |
| JMS规范的实现 | AMQP协议的实现 |

## 五.加密

```
可逆不可逆分类
可逆：
不可逆：md5、BCrypt         应用场景：密码      
```

## 六.项目中常见的4中认证方式

## 七.mysql数据库的引擎的区别

```
innodb：支持事物，默认行级锁，InnoDB是MySQL默认的存储引擎 
MyISAM：默认表级锁，直接锁定整张表，在你锁定期间，其它进程无法对该表进行写操作    
```

## 八.悲观锁和乐观锁

```
1.悲观锁：比较悲观的认为我在操作一共享数据时，别的线程也会去修改，所以一上来就加锁。实现有：synchronized    

2.乐观锁：比较乐观的认为我在操作一共享数据时，别的线程不会去修改，所以不用一上来加锁。  
  一般会在操作之前读取下数据的值，在真正修改好要提交的时候再去查询下该数据是否还是原来的值，  
  如果不是就不提交，因为这期间有人修改了。如果是才提交。这里有一个问题，再次查询的时候数据和  
  原来数据一致也不能说明这期间就没有别的线程修改过，也可能是先修改为另一个值再改为原来的值，这就是ABA的问题。   
  所以一般乐观锁在数据库的实现是新添加一个version字段，每次修改都加1 。  
  准备提交数据前后version都一致，说明没有别的线程改动过，可以提交，并且将version+1；   
  如果准备提交后的version大于准备提交前的，说明别的线程改动过，则不提交，可以延时再重复尝试，重复尝试这里也叫自旋   (代码上体现可就是sleep(200)之后再调用修改方法自身)  

  乐观锁的应用场景：秒杀场景中的扣库存   
```

## 九.mysql 中的count(\*)、count(1)、count(字段)的区别

```
1.count(*)和count(1)本质上和效率上都是一样的，不过count(*)更官方一点，alibaba java开发手册中建议使用count(*)   

2.count(*)、count(1) 统计的允许null值，count(字段查询)统计的是非null的row   
```

## 十.sleep、wait、notify、notifyAll的区别和联系

```
1.sleep是Thread类里的静态方法，wait、notify、notifyAll是Object类里的方法  
2.sleep不释放锁，wait释放锁；sleep不出让系统资源；wait是进入线程等待池等待，出让系统资源  
3.wait，notify和notifyAll只能在同步控制方法或者同步控制块里面使用，而sleep可以在任何地方使用  
4.sleep、wait必须捕获异常，而notify和notifyAll不需要捕获异常 

5.Thread.yield方法会让出系统资源，让当前正在执行的线程回到runnable状态，   
  再次抢到cpu执行权后接着上次暂停的代码继续执行
```
