- 博客(32)
- 收藏
- 关注
原创 【Redis】主从复制
在Redis中,用户可以通过执行SLAVEOF命令,让一个服务器去复制(replicate)另一个服务器,那么主动复制的就是从服务器,被复制的就是主服务器。老版本Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作:❑同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。❑命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。同步(sync)同步操作是从服务器向主服
2022-03-29 12:42:36 554
原创 Redis事务
MULTI 、 EXEC 与 WATCH当输入MULTI时,标志着事务的开始,之后命令入队,当输入EXEC时,表示开始执行事务。WATCH命令是一个乐观锁(optimistic locking),它可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复。WATCH功能的实现原理:每个Redis数据库都保存着一个watched_keys字典,这个字典的键是某个被WAT
2022-03-23 16:43:10 2022
原创 【详解】TCP
TCPTCP是传输层协议,提供可靠的字节流服务,它将大块的数据分割为一个个报文段来管理。1.TCP的报文段结构图片转自 如故目前我们只需要知道TCP报文段有如下内容:源端口号和目的端口号:这个不用说,表明该TCP报文来自哪,要去哪。序号和确认号:这是报文段首部最重要两个字段,也是TCP可靠数据传输的关键部分,下面详细讲。6比特的标志字段:ACK用于确认是否收到,RST、SYN、FIN用于连接的简历和拆除。PSH和URG暂时不需要了解。16位窗口大小:该字段用于流量控制,也就是指示接收方愿意
2022-02-18 16:17:02 1940
原创 Redis持久化
1.持久化持久化就是说redis不仅可以作为缓存,它还可以将数据保存到磁盘中,这样当机器故障时才不会丢失大量数据。1.1持久化之RDBRDB(Redis Database)也叫快照,是Redis默认的持久化方式。它可以在指定的时间间隔内将数据写入到磁盘中。指定的时间可以在config文件中进行配置,Redis中默认的是下面三种情况,当触发三种情况中的任意一种就会发生一次RDB持久化操作。save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis
2022-02-09 22:02:12 633
原创 【锁机制】MySQL锁机制
1.全局锁全局锁就是对整个数据库实例加锁,当加全局锁的时候,整个数据库处于只读状态。全局锁的使用场景是给数据库做备份。2.表级锁表级锁分为两种:表锁和元数据锁(meta data lock,MDL)。2.1表锁表锁的语法是 lock tables … read/write,例如执行下面的语句lock tables t1 read,t2 write;表明对表t1加读锁,对表t2加写锁。此时其他线程只能读t1,不能写t1,且不能读写t2。同时当前线程也只能读t1,读写t2,且不能访问其他表。2
2022-02-06 17:03:17 871
原创 【索引】浅谈MySQL索引
1.什么是索引索引就好比一本书的目录,所以说,就像我们看的书都有目录一样,我们建的表也都要有索引。不同之处在于:书本只有一个目录,而表可以有多个索引(但只能有一个主键索引)。如下建表语句,在表T中,id为主键索引,index (k)表示设置k为一个普通索引。create table T(id int primary key, k int not null, name varchar(16),index (k));2.索引的结构在MySQL的默认引擎InnoDB中,索引的结构都是B+树(B
2022-02-06 14:07:57 470
原创 【事务】MySQL事务特性、隔离级别
1.什么是事务通俗易懂的就是说,在我们执行一个事务期间,对数据库进行了好几步的操作,执行了多条命令,该事务结束后,这些命令要么全部都执行成功,要么全部都执行失败,不存在其他结果。2.事务的特性原子性:一个事务本身就原子的,也就是说事务中的操作要么全部完成,要么全部失败。一致性:执行事务前后,数据保持一致。比如转账业务中,无论转账成功或者失败,收款方和付款方的总额是不变的。隔离性:并发访问数据库时,多个事务之间的操作应该是是互不影响的。持久性:一个事务提交后,对数据库中数据的改变是永久的。3.事
2022-02-05 22:04:58 503
原创 简单理解CAS
CAS简单理解1.什么是CAS?2.CAS的执行过程3.CAS的缺陷(1)ABA问题(2)循环时间开销大(3)只能保证一个变量的原子操作1.什么是CAS?CAS(Compare And Swap):比较并交换。它是一条CPU指令,可以在不加锁的情况下,原子性地完成比较和交换操作。CAS有3个操作数:需要读写的内存值:V旧的预期值:A更新值:B具体操作流程如下:当且仅当V(内存中)的值等于A(预期值)时,CAS才通过原子方式用B(新的值)来更新V的值,否则不执行更新。2.CAS的执行
2021-11-23 16:52:19 794 2
原创 ==和equals的区别
我们用字符串的比较来进行演示==和equals的区别:首先明确两点:1.==比较的是两个引用指向的是否为同一个对象。2.Java中String类的equals方法是被重写过的,它比较的是两个字符串中的内容是否相等。public class equalsTest { public static void main(String[] args) { String s1 = "guQi"; String s2 = "guQi"; System.
2021-11-16 22:56:14 881 7
原创 【入门篇】JVM类加载机制
类加载机制1.什么是类加载2.类加载的过程2.1加载2.2验证2.3准备2.4解析2.5初始化【重中之重之重中重】1.什么是类加载首先你要知道一个类的从被加载到虚拟机内存中开始,到被初始化为止,是为类加载的整个过程。下图就是类加载的整个过程:一个类只有经历了加载、验证、准备、解析、初始化这五个关卡才能被认为是实现了类加载。这,就是类加载。注意一点:上面五个过程并不是按部就班地“完成”,而是按部就班地“执行”(除解析过程外)。执行时一定是先开始加载,再开始验证,但加载过程中也可能会直接开始验证。
2021-11-15 23:14:25 1819 10
原创 Java经典垃圾收集器
经典垃圾收集器1.Serial收集器2.ParNew收集器3.Parallel Scavenge收集器4.Serial Old收集器5.Parallel Old收集器6.CMS收集器7.Garbage First收集器1.Serial收集器Serial收集器是最基础,历史最久远的收集器,是一款新生代收集器,新生代收集采用的是“标记-复制算法”;它的工作方式是“单线程”。此处的单线程不仅是指它只会用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调它在垃圾收集的时候,必须暂停其他所有工作的线程,包
2021-11-14 19:34:28 1310 12
原创 JVM垃圾收集(GC)机制和GC算法
垃圾收集(Garbage Collection)机制前言1.GC需要回收哪些内存?2.回收的基本单位?1.标记:判断对象生死(1)引用计数法(Python中使用,这里做简单介绍)(2)可达性分析(Java中使用)2.回收:把死的对象回收回去(1)标记-清除算法(2)标记-复制算法(3)标记-整理算法前言垃圾收集(Garbage Collection)简称GC。1.GC需要回收哪些内存?主要回收堆,其次是方法区,栈中不需要回收,线程结束,栈上的内存就会被释放。2.回收的基本单位?内存的单位是“字节
2021-11-13 16:46:21 1211 8
原创 【简单且实用】Java基础面试题
1.如何理解基本数据类型和引用数据类型基本数据类型:数值型(int、long等)、字符型(char)、布尔型(boolean)引用数据类型:数组(array)、类(class)、接口(interface)基本数据类型的变量名对应的就是该变量本身。引用数据类型中的引用是一个地址,该地址指向它的实例对象。2.如何理解引用和对象对于下面的代码:public class Student{ public static void main(String[] args){ //看下面
2021-11-12 20:48:11 862 5
原创 剑指offer-之-字符串
剑指offer刷题笔记–字符串5.替换空格 难度:简单本题比较简单,整体思路是先定义一个StringBuffer类型的字符串,将字符串化为字符数组遍历一遍,当遇到空格时,将“%20”加入到新定义的字符串中,否则直接加入当前遍历到的字符即可。注意最后要将StringBuffer类型转化为String类型。class Solution { public String replaceSpace(String s) { StringBuffer res = new StringBu
2021-11-10 19:55:18 588 8
原创 Linux常用命令
Linux常用命令查看帮助文档 man 操作指令 查看该操作指令的帮助文档目录查看当前目录路径 pwd目录查看 ls ls 查看当前目录下的所有目录和文件 ls -a 查看当前目录下的所有目录和文件 ls -l或ll 列表查看当前目录下的所有目录和文件 ls /dir 查看指定目录下的所有目录和文件目录切换 cd cd / 切换到根目录 cd /user 切换到根目录下的user目录 cd
2021-11-09 21:02:11 2590 9
原创 剑指offer-之-哈希表
50.第一个只出现一次字符 难度:简单本题用哈希表可以很简便地解决,关键点在于key-value键值对类型是Character-Boolean。Character:对应每一个字符,Boolean:对应该字符是否只出现一次,若只出现一次为true,否则为flase。将每个字符存储到哈希表中后,再从原先字符串的顺序遍历,判断每个字符对应的value值,得到第一个只出现一次的字符。class Solution { public char firstUniqChar(String s) {
2021-11-08 18:07:39 974 6
原创 剑指offer-之-链表
6. 从尾到头打印链表 难度:简单本题要求从尾到头打印链表,输出格式为数组,我们可以通过递归到链表的最后一位再回溯将链表的节点值加入ArrayList中,再将它转化为数组即可。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Soluti
2021-11-06 11:53:19 301 16
原创 剑指offer之数组(3)
47. 礼物的最大价值 难度:中等本题典型的动态规划问题,我们创建一个二维数组dp来记录对grid数组遍历到的每一位的礼物的最大价值,值得一提的是我们创建的dp数组的行列都比grid数组多1,这是为了解决边界问题。class Solution { public int maxValue(int[][] grid) { int row = grid.length; int col = grid[0].length; int[][] dp = n
2021-11-05 11:59:33 116 4
原创 剑指offer之数组(2)
40. 最小的k个数 难度 :简单思路一:先将数组排序,再选前k个数输出即可。时间复杂度O(N*logN)思路二:题目只是要求将前k小的数字输出,并没有要求输出的顺序,因此我们可以基于快速排序将数组划分,只要将数组划分为最小的k个数字和其他数字即可。我们采用第二种方法。时间复杂度O(N)。class Solution { public int[] getLeastNumbers(int[] arr, int k) { if( k >= arr.length) re
2021-11-04 20:17:19 145 9
原创 剑指offer之数组(1)
剑指offer 刷题笔记–数组(1)3 . 数组中重复的数字 难度:简单题目规定长度为n的数组中所有元素的大小都在0~n-1这个范围内,所以查找重复元素的时候要充分利用这个条件。也就是说,在遍历数组的时候,我们将每个元素放到对应的数组下标中(如:nums[0]为2,那么我们就将0下标的元素与2下标的元素交换,此时nums[2]就为2),当遍历到一个下标为i的元素x(即x=nums[i]),并且nums[x] == x时,我们就找到了这个重复元素x。class Solution { publi
2021-11-03 19:22:17 141 8
原创 【通俗易懂】三次握手与四次挥手
三次握手1.1三次握手(Three-way Handshake)是指在建立一个TCP连接时,客户端和服务器会一共发送三个报文段。初始时客户端和服务器都处于CLOSED状态,当服务器应用程序创建一个监听套接字时,服务器处于LISTEN状态。1.第一次握手:客户端向服务器发送一个SYN报文段,报文段的首部中的标志位SYN置为1,另外还会指明客户端的初始化序列号ISN(seq=x),此时客户端处于SYN_SENT状态。2.第二次握手:服务器收到SYN的报文段后,会以自己的SYNACK报文进行应答。该应答报
2021-10-24 17:18:59 48304 24
原创 阻塞队列的实现及应用
1.手写生产者消费者模型所谓生产者消费者模型,可以用我们生活中的例子来类比:我去一个小摊儿买吃的,老板把已经做好的小吃都放在摆盘上,供我挑选。那么,老板就是生产者;我就是消费者;摆盘就是阻塞队列,用来当做生产与消费的缓冲区。因此,阻塞队列在生产者与消费者模型中起着至关重要的缓冲作用。此次先演示如何手写阻塞队列(也可以使用Java库中自带的阻塞队列)。手写的阻塞队列只实现最基础的两个功能:入队和出队。之所以叫阻塞队列,是因为当队空或者队满的时候,都要实现阻塞,直到队中不空或不满的时候,才会取消阻塞。
2021-10-17 17:55:51 390 5
原创 单例模式
单例模式概念:单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。这里介绍两种单例模式:饿汉模式和懒汉模式。单例模式的特点:1.顾名思义,单例模式只有能一个实例。2.单例模式必须自己创建自己的唯一实例。3.单例模式必须给所有其他对象提供这一实例。单例模式的应用:在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单
2021-10-15 10:18:15 111 7
原创 进程与线程【通俗易懂】
进程与线程1.什么是进程?官方定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。通俗的讲:进程可以理解为我们在电脑上正在运行的一个个应用,例如:QQ,微信,LOL2.什么是线程?官方定义:线程是操作系统能够进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位。通俗的讲:进程是一座正在运作的工厂,那么线程就是工厂里面的生产线,生产线包含在工厂中,是工厂中的实际运作单位。
2021-10-13 12:46:30 3007 9
原创 图书管理系统--Java实现
声明:本项目不涉及web操作,但需要了解java的基本语法和MySQL的基本语句运用。一、项目分布db.sql类:SQL语句,在控制台执行,用于建立图书管理库。Book类: 定义了书的一些属性(书编号,书名,作者,价格,分类,状态)并且写了属性的get、set、toSting方法。User类:定义了用户的一些属性(用户编号,用户名,密码和是否为管理员的标记),并且写了属性的get、set、toSting方法。NormalUser类:描述普通用户,实现普通用户的构造方法,并打印普通用户的操作.
2021-10-07 22:47:27 7031 23
原创 【必会排序算法】七大基于比较的排序
七大基于比较的排序直接插入排序思想:以双指针来进行遍历数组和寻找较小元素的操作,每次找到较小元素的时候就将其插入到前面的适当位置,当遍历完整个数组,并完成插入操作后,排序完成。时间复杂度:最好情况:O(N)最坏情况:O(N^2)空间复杂度:O(1)结论:当一组数据趋近于有序,适用于插入排序public static void insertSort(int[] array) { //该循环实现对整个数组的遍历操作 for (int i = 1; i < ar
2021-09-21 22:53:26 290 10
原创 【非递归实现】二叉树的前中后序遍历
二叉树的前中后序遍历核心思想:用栈来实现对节点的存储。一边遍历,一边将节点入栈,在需要时将节点从栈中取出来并遍历该节点的左子树或者右子树,重复上述过程,当栈为空时,遍历完成。前序遍历//非递归//根 左 右class Solution { public List<Integer> preorderTraversal(TreeNode root) { //用数组来存储前序遍历结果 List<Integer> list = new Arr
2021-09-15 21:33:45 535 10
原创 Java中如何判断素数
判断一个数是否是素数代码很简单,通过一个循环判断n是不是素数。在循环开始前用布尔类型定义个标记flag,在循环中,如果n%j==0,则这个数不是一个素数,将flag赋值为true,循环结束后通过flag的结果来判断这个数是否为素数。public static void isSuShu(int n){ boolean flag=false; for(int j=2;j<=Math.sqrt(n);++j){ if(n%j==0)
2021-08-26 14:08:29 682
原创 方法的重载
【方法的重载详解】初识Java方法方法的重载(overload):* 1.方法名相同* 2.返回值不做要求* 3.参数列表必须不同(参数个数或者类型不同)* 4.在同一个类当中方法的重载 代码如下: public static int add(int a,int b){ return a+b; } public static int add(int a,int b,int c){ return a+b+c; } public
2021-08-24 11:57:20 72
原创 字符串必知事项
Java中输入字符串时,有哪些要注意的呢?nextLine()与nextInt()共用时的注意事项1.当两者一起用的时候,nextLine()应该放到nextInt的前面,也就是先输入字符串,不然会导致字符串输入失败。正确示范//nextLine()放在前面public class IdeaText { public static void main(String [] args) { Scanner sca=new Scanner(System.in);
2021-08-23 17:37:24 102 1
原创 2021-08-23
Java基本数据类型1.整型(4种)2.浮点类型(2种)3.char类型(1种)4.boolean类型(1种)1.整型(4种)类型大小int4字节short2字节long8字节byte1字节 int i=10; short s=9; long L=11L; byte b=6;注意:对于长整型long,必须写成long 变量名=数字L,数字后面必须加上字母L或者字母l,大小写都可。2.浮
2021-08-23 09:36:29 78
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人