自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 redis 哨兵模式---当redis实例被定客观下线

选举大哥sentinel一个redis服务被判断为客观下线时,多个监视该服务的sentinel协商,选举一个领头sentinel,对该redis服务进行故障转移操作。选举领头sentinel遵循以下规则:1)所有的sentinel都有公平被选举成领头的资格。2)所有的sentinel都只有一次将某个sentinel选举成领头的机会(在一轮选举中),一旦选举,不能更改。3)先到先得,一旦当前sentinel设置了领头sentinel,以后要求设置sentinel为领头请求都会被拒绝。4)每个发现服务

2021-12-07 16:49:57 363

原创 redis的过期策略

三种过期键删除策略1)定时删除:创建一个定时器,到时间立即执行删除操作(对内存友好,因为能保证过期了立马删除,但是对cpu不友好)2)惰性删除:键过期不管,每次获取键时检查是否过期,过期就删除(对cpu友好,但是只有在使用的时候才可能删除,对内存不友好)3)定期删除:隔一段时间检查一次(具体算法决定检查多少删多少,需要合理设置)淘汰策略当Redis占用内存超出最大限制 (maxmemory) 时,可采用如下策略 (maxmemory-policy) ,让Redis淘汰一些数据,以腾出空间继续提供读

2021-12-07 16:03:46 4322

原创 无所不知——Redis的Info 指令

在使用 Redis 时,时常会遇到很多问题需要诊断,在诊断之前需要了解 Redis 的运行状态,通过强大的 Info 指令,你可以清晰地知道 Redis 内部一系列运行参数。Info 指令显示的信息非常繁多,分为 9 大块,每个块都有非常多的参数,这 9 个块分别是:1、Server 服务器运行的环境参数2、Clients 客户端相关信息 – Redis 连接了多少客户端?> redis-cli info clientsconnected_clients:124 # 这个就是正在连接的客户端数

2021-12-06 14:43:51 660

原创 使用java实现post和get请求

