- 博客(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 419
原创 redis的过期策略
三种过期键删除策略1)定时删除:创建一个定时器,到时间立即执行删除操作(对内存友好,因为能保证过期了立马删除,但是对cpu不友好)2)惰性删除:键过期不管,每次获取键时检查是否过期,过期就删除(对cpu友好,但是只有在使用的时候才可能删除,对内存不友好)3)定期删除:隔一段时间检查一次(具体算法决定检查多少删多少,需要合理设置)淘汰策略当Redis占用内存超出最大限制 (maxmemory) 时,可采用如下策略 (maxmemory-policy) ,让Redis淘汰一些数据,以腾出空间继续提供读
2021-12-07 16:03:46 4410
原创 无所不知——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 712
原创 使用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 358
原创 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 134
原创 Java中接口和抽象类的区别
接口和抽象类的区别?接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现。抽象类是可以有私有方法或私有变量的,通过把类或者类中的方法声明为abstract来表示一个类是抽象类,被声明为抽象的方法不能包含方法体。子类实现方法必须含有相同的或者更低的访问级别(public->protected->private)。抽象类的子类为父类中所有抽象方法的具体实
2021-03-16 10:59:27 111
原创 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 360
原创 TCP协议的三次握手与四次挥手
一. 建立连接—三次握手首先客户端和服务端都是关闭状态,也就是CLOSED状态。服务器端进入一个监听的LISTEN状态,阻塞等待客户端的连接第一次握手:客户端向服务端发送一个SYN的标志位以请求连接。此时客户端进入SYN_SEND状态,也就是开始阻塞等待服务器的应答。第二次握手:服务器收到了客户端的SYN连接请求,也就处于SYN_RCVD状态。由于现在客户端向服务端单方面请求连接了,但是服务端还没有发送连接请求给客户端,要想双方都建立连接的话,就需要服务端也向客户端发送一个SYN请求。同时,我们还需要
2021-02-27 20:36:55 110
原创 TCP的拥塞控制
一. 流量控制1.1 产生原因我们知道在接收端接收数据的时候,会先将数据保存在接收缓冲区中,等待应用程序调用recv()方法读取。如果接收缓冲区内的数据一直没有被应用进程读取,接收缓冲区空间被填满,发送端再继续发送数据的话,就会引起丢包等一系列的连锁问题。为了避免这种问题的发生,TCP中可以根据接收端的处理数据的速度和能力,来决定发送端的发送速度,这个机制就叫做流量控制。1.2 流量控制方法在接收端接收到数据之后,返回的ACK中,会将自己可以接收数据的缓冲区大小放到TCP头部的“窗口大小”的字段中
2021-02-27 20:34:07 240
原创 TCP协议与UDP协议的区别
UDP协议1.1 流程服务器:new DatagramSocket(端口号) 启动服务器。服务器:receive()方法等待接收网络数据包(阻塞方法:服务端先调用该方法,会进入持续等待的状态)。客户端:通过目的ip+目的port(端口号),找到远程服务器(UDP无连接,但可以找到远程主机上的UDP进程)。客户端:通过send()方法发送请求数据。服务端:也通过send()方法响应客户端发来的数据,发送数据包。客户端:receive()方法接收服务端发来的数据。1.2 UDP协议特点无连接.
2021-02-27 20:33:08 132
原创 TCP可靠性之滑动窗口
我们知道TCP协议中有一个确认应答机制,每发送一个数据段,就需要有一个ACK来响应,如果这样一收一发的话,会让数据传输的效率变得很低。滑动窗口就是用来解决这个问题的,也就是我们一次发送多条数据。例如现在不需要等待确认应答可以发送数据的最大值为4000个字节,我们将4000个字节分为四个数据段来进行发送。在发送前四个数据段的时候,我们不需要等待任何的ACK应答,可以直接发送。当收到第一个数据段的ACK之后,滑动窗口就会向后移动一个单元,再继续发送第五段数据,然后依次类推。发送缓冲区 操作系统为了维护滑动..
2021-02-27 20:32:02 165
原创 Tcp/ip封装解析过程
封装 首先在应用层,浏览器会将请求数据封装为HTTP协议数据包,在原本数据包中加入HTTP头。1.传输层:tcp协议将前一个封装的数据包再次封装为tcp数据包。2.网络层:封装ip协议。3.数据链路层:封装了数据帧。 解包分用1.数据链路层:操作系统在网卡接收到数据之后,再解析接收到的数据包,其中就会处理数据帧。2.网络层:系统处理ip头部。3.传输层:系统处理tcp报头,报头中包括ip和port,知道了端口号,找到对应的应用程序,,系统将数据包交给应用程序来处理数据。4.应用层:应用程
2021-02-27 20:29:55 4156
原创 HTTP响应常见的状态码
HTTP常见状态码有哪些?a. 2开头状态码;2xx (成功)表示成功处理了请求的状态代码;如:200 (成功) 服务器已成功处理了请求。b. 3开头状态码;3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。如:304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容c. 4开头状态码;4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理;如:400 (错误请求) 服务器不理解请求的语法;403 (禁止) 服务器拒
2021-01-07 17:10:08 290
原创 Servlet的生命周期
二、Servlet生命周期简述(1)加载和实例化当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。(2) 初始化实例化后,Servlet容器将调用Servlet的init()方法进行初始化(一些准备工作或资源预加载工作)。(3)服务初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,HttpServ.
2021-01-07 17:05:38 93
原创 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 78
原创 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 675
原创 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 699
原创 线程池的创建方式---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 94
原创 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 135
原创 泛型的基本,以及包装类
泛型诞生的作用: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 125
原创 数组拷贝的方法
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 170
原创 重载和重写的区别
重写:(1)重写有一个必须的前提:重写只能发生再父类和子类之间,而且必须是子类对父类的的方法进行重写(2)重写子类的参数必须和父类的参数一模一样,不论是参数的类型或者参数的数量(3)返回值的类型需要相同(4)在权限修饰方面:子类的权限必须要大于或者等于父类的权限(5)子类抛出的异常不能大于父类抛出的异常重载:(1)重载的对象是:同一个类中的不同方法,也就是说一个方法可以对另一个方法进行重载操作(2)参数必须不一样,可以是参数的个数不同,参数的类型不同(3)对于方法的返回值没有要求必须相同
2020-11-30 10:43:17 156
原创 ArrayList和LinkedList的区别
LinkedList和ArrayList的差别主要来自于Array和LinkedList数据结构的不同。ArrayList是基于数组实现的,LinkedList是基于双链表实现的。另外LinkedList类不仅是List接口的实现类,可以根据索引来随机访问集合中的元素,除此之外,LinkedList还实现了Deque接口,Deque接口是Queue接口的子接口,它代表一个双向队列,因此LinkedList可以作为双向对列,栈(可以参见Deque提供的接口方法)和List集合使用,功能强大。因为Array.
2020-11-30 10:40:37 208
原创 数组和ArrayList的区别与联系
(1)首先,两者都是 Java 中重要的数据结构,经常会被使用到,数组是 Java 中当中的基础数据结构,而 ArrayList 是 Java Collection 框架下的 List 的接口的一个实现类,其内部实现原理就是依靠数组去实现的,只不过数组在构建的时候就确定的数组的长度,并且是不可变化的,而 ArrayList 可以根据情况自身进行数组的扩容,来达到动态数组的功能,所以 ArrayList 可以被理解为一种动态能够变化长度的数组,并且 ArrayList 当中还提供更多的方法来方便对于顺序表的操
2020-11-30 10:36:50 3516
原创 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 72
原创 equals和==的区别
==(1)如果比较的是基础数据类型,那么 == 比较的是他们的值是否相同(2)如果比较的是引用数据类型,那么 == 比较的是他们的引用地址是否相同,也就是比较的栈中局部变量表里的 reference 引用是否相同。equals(1)equals 是一个 Object 类中的方法,从源码可以知道,他比较的是两个对象的引用地址是否相(2)但是其他类会重写 Object 类中的 equals 方法,重新定义比较的规则,像 String 中就重写了 equals 方法,他比较的是两个 String 对象的
2020-11-23 14:32:45 437
原创 实现哈希桶,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 328
原创 前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 114
原创 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 114
原创 二叉搜索树的建立,删除关键字以及寻找关键字;
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 311
原创 实例内部类,静态内部类,匿名内部类已经本地内部类(本地内部类使用者很少很少)
//实例内部类;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 129
原创 七种排序方法,包括直接插入,希尔排序,堆排序,选择排序,冒泡排序,快排,归并排序;
还分析了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 325 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 144
原创 二叉树的非递归三层遍历(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 163
原创 优先级队列的构建,以及堆排序的代码操作;
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 82
原创 二叉树的基本操作以及部分练习题目,(很多很多题目)
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 144
原创 用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 185
原创 最小栈(每次都可以从栈里提出一个最小的元素)
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 127
原创 用栈实现队列(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 97
原创 用队列实现栈的操作(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 181
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人