查看: 1049|回复: 85
打印 上一主题 下一主题

[JAVA] BAT架构师大牛分布式数据搜索实战 基于Elasticsearch作底层架构大数量级搜索实战

  [复制链接]

13

主题

142

帖子

851

积分

Kib

Rank: 3Rank: 3

贡献
-79
技术
106
活跃
26
在线时间
2 小时
擅长技术
思科88必发官网手机版
跳转到指定楼层
楼主
发表于 2019-5-2 09:51:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
BAT架构师大牛分布式数据搜索实战 基于Elasticsearch作底层架构大数量级搜索实战








===============课程目录===============


(0);目录中文件数:1个
├─(1) project.zip
(1)\十三章;目录中文件数:2个
├─(2) 13-1 单元测试覆盖率报告.mp4
├─(3) 13-2 线上线下配置分离.mp4
(2)\十二章;目录中文件数:5个
├─(4) 12-1 业务与功能分析设计.mp4
├─(5) 12-2 Logstash应用.mp4
├─(6) 12-3Logstash应用2.mp4
├─(7) 12-4 数据可视化分析.mp4
├─(8) 12-5 数据可视化分析2.mp4
(3)\十四章;目录中文件数:1个
├─(9) 14-1 课程总结.mp4
(4)\第一章;目录中文件数:3个
├─(10) 1-1导学.mp4
├─(11) 1-2 技术选型介绍.mp4
├─(12) 1-3 学习建议.mp4
(5)\第七章;目录中文件数:5个
├─(13) 7-1 功能与分析设计.mp4
├─(14) 7-2 默认排序实现.mp4
├─(15) 7-3 默认排序实现2.mp4
├─(16) 7-4 其他维度排序实现.mp4
├─(17) 7-5 房源信息详情页.mp4
(6)\第三章;目录中文件数:4个
├─(18) 3-1 环境要求.mp4
├─(19) 3-2 后端框架搭建.mp4
├─(20) 3-3 集成单元测试.mp4
├─(21) 3-4 前端集成.mp4
(7)\第九章;目录中文件数:10个
├─(22) 9-1 业务与功能分析.mp4
├─(23) 9-10 基于百度一下">支持支持 反对反对

88必发官网 - 论坛版权1、88必发官网为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和88必发官网的同意
7、88必发官网管理员和版主有权不事先通知发贴者而删除本文

0

主题

477

帖子

3080

积分

论坛贵宾VIP-永久权限

Rank: 8Rank: 8

贡献
-100
技术
0
活跃
175
在线时间
105 小时
沙发
发表于 2019-5-2 10:37:42 | 只看该作者
11111111111

3

主题

6405

帖子

4万

积分

Cib

Rank: 13Rank: 13Rank: 13Rank: 13

贡献
0
技术
0
活跃
10329
在线时间
393 小时
板凳
发表于 2019-5-2 10:50:43 | 只看该作者
谢谢分享,和三通IT一起成长。

1

主题

1896

帖子

1万

积分

Nib

Rank: 11Rank: 11Rank: 11Rank: 11

贡献
0
技术
0
活跃
3024
在线时间
144 小时
地板
发表于 2019-5-2 11:02:37 | 只看该作者

谢谢分享,和三通IT一起成长。

0

主题

4644

帖子

3万

积分

Cib

Rank: 13Rank: 13Rank: 13Rank: 13

贡献
0
技术
-1
活跃
7238
在线时间
346 小时
5#
发表于 2019-5-2 12:10:21 | 只看该作者

11111111111

0

主题

24

帖子

158

积分

论坛贵宾VIP-永久权限

Rank: 8Rank: 8

贡献
0
技术
0
活跃
28
在线时间
3 小时
6#
发表于 2019-5-2 13:29:56 | 只看该作者
这个对seo有帮助吗?

0

主题

1639

帖子

1万

积分

Nib

Rank: 11Rank: 11Rank: 11Rank: 11

