自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 启发式算法详解——遗传算法

启发式算法详解——遗传算法算法原理算法详解算法详解算法总结算法原理      遗传算法(Genetic Algorithm)遵循『适者生存』、『优胜劣汰』的原则,是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。通过选择、交叉以及变异等机制,在每次迭代中都保留一组候选个体,重复此过程,种群经过若干代进化后,理想情况下其适应度达到近似最优的状态。      用大白话说,遗传算法就是模拟一个人工种群的进化过程,进化会有淘汰、交配、生殖、基

2021-06-15 17:10:46 1873

原创 启发式算法详解——禁忌搜索

启发式算法详解——禁忌搜索算法原理算法详解代码禁忌搜索为什么能提高搜索效率?影响禁忌搜索效率的因素算法原理      禁忌搜索的原理是记录已经解得的局部最优解,并在进一步的迭代中避开这些局部最优解。为了找到全局最优解,禁忌搜索每次会随机形成解集,并计算这些解集的最优解,将最优解加入到禁忌表中。在下次形成解集中,有意识地避开禁忌表中的解,从而或得更多的搜索区域。      用大白话说,禁忌表记录了当前找到比较优秀的解,下次我随机生成的数组不能

2021-06-15 17:01:29 970 1

原创 启发式算法——模拟退火

启发式算法详解——模拟退火算法来源算法详解代码why模拟退火能取得较好的解?模拟退火的优势算法来源      模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。      模拟退火算法也是不断通过随机改变数组的输入顺序来产生最优解,只不过它会以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的

2021-06-15 16:21:51 641

原创 启发式算法详解

启发式算法详解NP问题解决NP问题的算法启发式算法的诞生第一个版本的启发式算法更好的启发式算法NP问题      了解启发式算法之前,我们需要先了解下启发式算法所使用的场景,启发式算法主要的使用场景是NP问题,例如一维装箱,旅行商问题。这些问题有一个显著的特征:获得准确解需要付出很大的代价,而启发式算法则是利用有限的资源,尽可能的去计算较优解。解决NP问题的算法以一维装箱为例,传统的NP问题解法有:穷举法:穷尽法需要搜索 n! 次,这么搞cpu吃不消;动态规划:

2021-06-15 16:00:47 1612

原创 Java爬取公众号文章并生成HTML

1. 需求用户上传一个微信链接,能够从链接中解析HTML并保存在自己服务器中。要求HTML包含标题、作者和来源,并且保留文章的排版格式。2. 实现方案      通过Jsoup访问URL,获得DOM,然后解析出标题、正文等。由于公众号文章的css样式都相同,所以将style保存在服务器中,通过 <link href="…">的方式引入css文件。&...

2020-04-09 10:39:17 2024 7

原创 MybBtias存入Date型数据没有时分秒解决方案

将Mapper中的jdbcType设置为"TIMESTAMP",同时设置pojo类中的数据类型为Timestamp,数据库中数据类型为DateTime

2020-03-17 10:41:12 261

原创 Fiddler IOS抓取微信数据证书无法验证

使用fiddler抓取微信公众号网页时,出现网页证书不安全的警告,无法正常抓取.原因在于手机中没有fiddler的证书.解决方案:用浏览器打开 192.168.X.X:8888 (你的ip+8888)然后下载fiddler证书点击通用 -> 描述文件与设备管理,安装证书通用 -> 关于本机 -> 证书信任设置 -> 信任fiddler证书即可....

2020-02-24 20:15:37 1589

原创 JS学习(4)---jQuery元素及属性

jQuery语法jQuery选择器是,,,就是jQuery对象,基础语法:$(selector).action()文档就绪事件有两种写法:$(document).ready(function(){ }); 或$(function(){ });这两者等同于window.onload = function(){}不同在于window.onload在所有内容...

2020-02-20 19:51:10 129

原创 JS学习(3)---Ajax