get请求 public static String get(String url) throws IOException { String content = null; LOGGER.info("get","发送get请求"); try { URLConnection urlConnection = new URL(url).openConnection(); HttpURLConnection conne

2021-08-04 17:15:56 310

原创 2021-08-04 java实现md5算法

很多场景下,账号密码明文比较危险,使用md5算法可以有效的保证密码安全问题public static String getMd5(String data) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] result = md.digest(data.getBytes()); StringBuffer sb = new St...

2021-08-04 17:10:32 107

原创 Java中接口和抽象类的区别

接口和抽象类的区别?接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现。抽象类是可以有私有方法或私有变量的,通过把类或者类中的方法声明为abstract来表示一个类是抽象类,被声明为抽象的方法不能包含方法体。子类实现方法必须含有相同的或者更低的访问级别(public->protected->private)。抽象类的子类为父类中所有抽象方法的具体实

2021-03-16 10:59:27 89

原创 Java并发编程多线程安全性介绍以及解决

线程不安全下面这段代码中,我们使用for循环启动了10个线程,每一个线程都对类中的静态变量进行10000次自增操作,按照正常的逻辑来说,等到10个线程都执行完他们的任务之后,COUNT 这个变量应该是被自增了10万次,所以COUNT应该为100000。public class UnsafeThread { public static int COUNT;//处于方法区 public static void main(String[] args) throws InterruptedE

2021-02-27 20:42:01 289

原创 TCP协议的三次握手与四次挥手

一. 建立连接—三次握手首先客户端和服务端都是关闭状态,也就是CLOSED状态。服务器端进入一个监听的LISTEN状态,阻塞等待客户端的连接第一次握手:客户端向服务端发送一个SYN的标志位以请求连接。此时客户端进入SYN_SEND状态,也就是开始阻塞等待服务器的应答。第二次握手:服务器收到了客户端的SYN连接请求,也就处于SYN_RCVD状态。由于现在客户端向服务端单方面请求连接了,但是服务端还没有发送连接请求给客户端,要想双方都建立连接的话,就需要服务端也向客户端发送一个SYN请求。同时,我们还需要

2021-02-27 20:36:55 83

原创 TCP的拥塞控制

一. 流量控制1.1 产生原因我们知道在接收端接收数据的时候,会先将数据保存在接收缓冲区中,等待应用程序调用recv()方法读取。如果接收缓冲区内的数据一直没有被应用进程读取,接收缓冲区空间被填满,发送端再继续发送数据的话,就会引起丢包等一系列的连锁问题。为了避免这种问题的发生,TCP中可以根据接收端的处理数据的速度和能力,来决定发送端的发送速度,这个机制就叫做流量控制。1.2 流量控制方法在接收端接收到数据之后,返回的ACK中,会将自己可以接收数据的缓冲区大小放到TCP头部的“窗口大小”的字段中

2021-02-27 20:34:07 220

原创 TCP协议与UDP协议的区别

UDP协议1.1 流程服务器:new DatagramSocket(端口号) 启动服务器。服务器:receive()方法等待接收网络数据包(阻塞方法:服务端先调用该方法,会进入持续等待的状态)。客户端:通过目的ip+目的port(端口号),找到远程服务器(UDP无连接,但可以找到远程主机上的UDP进程)。客户端:通过send()方法发送请求数据。服务端:也通过send()方法响应客户端发来的数据,发送数据包。客户端:receive()方法接收服务端发来的数据。1.2 UDP协议特点无连接.

2021-02-27 20:33:08 112

原创 TCP可靠性之滑动窗口

我们知道TCP协议中有一个确认应答机制,每发送一个数据段,就需要有一个ACK来响应,如果这样一收一发的话,会让数据传输的效率变得很低。滑动窗口就是用来解决这个问题的,也就是我们一次发送多条数据。例如现在不需要等待确认应答可以发送数据的最大值为4000个字节,我们将4000个字节分为四个数据段来进行发送。在发送前四个数据段的时候,我们不需要等待任何的ACK应答,可以直接发送。当收到第一个数据段的ACK之后,滑动窗口就会向后移动一个单元,再继续发送第五段数据,然后依次类推。发送缓冲区 操作系统为了维护滑动..

2021-02-27 20:32:02 142

原创 Tcp/ip封装解析过程

封装 首先在应用层,浏览器会将请求数据封装为HTTP协议数据包,在原本数据包中加入HTTP头。1.传输层:tcp协议将前一个封装的数据包再次封装为tcp数据包。2.网络层:封装ip协议。3.数据链路层:封装了数据帧。 解包分用1.数据链路层:操作系统在网卡接收到数据之后,再解析接收到的数据包,其中就会处理数据帧。2.网络层:系统处理ip头部。3.传输层:系统处理tcp报头,报头中包括ip和port,知道了端口号,找到对应的应用程序,,系统将数据包交给应用程序来处理数据。4.应用层:应用程

2021-02-27 20:29:55 3986

原创 HTTP响应常见的状态码

HTTP常见状态码有哪些?a. 2开头状态码;2xx (成功)表示成功处理了请求的状态代码;如:200 (成功) 服务器已成功处理了请求。b. 3开头状态码;3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。如:304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容c. 4开头状态码;4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理;如:400 (错误请求) 服务器不理解请求的语法;403 (禁止) 服务器拒

2021-01-07 17:10:08 268

原创 Servlet的生命周期

二、Servlet生命周期简述(1)加载和实例化当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。(2) 初始化实例化后,Servlet容器将调用Servlet的init()方法进行初始化(一些准备工作或资源预加载工作)。(3)服务初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,HttpServ.

2021-01-07 17:05:38 79

原创 GET和POST的区别

get和post的区别?a、get是用来从服务器上获取数据,而post是用来向服务器传递数据;b、get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者用"?“连接,变量之间用”&"连 接;而post是将表单中的数据放在form的数据体中,按照变量与值对应的方式,传递到action所指定的URL。c、get是不安全的,因为在传输过程中,数据是被放在请求的URL中;而post的所有操作对用户来说都是不可见的。d、get传输的数据量小,这主要应为

2021-01-07 16:59:18 66

原创 Http协议请求格式与响应格式

当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:l 请求方法URI协议/版本GET/sample.jspHTTP/1.1l 请求头(Request Header) Accept:image/gif.image/jpeg,/Accept-Language:zh-cnConnection:Keep-AliveHost:localhostUser-Agent:Mozila/4.0(compatible;MSIE5.01;Win

2021-01-07 16:47:05 645

原创 OSI七层模型,TCP/IP五层模型(四层也行),以及封装解封装过程

结OSI和TCP/IP:1.OIS属于理想化的,属于纸上谈兵的没有实际应用的产品;而TCP/IP广泛运用于实际生活中。OSI模型是协议开发前设计的,具有通用性,TCP/IP是先有协议集然后建立模型,不适用于非TCP/IP网络。2.OSI共有七层,为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层,TCP/IP则有四层,为:应用层、传输层、网络层、网路接口层(包含物理层和数据链路层)3.OIS协议有很好的隐蔽性,拥有三个主要概念:服务,接口,协议;TCP/IP则没有明确区分服务,接口和协议

2021-01-06 18:08:11 674

原创 线程池的创建方式---java实现

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class KindsThreadPool { //1、newCachedThreadPool() //创建一个可缓存的线程池,

2021-01-04 23:28:48 74

原创 java中异常以及它的处理方式

.相关概念:(1)异常是程序运行时产生的一种问题(不是编译期)(2)异常的种类有很多,不同种类的异常能够表示不同情况的问题2.基本语法:示例:public class Abnormal { public static void main(String[] args) { int[] arr = {1, 2, 3, 4}; try { System.out.println("before"); System.ou

2020-11-30 10:57:11 108

原创 泛型的基本,以及包装类

泛型诞生的作用:1.增加编译期间的类型检查:泛型是作用再编译期的一种机制,即运行期间没有泛型的概念2.取消类型转换的使用泛型分类:(1)泛型类:public class MyArrayList<E> { private E<> array; private int size;(2)泛型方法MyArrayList<Book> books = new MyArrayList<Book>();books.add(new Book());在上

2020-11-30 10:54:07 99

原创 数组拷贝的方法

public class normalTest { public static void main(String[] args) { int[] arr = {1, 2, 3, 4}; int[] arr2 = new int[arr.length]; // 第一种方法:循环添加至新数组中 for (int i = 0; i < arr.length; i++) { arr2[i] = arr[i];

2020-11-30 10:46:55 145

原创 重载和重写的区别

重写:(1)重写有一个必须的前提:重写只能发生再父类和子类之间,而且必须是子类对父类的的方法进行重写(2)重写子类的参数必须和父类的参数一模一样,不论是参数的类型或者参数的数量(3)返回值的类型需要相同(4)在权限修饰方面:子类的权限必须要大于或者等于父类的权限(5)子类抛出的异常不能大于父类抛出的异常重载:(1)重载的对象是:同一个类中的不同方法,也就是说一个方法可以对另一个方法进行重载操作(2)参数必须不一样,可以是参数的个数不同,参数的类型不同(3)对于方法的返回值没有要求必须相同

2020-11-30 10:43:17 124

原创 ArrayList和LinkedList的区别

LinkedList和ArrayList的差别主要来自于Array和LinkedList数据结构的不同。ArrayList是基于数组实现的,LinkedList是基于双链表实现的。另外LinkedList类不仅是List接口的实现类,可以根据索引来随机访问集合中的元素,除此之外,LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,因此LinkedList可以作为双向对列,栈(可以参见Deque提供的接口方法)和List集合使用,功能强大。因为Array.

2020-11-30 10:40:37 189

原创 数组和ArrayList的区别与联系

(1)首先,两者都是 Java 中重要的数据结构,经常会被使用到,数组是 Java 中当中的基础数据结构,而 ArrayList 是 Java Collection 框架下的 List 的接口的一个实现类,其内部实现原理就是依靠数组去实现的,只不过数组在构建的时候就确定的数组的长度,并且是不可变化的,而 ArrayList 可以根据情况自身进行数组的扩容,来达到动态数组的功能,所以 ArrayList 可以被理解为一种动态能够变化长度的数组,并且 ArrayList 当中还提供更多的方法来方便对于顺序表的操

2020-11-30 10:36:50 3398

原创 super和this的区别

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。class Student { public int age; public void std(){ //声明Student类的方法std() age = 15; .

2020-11-30 10:31:23 54

原创 equals和==的区别

==(1)如果比较的是基础数据类型,那么 == 比较的是他们的值是否相同(2)如果比较的是引用数据类型,那么 == 比较的是他们的引用地址是否相同,也就是比较的栈中局部变量表里的 reference 引用是否相同。equals(1)equals 是一个 Object 类中的方法,从源码可以知道,他比较的是两个对象的引用地址是否相(2)但是其他类会重写 Object 类中的 equals 方法,重新定义比较的规则,像 String 中就重写了 equals 方法,他比较的是两个 String 对象的

2020-11-23 14:32:45 369

原创 实现哈希桶,java

class HashBuck {static class Node {public int data;public int value;public Node next; public Node(int data,int value) { this.data = data; this.value = value; }}public Node[] array;public int usedSize; //总长度;public HashBuck()

2020-11-20 22:09:38 299

原创 前k个高频单词;(如果频率一样的话,让首字母小的排在前面) -- 难点 比较器的重写

public static List topKFrequent(String[] words, int k) {Map<String ,Integer> map = new HashMap<>();for(String str : words){map.put(str,map.getOrDefault(str,0)+1);}PriorityQueue q = new PriorityQueue<>(new Comparator() {@Overridepub

2020-11-17 19:37:54 95

原创 set集合已经map的最基本操作,不包含哈希表等;

map;public class TestMap {public static void main(String[] args) {Map<String,String> map = new HashMap<>();map.put(“玄策”,“电耗子”); //将key(玄策),以及对应的value(电耗子)放入map;map.put(“裴勤虎”,“老虎”);map.put(“云中君”,“走地鸡”);map.put(“瑶妹”,“永远的神”);map.put(“孙悟空”,

2020-11-17 14:18:54 80

原创 二叉搜索树的建立,删除关键字以及寻找关键字;

public class BinarySearchTree {static class TreeNode{public int val;public TreeNode left;public TreeNode right;public TreeNode (int val){this.val = val;}}//插入元素;TreeNode root = null;public void put(int key){TreeNode node = new TreeNode(key);i

2020-11-17 14:17:03 293

原创 实例内部类,静态内部类,匿名内部类已经本地内部类(本地内部类使用者很少很少)

//实例内部类;class Outclass {public int val = 99;private int val2 = 98;public static int val3;//1.拿到实例内部类对象的方式;Outclass.Innerclass innerClass = outclass. new Innerclass();//2.不能再实例内部类中定义一个静态变量;如果非要如此,加一个final, 能在编译时期确定的值;//3.实例内部类是否有额外的开销;有的;//4.this --

2020-11-16 20:04:04 84

原创 七种排序方法,包括直接插入,希尔排序,堆排序,选择排序,冒泡排序,快排,归并排序;

还分析了6中算法的时间复杂度以及空间复杂度还有稳定性;//在比较的过程中,交换的时候不发生跳跃交换,就是稳定//稳定可以变成不稳定,但是不稳定不能变成稳定public class TestSort {public static void main(String[] args) {int[] array = {45, 23, 35, 6, 723, 223, 43};bubbleSort(array);System.out.println(Arrays.toString(array));}/

2020-11-12 17:33:34 261 2

原创 MySQL数据库增删查找进阶版3, 附带数据库的代码

//查数量;select * from student where id>2;select count (*) from student where id>2;//sum - 总和,avg 平均数,max 最大,min 最小;–指定字段select sum/avg/max/min( + 查询内容) + from table where + 条件//group by ;—分组查询;查询列需要时分组字段,或者是聚合函数,非分组需要为分组的最小粒度;select * from table

2020-11-11 18:22:01 126

原创 二叉树的非递归三层遍历(java实现,利用栈)

1.前序遍历和中序遍历的代码一样,只是打印的位置不同;2.后续遍历的代码相对复杂点;其中要注意标记已经打印过的点,防止重复打印;void preOrderTraversal(TreeNode root){if(root == null) return;Stack stack = new Stack<>();stack.push(root);TreeNode cur = root;while (cur != null || ! stack.isEmpty()){while (cur

2020-11-10 17:13:18 147

原创 优先级队列的构建,以及堆排序的代码操作;

public class TestHeap {public int[] elem;public int useSize;public TestHeap(){ this.elem = new int[10];}public void initHeap(int[] array){ for (int i = 0; i < array.length; i++) { this.elem[i] = array[i]; this.useSize++

2020-11-10 16:44:03 63

原创 二叉树的基本操作以及部分练习题目,(很多很多题目)

class TreeNode {public char val;public TreeNode left;public TreeNode right;public TreeNode (char val){ this.val = val;}}public class TestBinaryTree {public TreeNode createTree() {TreeNode A = new TreeNode(‘A’);TreeNode B = new TreeNode(‘B’);

2020-11-09 18:24:57 127

原创 用java解决问题--检查替换后的词是否有效

给定有效字符串 “abc”。对于任何有效的字符串 V,我们可以将 V 分成两个部分 X 和 Y,使得 X + Y(X 与 Y 连接)等于 V。(X 或 Y 可以为空。)那么,X + “abc” + Y 也同样是有效的。例如,如果 S = “abc”,则有效字符串的示例是:“abc”,“aabcbc”,“abcabc”,“abcabcababcc”。无效字符串的示例是:“abccba”,“ab”,“cababc”,“bac”。如果给定字符串 S 有效,则返回 true;否则,返回 false。这个思路

2020-11-04 22:01:09 141

原创 最小栈(每次都可以从栈里提出一个最小的元素)

private Stack stack;private Stack minStack;/** initialize your data structure here. */public MinStack() {stack = new Stack<>();//入minStack = new Stack<>();//出}public void push(int x) { //1、stack是一定需要放元素的 //2、最小栈当中 是否存放数据 x<=

2020-11-04 15:02:14 111

原创 用栈实现队列(Java实现)

private Stack s1;private Stack s2;public MyQueue3() { s1 = new Stack<>(); s2 = new Stack<>();}public void push(int x ){ //加入元素 s1.push(x);}public int pop() { //弹出元素 if (s2.empty()) { while (!s1.empty()) {

2020-11-04 15:00:58 68

原创 用队列实现栈的操作(Java实现)

private Queue qu1;private Queue qu2;private int usedSize;/** Initialize your data structure here. */public MyStack3() { qu1 = new LinkedList<>(); qu2 = new LinkedList<>();}/** Push element x onto stack. */public void push(int x)

2020-11-04 14:59:54 142

空空如也

空空如也

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

TA关注的人

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