贡献
0
技术
0
活跃
2482
在线时间
98 小时
7#
发表于 2019-5-2 14:49:54 | 只看该作者
(一)可重入性
可重入性描述这样的一个问题:一个线程在持有一个锁的时候,它内部能否再次(多次)申请该锁。如果一个线程已经获得了锁,其内部还可以多次申请该锁成功。那么我们就称该锁为可重入锁。通过以下伪代码说明:

void methodA(){
    lock.lock(); // 获取锁
    methodB();
    lock.unlock() // 释放锁
}

void methodB(){
    lock.lock(); // 获取锁
    // 其他业务
    lock.unlock();// 释放锁
}
1
2
3
4
5
6
7
8
9
10
11
可重入锁可以理解为锁的一个标识。该标识具备计数器功能。标识的初始值为0,表示当前锁没有被任何线程持有。每次线程获得一个可重入锁的时候,该锁的计数器就被加1。每次一个线程释放该所的时候,该锁的计数器就减1。前提是:当前线程已经获得了该锁,是在线程的内部出现再次获取锁的场景

(二)Lock接口,ReentrantLock说明
2.1 Lock接口说明
Modifier and Type        Method        Description
void        lock()        获取锁
void        lockInterruptibly()        除非当前线程被中断,否则获取锁定
Condition        newCondition()        返回绑定到此Lock实例的新Condition实例
boolean        tryLock()        只有在调用时它是空闲的才能获取锁
boolean        tryLock(long time, TimeUnit unit)        如果在给定的等待时间内空闲并且当前线程未被中断,则获取锁
void        unlock()        释放锁
2.2 ReentrantLock实现说明
ReentrantLock是Lock接口的一个实现类。为了演示Lock接口的方法,我们以ReentrantLock作为示例说明。

2.2.1 lock(),unlock()方法说明
该demo模拟电影院的售票情况,tickets总票数。开启了10个窗口售票,售完为止

public class ReentrantLockDemo01 implements Runnable {

    private Lock lock = new ReentrantLock();

    private int tickets = 200;

    @Override
    public void run() {
        while (true) {
            lock.lock(); // 获取锁
            try {
                if (tickets > 0) {
                    TimeUnit.MILLISECONDS.sleep(100);
                    System.out.println(Thread.currentThread().getName() + " " + tickets--);
                } else {
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock(); // 释放所
            }
        }
    }

    public static void main(String[] args) {
        ReentrantLockDemo01 reentrantLockDemo = new ReentrantLockDemo01();
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(reentrantLockDemo, "thread" + i);
            thread.start();
        }
    }
}
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
26
27
28
29
30
31
32
33
2.2.2 lockInterruptibly()方法说明
从Lock的源码可以看出:lockInterruptibly() 抛出中断异常

void lockInterruptibly() throws InterruptedException;
1
在synchronize关键字中,同步代码块发送阻塞的情况,例如:wait(),sleep(),jion()等情况下,可以被中断。中断并不意味着线程已经终止

代码示例如下:

public class ReentrantLockDemo02 implements Runnable {

    private Lock lock = new ReentrantLock();

    @Override
    public void run() {
        try {
            lock.lockInterruptibly();
            System.out.println(Thread.currentThread().getName() + " running");
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + " finished");
            lock.unlock();
        } catch (InterruptedException e) {
            System.out.println(Thread.currentThread().getName() + " interrupted");
        }
    }

    public static void main(String[] args) {
        ReentrantLockDemo02 reentrantLockDemo = new ReentrantLockDemo02();
        Thread thread01 = new Thread(reentrantLockDemo, "thread01");
        Thread thread02 = new Thread(reentrantLockDemo, "thread02");
        thread01.start();
        thread02.start();
        thread02.interrupt();
    }
}
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
26
输出结果:

thread01 running
thread02 interrupted
thread01 finished
1
2
3
从输出结果可以看出,thread01正常结束程序,thread02被中断程序,执行catch中的代码块

2.2.3 tryLock(),tryLock(long time, TimeUnit unit)方法说明
tryLock()方法立刻返回当前获取情况。

tryLock(long time, TimeUnit unit)等待一定的时间,返回获取情况

public class ReentrantLockDemo03 implements Runnable {