5.Ajax使用Ajax1.创建Ajax对象var xhr = new XMLHttpRequest();2.监听请求xhr.onreadystatechange = function(){ //xhr对象的readystate发生改变就会触发该函数 //xhr对象有五种状态: //0: xhr对象已经创建,还没有初始化 //1: xhr对象调用了open() //2: x...

2020-02-20 19:28:36 108

原创 JS学习(2)---DOM

2.DOMDom就是HTML文件中的内容Dom节点分为三种:元素节点、属性节点、文本节点,三种节点有三个属性:NodeName(节点名)、nodeType(节点类型为前面三种中哪一个)、NodeValue(文本节点才有值,元素节点为null)2.1元素节点1.tagName 获取元素节点的标签名window.onload = function(){ var div = document...

2020-02-20 19:21:43 131

原创 JS学习(1)---BOM

1.BOM1.1 BOM就是一个浏览器窗口1.2 BOM函数介绍1.confirm(“String”): 返回true或false 弹出警告框,并且有确定和取消,2.prompt(): 有两个参数,分别是提示框上显示的内容和输入框内默认的值,返回输入值3.open(): 【功能】打开特点URL,参数:1.要加载的URL 2.窗口的名称(之后每次调用都进入该窗口)3.设置窗口的参数 ...

2020-02-20 19:19:35 101

原创 HTTPS原理解析

前言在聊HTTPS之前,我们先来聊一下HTTP,HTTP的一些相关知识点:HTTP协议详解,HTTP在传输过程中,它的数据是透明的,也就是说任何人都可以在中间截获请求与响应,从而盗取一些用户的重要信息。首先数据在传输的过程中,数据可能被中间人抓包拿到,那么数据就会被中间人窃取。其次数据被中间人拿到后,中间人可能对数据进行修改或者替换,然后发往服务器。最后服务器收到数据后,也无法确定数据有没...

2019-07-28 22:48:50 308

原创 HTTP协议详解

前言HTTP–Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。HTTP的端口是80,HTTPS端口为443。一、HTTPS请求...

2019-07-28 20:53:50 300

转载 TCP协议的三次握手和四次挥手

TCP的概述TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种断点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为192.3.4.16 而端口号为80,那么得到的套接字为192.3.4.16:80。TCP报文首部源端口和目的端口,各占2个字节,分别写入源端口和目的端口;序号,占4个字节,TCP连接中传送的字节流中的每个字节都按...

2019-07-27 17:28:45 169

原创 缓存穿透、缓存击穿和缓存雪崩的解决方案

1、缓存穿透缓存穿透是指用户发出一大波不在缓存也不在数据库中的数据请求,这种请求会造成数据库的访问压力过大。解决方案利用互斥锁,如果缓存中没有数据,先获得锁,获得锁之后再访问数据库,没得到锁就休眠一段时间再重试异步更新,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。在...

2019-07-26 15:21:21 408

原创 秒杀系统架构设计与实现

一、难点及解决方案总结作为一个秒杀系统,常常面临以下问题:秒杀还未开始,就有用户模拟数据提前发送请求进行秒杀或者抢购开始瞬间有人直接利用脚本大量发送请求秒杀前用户不停刷新页面秒杀开始瞬间请求数暴增商品被同一用户重复秒杀超卖超买订单的持久化解决方案:在后端先判断服务器时间是否在秒杀时间内,如果不是,返回错误信息使用CDN对静态资源进行分发在秒杀开始...

2019-07-26 14:49:14 1279

原创 设计模式(三)——策略模式

1、策略模式简介完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。软件系统中,有许多算法可以实现某一功能,如查找、排序等中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…等条件判断语句来进行选择。如果需要增加一种新的查找算法,需要修改封装算法...

2019-07-23 22:36:42 224

原创 java多线程系列 ——(10)线程池的使用

1、线程池简介在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。2、创建线程池2.1 创建线...

2019-07-21 17:58:15 154

原创 java多线程系统——(9)CountDownLatch使用与源码

1、CountDownLatch简介CountDownLatch是我们日常开发中经常用到的一个多线程工具类,它在完成一组正在其他线程中执行的操作之前,允许一个或多个线程一直等待,因此它的作用和join()方法类似,但是比join()方法更加的灵活。CountDownLatch在内部提供了一个计数器,每个线程完成任务后将计数器减一,当计数器减为0时所有等待在CountDownLatch的线程才会被...

2019-07-21 13:30:02 126

原创 java多线程系列——(8)ReentrantLock使用与源码解析(下)

1、前言上一篇文章我们讲了如何使用ReentrantLock以及ReentrantLock的特点,这篇文章将从源码入手,深入讲解ReentrantLock的具体实现过程。在讲解源码之前,让我们先来把几个类的结构搞情况,先看类图:实际上ReentrantLock就是一个空壳,具体的实现还是通过内部的sync变量来实现加锁和解锁的,在后面讲解lock()方法和unlock()方法时会更有体会。再...

2019-07-20 19:36:41 128

原创 java多线程系列——(7)ReentrantLock使用与源码解析(上)

一、ReentrantLock简介我们知道,在java中synchronized关键字可以实现同步,除此之外,我们还可以使用ReentrantLock来实现独占锁。ReentrantLock在性能上与synchronized接近,但是ReentrantLock提供了更丰富的内容,更适合复杂的并发场景。二、ReentrantLock的特点1、ReentrantLock是可重入的锁这一点与sy...

2019-07-20 13:15:31 254

原创 4种事务隔离级别

首先来看一下不同事务隔离级别可能造成的问题:1. 脏读脏读是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。来看个例子:#首先,修改隔离级别set tx_isolation='READ-UNCOMMITTED';#事务A:启动一个事务start transaction;select * from...

2019-07-19 16:27:02 245

原创 快速排序及优化,堆排序总结(下)

堆排序是建立在完全二叉树的结构上进行排序的,每次将大根堆的顶部和最后一个元素进行交换,因为大根堆的顶部元素肯定是堆中最大的数,所以就保证了从尾部开始大到小的顺序排列。每次交换都能确定一个数,因此需要确认N次;每次确认一个数需要花费logN次,所以堆排序的时间复杂度为O(N * logN)。代码如下:public class test { public static void main(S...

2019-07-18 16:58:58 307

原创 设计模式(二)—— 观察者模式

1、观察者模式概述观察者模式运用在一对一或者一对多的对象交互场景,每当一个对象改变时,可以通知其他对象进行改变。观察者模式是“解耦型模式”(降低对象间的耦合度)的最佳范例。2、观察者模式的结构先来看一下观察者模式的类图:观察者模式中主要有以下类:1. Subject(主题)知道它的观察者(观察者必须实现了一定的接口),可以有任意多个观察者。提供注册和注销观察者的接口2. Obse...

2019-07-17 23:22:24 159

原创 java多线程系统 ——(6)interrupt()方法和线程终止方式

1. interrupt()方法介绍interrupt()方法interrupt()的作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),只会给线程设置一个中断标志,线程仍会继续运行。本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。...

2019-07-14 11:00:22 167

原创 java多线程系统 —— (5)join()

1. join()方法介绍join()方法的主要作用是让“主线程”等待“子线程”结束之后才能继续运行,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。...

2019-07-13 23:06:50 141

原创 java多线程系列 —— (4)sleep()方法

1. sleep()简介sleep()是Thread类中的重要方法之一,其作用是使当前线程进入“休眠状态”即从“运行态”变为“阻塞态”。sleep()方法可以指定休眠的时间,线程的实际休眠时间会大于等于该休眠时间;在线程休眠结束时,会重新变为“就绪态”等待CPU的调度。2. sleep()示例下面通过一个简单例子来演示sleep()的用法:public class SleepTest {...

2019-07-13 22:17:39 766

原创 java多线程系列 ——(3)yield()线程让步

1.yield()介绍yield()方法是Thread类提供的方法,它的作用是线程让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!2.yield()示例public class YieldTest {...

2019-07-13 18:16:51 266

原创 java多线程系列——(2)wait和notify方法实现生产者消费者问题

1. 概要Object类中提供有wait()、notify()、notifyAll()方法来使线程等待和唤醒。那么问题来了,为什么对线程的等待和唤醒要定义在object类中呢?因为wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。wait()会使“当前线程”等待,因为线程进入等待状态,所以线...

2019-07-13 16:59:08 336

原创 java多线程系列——(1)线程的概念及三种实现方式

线程和进程是我们常见的两个专业名词,进程是指当前系统正在运行的应用程序,是系统资源调度的基本单位,在单核CPU时代,同一时间只能有一个进程运行。线程是在进程下进一步划分的更小的调度单位,它是系统分配处理器时间资源的基本单元。一个进程中可以有多个线程并发执行,但是线程的“并发执行”只是相对的,并不是说多个线程同时在执行,而是交替执行。线程和进程类似,都有它们的状态,线程分别有五种状态:新建...

2019-07-13 13:07:26 133

原创 Redis持久化的两种方式

前言Redis是一种K-V数据库,它的数据也可以进行持久化操作。因为redis的数据都保存在内存中,如果不进行及时的持久化,可能就会因为重启导致数据的丢失。这时候就需要对redis进行持久化操作,将数据保存在磁盘上。redis提供了两种持久化方式,分别是AOF和RDB。下面分别对这里持久化方式进行解析。1.RDBRDB是将redis 的数据生成快照保存在磁盘上。 工作流程如下:执行bg...

2019-07-11 15:36:00 462

原创 Mysql explain详解

前言explain关键字在MySQL中可以查看一条查询语句的具体执行策略。通过explain关键字,我们可以查看到哪些字段使用了索引,发生了哪些查询,查询是什么类型的等等。explain关键字分别有以下10列:id:选择标识符select_type:表示查询的类型。table:输出结果集的表partitions:匹配的分区type:表示表的连接类型possible_keys:表示查...

2019-07-09 22:53:14 225

转载 redis复习精讲

复习要点?本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题正文1、为什么使用redis分析:博主觉得在项目中...

2019-07-05 10:55:57 140

转载 数据库分库分表的应用场景及解决方案

数据库分库分表的应用场景及解决方案现实业务场景中,为了保障客户体验并满足业务的线性增长。会对数据量巨大,且业务会始终进行的产品进行分表分库策略。但是如何合理的根据业务采取争取的分表分库策略至关重要。下面以具体实例来进行分析。• 场景一:用户中心,单key业务如何进行数据库切分• 场景二:订单中心,多key业务如何进行数据库切分场景一:用户中心数据库切分架构实践|场景...

2019-07-04 15:50:15 297

原创 数据库分库分表思路

1. 数据切分关系型数据库当容量超过1000w或100G以后,单机储存容量、查询速度、处理能力都会达到瓶颈。这时候即使对sql语句进行优化也无济于事。这时候就需要对数据库进行切分,这里有分为水平切分和垂直切分。(1)垂直切分垂直切分有垂直分库和垂直分表两种。垂直分库就是将关联度低的不同表储存在不同的数据库中。这和微服务的思想类似,将一个大的系统拆分成小系统,按业务进行切分。如图:垂直分...

2019-07-04 15:20:00 574

转载 聚集索引,非聚集索引,覆盖索引的查询原理

转自 https://blog.csdn.net/itguangit/article/details/82145322使用索引很简单,只要能写创建表的语句,就肯定能写创建索引的语句,要知道这个世界上是不存在不会创建表的服务器端程序员的。然而, 会使用索引是一回事, 而深入理解索引原理又能恰到好处使用索引又是另一回事,这完全是两个天差地别的境界(我自己也还没有达到这层境界)。很大一部份程序员对索引...

2019-07-03 16:33:03 1960 2

原创 SQL优化

使用索引的优化索引一般可以加速数据的检索速度,加速表与表之间的链接,提高性能,所以在对海量数据进行处理时,考虑到信息量比较大,应该对表建立索引,包括在主键上建立聚簇索引,将聚合索引建立在日期上等。索引的优点有很多,但是对于索引的建立,还需要考虑实际情况,而不是对每一个列建立一个索引,比如针对大表的分组、排序等字段,都要建立相应索引,同时还应该考虑建立符合索引。增加索引的同时也有很多不好的方面,首...

2019-07-03 16:04:46 118

转载 漫画:B+树

转载自:伯乐专栏作者/玻璃猫,微信公众号 - 梦见漫画:什么是b+树简要地介绍B+树: B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。B+树的特征:1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都...

2019-07-03 15:01:13 453

转载 漫画:什么是B-树?

转载自玻璃猫 程序员小灰————————————————————————二叉查找树的结构:第1次磁盘IO:第2次磁盘IO:第3次磁盘IO:第4次磁盘IO:下面来具体介绍一下B-树(Balance Tree),一...

2019-07-03 14:46:41 539

原创 设计模式(一)—— 单例模式详解

前言对系统中的某些类来说,只有一个实例很重要,例如我们常见的任务管理器,大家可以试试看能不能打开两个任务管理器,又比如Spring中的bean有singleton模式。单例模式是目的为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。单例模式的要点有三个:是某个类只能有一个实例;是它...

2019-07-02 22:34:28 108

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除