自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ConcurrentHashMap面试大总结

底层数据结构JDK7在JDK1.7中ConcurrentHashMap采用了数组+Segment+分段锁的方式实现。分段锁ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表,同时又是一个ReentrantLock(Segment继承了ReentrantLock)。内部结构ConcurrentHashMap使用分段锁技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占

2020-05-30 18:25:49 372

原创 05秒杀系统业务之三 订单服务

架构设计(基础的组件)涉及到的数据表用户信息表 user_info字段定义id用户idname用户名gender性别0为女,1为男age年龄register_mode注册方式third_party_id第三方用户密码表 user_password字段定义id密码表的idencrpt_password密码加密存储(在后端用加密之后进行存储)user_id用户id商品表 item字段

2020-05-29 15:28:03 284

原创 04秒杀系统业务之二 商品服务

架构设计(基础的组件)涉及到的数据表涉及到的模型(抽象,根据各层的需要)根据各层不同的需求需要进行POJO的各种封装获取商品的列表前端请求的信息// 定义全局商品数组信息 var g_itemList = []; $(document).ready(function () { $.ajax({ type: "GET", url: "http://localhost:8080/item/getItemLi

2020-05-29 14:52:59 186

原创 03秒杀系统业务之一 用户服务

架构设计(基础的组件)涉及到的数据表涉及到的模型(抽象,根据各层的需要)根据各层不同的需求需要进行POJO的各种封装用户注册生成验证码前端填写手机号,传送给后端后端生成验证码,发送成功标志给前端前端获取到Json数据对其分析跳转到注册页面,进行表单填写 @RequestMapping(value = "/getotp",method = {RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})//consumers传输

2020-05-29 12:32:13 132

原创 HashMap面试大总结

文章目录hashMap特性、原理、内部数据结构hashMap的put方法/get方法hashMap中的hash函数怎么实现?还有哪些hash的实现方式?什么是hash冲突?如何解决hash冲突?开放定址法2.2 链地址法(拉链法)再哈希法建立公共溢出区hashMap中的重要 字段:capacity为什么取2的幂次方?负载因子是什么?(涉及到扩容机制)“为什么String, Interger这样的wrapper类适合作为键?”平时在使用HashMap时一般使用什么类型的元素作为Key?自定义键需要注意什么?H

2020-05-29 01:27:37 543

原创 02 秒杀系统的整体设计(初步)

文章目录通用工具的设计1、后端传给前端的数据封装错误信息枚举类BaseCOntroller对业务报错的信息进行统一的解析返回给前端数据跨域实现请求 @CrossOrigin自动生成mapper各层Model(以及各个Model转换)对字段进行校验前端采用 Metronic模板在接入层进行一些异常处理,并定义前后端分离数据交互的一个格式业务层进行业务的处理,并进行后端数据的组合交给前端数据层:使用事务、数据Dao进行持久化数据库:MySQL, redis通用工具的设计1、后端传给前端的

2020-05-28 18:52:10 158

原创 01 秒杀系统表结构

下面是秒杀系统数据库表结构的设计用户信息表 user_info字段定义id用户idname用户名gender性别0为女,1为男age年龄register_mode注册方式third_party_id第三方用户密码表 user_password字段定义id密码表的idencrpt_password密码加密存储(在后端用加密之后进行存储)user_id用户id商品表 item字段.

2020-05-28 16:51:19 671

原创 SpringBoot集成RocketMQ

配置配置pom在发送方与接收方首先需要导入rocketMQ的坐标,注意版本号,在我的测试中,导入的坐标为: <!--导入rocketMQ--> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.0.3</v

2020-05-25 10:34:03 582

原创 SpringBoot整合Zookeeper与Dubbo