    private ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        try {
            if (lock.tryLock(2, TimeUnit.SECONDS)) {
                System.out.println(Thread.currentThread().getName() + " 获取当前lock锁");
                TimeUnit.SECONDS.sleep(4);
            } else {
                System.out.println(Thread.currentThread().getName()+ " 获取锁失败");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }


    public static void main(String[] args) {
        ReentrantLockDemo03 reentrantLockDemo = new ReentrantLockDemo03();
        Thread thread01 = new Thread(reentrantLockDemo, "thread01");
        Thread thread02 = new Thread(reentrantLockDemo, "thread02");
        thread01.start();
        thread02.start();
    }
}
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
26
27
28
29
30
31
2.2.4 newCondition() 方法说明
目前只是对newCondition()使用方式进行说明,没有深入的分析Condition()的实现源码。
Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。不同的是,Object中的wait(),notify(),notifyAll()方法是和”同步锁”(synchronized关键字)捆绑使用的;而Condition是需要与”互斥锁”/”共享锁”捆绑使用的。

public class ProducerConsumerTest {

    private Lock lock = new ReentrantLock();

    private Condition addCondition = lock.newCondition();

    private Condition removeCondition = lock.newCondition();

    private LinkedList<Integer> resources = new LinkedList<>();

    private int maxSize;

    public ProducerConsumerTest(int maxSize) {
        this.maxSize = maxSize;
    }


    public class Producer implements Runnable {

        private int proSize;

        private Producer(int proSize) {
            this.proSize = proSize;
        }

        @Override
        public void run() {
            lock.lock();
            try {
                for (int i = 1; i < proSize; i++) {
                    while (resources.size() >= maxSize) {
                        System.out.println("当前仓库已满,等待消费...");
                        try {
                            addCondition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("已经生产产品数: " + i + "\t现仓储量总量:" + resources.size());
                    resources.add(i);
                    removeCondition.signal();
                }
            } finally {
                lock.unlock();
            }

        }
    }

    public class Consumer implements Runnable {

        @Override
        public void run() {
            String threadName = Thread.currentThread().getName();
            while (true) {
                lock.lock();
                try {
                    while (resources.size() <= 0) {
                        System.out.println(threadName + " 当前仓库没有产品,请稍等...");
                        try {
                            // 进入阻塞状态
                            removeCondition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    // 消费数据
                    int size = resources.size();
                    for (int i = 0; i < size; i++) {
                        Integer remove = resources.remove();
                        System.out.println(threadName + " 当前消费产品编号为:" + remove);
                    }
                    // 唤醒生产者
                    addCondition.signal();
                } finally {
                    lock.unlock();
                }
            }

        }
    }

    public static void main(String[] args) throws InterruptedException {
        ProducerConsumerTest producerConsumerTest = new ProducerConsumerTest(10);
        Producer producer = producerConsumerTest.new Producer(100);
        Consumer consumer = producerConsumerTest.new Consumer();
        final Thread producerThread = new Thread(producer, "producer");
        final Thread consumerThread = new Thread(consumer, "consumer");
        producerThread.start();
        TimeUnit.SECONDS.sleep(2);
        consumerThread.start();
    }
}

0

主题

1639

帖子

1万

积分

Nib

Rank: 11Rank: 11Rank: 11Rank: 11

贡献
0
技术
0
活跃
2482
在线时间
98 小时
8#
发表于 2019-5-2 14:50:11 | 只看该作者
可重入锁:ReentrantLock理解使用

0

主题

1639

帖子

1万

积分

Nib

Rank: 11Rank: 11Rank: 11Rank: 11

贡献
0
技术
0
活跃
2482
在线时间
98 小时
9#
发表于 2019-5-2 14:50:28 | 只看该作者
可重入锁:ReentrantLock理解使用

0

主题

1639

帖子

1万

积分

Nib

Rank: 11Rank: 11Rank: 11Rank: 11

贡献
0
技术
0
活跃
2482
在线时间
98 小时
10#
发表于 2019-5-2 14:50:46 | 只看该作者
可重入锁:ReentrantLock理解使用
使用 高级模式(可批量传图、插入视频等)
您需要登录后才可以回帖 登录 | 立即注册

快速回复 返回顶部 返回列表