体系在微服务中需要把各个服务进行解耦,这样的话,各个服务需要进行拆分,同时这样需要进行网络通信,使用Dubbo(RPC进行服务之间的调用,但是这些服务需要一个机构进行统一管理,可以采用zookeeper进行管理。ZooKeeper 是一个开源的分布式协调服务,ZooKeeper框架最初是在“Yahoo!"上构建的,用于以简单而稳健的方式访问他们的应用程序。 后来,Apache ZooKeeper成为Hadoop,HBase和其他分布式框架使用的有组织服务的标准。 例如,Apache HBase使用

2020-05-22 11:33:36 409

原创 04 消息发送样例

文章目录4.1、基本样例4.1.1、消息发送1)发送同步消息2)发送异步消息3)单向发送消息4.1.2 消费消息1)负载均衡模式(默认)4.2、顺序消息4.2.1 顺序消息生产4.2.2 顺序消费消息4.3、消息延时4.3.1、 启动消息消费者4.3.2、发送延时消息4.3.4、使用限制4.4、批量信息4.4.1 发送批量消息4.4.2、接受信息4.5、过滤消息4.5.1 SQL基本语法4.5.2 消息生产者4.5.3 消息消费者4.6 事务消息1)事务消息发送及提交2)事务补偿3)事务消息状态4.6.1

2020-05-17 23:47:20 739

原创 03RocketMQ集群搭建

RocketMQ集群搭建各角色介绍Producer:消息的发送者;举例:发信者Consumer:消息接收者;举例:收信者Broker:暂存和传输消息;举例:邮局NameServer:管理Broker;举例:各个邮局的管理机构Topic:区分消息的种类;一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic消息Message Queue:相当于是Topic的分区;用于并行发送和接收消息集群搭建方式集群特点NameServer是一个几乎无状态

2020-05-17 23:15:19 244

原创 02RocketMQ安装与启动

2. RocketMQ快速入门RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,在阿里内部,RocketMQ承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。2.1 准备工作2.1.1 下载RocketMQRocketMQ最新版本:4.5.1下载地址2.2.2 环境要求Linux64位系统JDK1.8(64位)源码安装需要安装Maven 3.2.x2.2 安装RocketMQ2.2.1 安装步骤本教程以二进制包方式安装解压安装

2020-05-17 22:39:24 163

原创 01MQ介绍

为什么要用MQ官方链接消息队列是一种“先进先出”的数据结构其应用场景主要包含以下3个方面:应用解耦系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,补充处

2020-05-17 22:35:54 295

原创 直接插入排序

插入排序插入排序的设计初衷是往有序的数组中快速插入一个新的元素。它的算法思想是:把要排序的数组分为了两个部分, 一部分是数组的全部元素(除去待插入的元素), 另一部分是待插入的元素; 先将第一部分排序完成, 然后再插入这个元素. 其中第一部分的排序也是通过再次拆分为两部分来进行的.插入排序由于操作不尽相同, 可分为 直接插入排序 ,折半插入排序(又称二分插入排序), 链表插入排序 , 希尔排序。我们先来看下直接插入排序。直接插入排序基本思想直接插入排序的基本思想是:将数组中的所有元素依次跟前

2020-05-16 12:00:15 157

原创 SpringBoot13 异步、定时、邮件任务

参考资料>>>>

2020-05-15 15:46:01 87

原创 SpringBoot12 集成Swagger

Swagger简介前后端分离前端----> 前端控制层、视图层后端----> 后端控制层、服务层、数据访问层前后端通过API进行交互前后端相对独立且松耦合产生的问题前后端集成,前端或后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发解决方案首先定义schema【计划的提纲】,并实时跟踪最新的API,降低集成风险Swagger号称世界上最流行的API框架Restful Api文档在线自动生成器—》API文档与API自定义同步更新直接运行,在线测试API

2020-05-15 15:44:32 127

原创 LeetCode双指针(包含滑动窗口)刷题分析与总结

这一部分:事情比较多,掌握的并不是特别好,时间大概从 5/3-5/13之后需要加强双指针介绍双指针应用双指针技巧双指针题型

2020-05-13 17:39:06 558

原创 LeetCode239. 滑动窗口最大值

滑动窗口的最大值>>>滑动窗口:使用一个队列(队列中存放的是数组中元素的索引值),确保队首元素是滑动窗口内的最大值,如何保证,每添加一个元素要判断,这个元素是否大于队列中现有元素,若大于则不断移除队列中的元素,再判断队列中的元素是否不再此时滑动窗口范围内class Solution { public int[] maxSlidingWindow(int[] nums, int k) {if(nums == null || nums.length < 2)

2020-05-13 17:05:46 135

原创 LeetCode567字符串的排列

字符串的排列>>>滑动窗口class Solution { public boolean checkInclusion(String s1, String s2) { Character[] s1Aray = new Character[s1.length()]; Character[] s2Aray = new Character[s2.length()]; //s1中的字符串存储在map中 Map&l

2020-05-13 17:00:11 176

原创 LeetCode718最长重复子数组

最长重复子数组.>>>class Solution { public int findLength(int[] A, int[] B) { int i,b; int len = 0; int[][] dp = new int[A.length + 1][B.length + 1]; //建立一个二维表。 for(i = 1; i <= A.length; i++){ for(b = 1; b &l

2020-05-13 16:53:27 137

原创 LeetCode209 长度最小的子数组

长度最小的子数组>>>package KTwoPointers;/** * @Author Zhou jian * @Date 2020 ${month} 2020/5/11 0011 12:26 * 长度最小的子数组 * 给定一个含有 n 个正整数的数组和一个正整数 s , * 找出该数组中满足其和 ≥ s 的长度最小的连续子数组, * 并返回其长度。如果不存在符合条件的连续子数组,返回 0。 * * 和大于k的最小长度的子数组的 */public c

2020-05-13 16:51:49 168

原创 LeetCode76 最小覆盖子串

最小覆盖子串>>>滑动窗口:定义一个hashMap存放字符串T中的所有元素,窗口框定S字符串,left---right确定当前所确定的元素,若在left-----right范围内不包含T则将right不断向右移动,若符合,则再将left向右移动直到不包含该T,用T中的map的每个值是否为0即可判断是否包含T /** * 重点分析 * @param * ,并且不要求顺序,之前已经用过很多次了,利用 HashMap,

2020-05-13 16:46:32 110

原创 LeetCode30 串联所有单词的子串

串联所有单词的子串>>>遍历所有words,将words中的每个字符串都存在hashMap allwords中,key存放值,value存放其出现的次数,遍历所有子串,将当前子串所包含单词存放hasWords中,若遍历到的字符串不存在allwords中的字符串,或者电气概念遍历到的字符串中的个数大于allWords中的字符串则结束此次遍历接着下次遍历,在这种方式下,我们每次移动一个字符串package KTwoPointers;import java.util.ArrayL

2020-05-13 16:36:58 157

原创 LeetCode925 长俺键入

长按键入>>> //字符串匹配模式,在typed中查找name public boolean isLongPressedName(String name, String typed) { //定义两个指针 //名字字符串指针 int nameIndex = 0; //输入的字符串的指针 int typedIndex =0; if(name.length()> typed

2020-05-13 16:26:44 131

原创 LeetCod844 比较含退格的字符串

比较含退格的字符串>>>重构字符串,使用栈,使用build(S)和build(T)构造取出了退格和被删除字符后的字符串然后比较它们是否相等。//重构字符串 //使用栈,使用build(S)和build(T)构造取出了退格和被删除字符后的字符串 //然后比较它们是否相等 public boolean backspaceCompare1(String S, String T){ return build(S).equals(build(T)

2020-05-13 16:22:12 190

原创 LeetCode532 数组中的K-diff数对

数组中的K-diff数对>>>双指针: 先对数组进行排序,然后再定义连个指针left,right //双指针法 public int findPairs1(int[] nums, int k){ Arrays.sort(nums); int left = 0; int right = 1; int rs = 0; while (right<nums.length){

2020-05-13 16:13:44 138

原创 LeetCode350 两个数组的交集(重复元素不跳过大量元素如何处理)

两个数组的交集(重复元素)可以采用349那样,先对数组进行排序,然后使用双指针,遍历数组,进行判断 //谁小谁就加速跑,一样大两个就要都往前 //排序+双索引法 public int[] intersect(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); List<Integer> list = new ArrayList&

2020-05-13 16:06:28 187

原创 LeetCode349 两个数组的交集(重复元素跳过)

两个数组的交集(重复元素跳过)>>>先对数组进行排序,然后定义指针index1,index2分别遍历两个数组,两个指针分别遍历两个数组,若发现数组中有重复元素,则跳过重复元素,然后判断两个数组的值是否相等;如相等则将值存入结果集中,若数组1小于数组2,则将数组1中的指针向前移动,反之package KTwoPointers;import java.util.ArrayList;import java.util.Arrays;import java.util.List;

2020-05-13 15:55:52 186

原创 SpringBoot13 Dubbo和Zookeeper集成

本文参考几个基本概念什么是分布式系统在《分布式系统原理与范型》一书中有如下定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”;分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据。分布式系统(distributed system)是建立在网络之上的软件系统。首先需要明确的是,只有当单个节点的处理能力无法满足日益

2020-05-13 12:48:40 190

原创 SpringBoot12 SpringSecurity

参考内容>>>官网链接安全介绍在 Web 开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题,就可能陷入一个两难的境地:一方面,应用存在严重的安全漏洞,无法满足用户的要求,并可能造成用户的隐私数据被攻击者窃取;另一方面,应用的基本架构已经确定,要修复安全漏洞,可能需要对系统的架构做出比较重大的调整,因而需要更多的开发时间,影响应用的发布进程。因此,从应用开发的第一天就应该把安全相关的因素考虑

2020-05-12 17:27:15 198

原创 LeetCode345 反转字符串的元音字母

反转字符串的元音字母>>>双指针:定义两个指针,从数组两端向数组中间遍历,若发现元音字母则进行交换,否则进行遍历。class Solution { public String reverseVowels(String s) { String tool="aoeiuAOEIU"; char[] rs = s.toCharArray(); int left = 0; int right = s.length()-1;

2020-05-12 14:05:38 202

原创 LeetCode283 移动0到数组的末尾

移动0到数组的末尾>>>双指针:定义两个指针,遍历数组,left指向不是0数组的末尾,right指向需要带遍历数组的首部,若发现right不为0则将right出的元素赋值到left处class Solution { public void moveZeroes(int[] nums) { int i,j=0; for(i=0;i<nums.length;i++){ if(nums[i]!=0){

2020-05-12 13:59:57 230

原创 LeetCode234 回文链表

回文链表>>>注意与回文字符串的对比可以将链表中部以后进行反转,然后再进行双指针遍历比较,这道题比较总和/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { //可以将链表转换为数组和

2020-05-12 13:41:39 125

原创 LeetCode344 反转字符串

双指针:遍历真个字符串,进行就交换class Solution { public void reverseString(char[] s) { if(s.length==0) return; int left = 0; int right = s.length-1; while(left<right){ //交换两个字符 char tem..

2020-05-12 13:38:54 142

原创 leetCode206 反转链表

反转链表迭代法:双指针;一个指针指向已经反转链表的尾部,一个指针指向待反转链表的首部,不断遍历即可 public ListNode reverseList(ListNode head) { if(head==null||head.next==null) return head; //已经反转链表的尾部 ListNode pre = null; //当前要反转链表的头部 ListNode cur = head;

2020-05-12 13:35:19 120

原创 LeetCode876 链表的中间节点

链表的中间节点》》》快慢指针:使用两个指针, public ListNode middleNode(ListNode head) { if(head==null||head.next==null) return head; ListNode slow = head; ListNode quick = head; while(quick!=null&&quick.next!=null){

2020-05-12 13:30:13 100

原创 LeetCode167 两数之和输入有序数组

LeetCode167双指针:首位指针向数组中间进行推进,package KTwoPointers;/** * @Author Zhou jian * @Date 2020 ${month} 2020/5/5 0005 11:41 * 两数之和----输入有序数组 * 使用双指针,一个指针指向较小的元素,一个指向值较大的元素,指向较小的元素的指针从头向尾遍历 * 如果两个指针指向元素的和 sum == targetsum==target,那么得到要求的结果; 如果 su

2020-05-12 13:23:54 126

原创 LeetCode141 环形链表

环形链表>>>双指针:快慢指针/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public bool

2020-05-12 13:19:45 100

原创 LeetCode680 验证回文字符串II

验证回文串>>>在 上提的基础上,可以删除字符,也就是可以跳过某些字符package KTwoPointers;import AarrayProblem.Problem1;/** * @Author Zhou jian * @Date 2020 ${month} 2020/5/4 0004 01:02 */public class Problem680 { /** * * @param s * @return

2020-05-12 13:17:34 95

原创 LeetCode125 验证回文串

验证回文串双指针:left :从前往后遍历字符串 ,right从后往前遍历字符串,若发现不是字符则跳过continue,进行比较是否相等package KTwoPointers;/** * @Author Zhou jian * @Date 2020 ${month} 2020/5/4 0004 00:51 * 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写 */public class Problem125 { public boole

2020-05-12 13:13:36 227

空空如也

空空如也

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

TA关注的人

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