自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux常用命令

命令一定要实操,才能记住是常用的分析性能的工具,能够实时监控系统中各个进程资源占用的情况。top -H命令是Linux命令,而INFO命令是Redis命令。netstat 命令主要用于查看目前本机的网络使用情况。vim stat命令 主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。---6.主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。

2024-05-26 23:58:02 480

原创 Java异步编程

线程从启动到执行完毕,一般会有一些耗时操作,并不能像一般的程序语句,就能立马结束。所以把这些耗时的操作交给子线程去处理,处理完了,返回结果就行;这样并不会阻塞主线程,使得主线程的任务更快的执行完成。异步调用是多线程领域的核心思想,并非 Java 语言独有。

2023-03-15 20:00:22 786 1

原创 IO模型--从BIO、NIO、AIO到内核select、poll、epoll剖析

正是因为 epoll 能自定义监听的描述符数量,以及可以直接返回就绪的描述符,Redis 在设计和实现网络通信框架时,就基于 epoll 机制中的 epoll_create、epoll_ctl 和 epoll_wait 等函数和读写事件,进行了封装开发,实现了用于网络通信的事件驱动框架,从而使得 Redis 虽然是单线程运行,但是仍然能高效应对高并发的客户端访问。NIO是一种基于通道、面向缓冲区的IO操作,相较BIO而言,它能够更为高效的对数据进行读写操作,同时与原先的BIO使用方式也大有不同。

2023-02-16 18:06:22 1441

原创 Redis内存存储效率问题

实习期间,了解到,企业级开发中多个项目使用Redis,运行Redis实例的有可能是同一台物理机器,那么,前一个项目的数据过期了,新的项目重新部署Redis,就要关注Redis的内存存储效率了,毕竟硬件资源成本高且有限。实际上,这是因为,当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给 Redis 分配了大量内存。

2023-02-12 22:17:04 957

原创 Redis实例绑定CPU物理核优化Redis性能

进入本次Redis性能调优之前,首先要知道CPU结构也会影响Redis的性能。接下来,具体了解一下!为什么CPU结构也会影响Redis的性能?主流的 CPU 架构一个 CPU 处理器中一般有多个物理核,每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存(Level 1 cache,简称 L1 cache),包括一级指令缓存和一级数据缓存,以及私有的二级缓存(Level 2 cache,简称 L2 cache)。

2023-02-12 00:05:41 1006 1

原创 @Redis面试题

Redis是C语言编写的一个基于内存的高性能键值对(key-value)的NoSQL数据库,一般用于架设在Java程序与数据库之间用作缓存层,为了防止DB磁盘IO效率过低造成的请求阻塞、响应缓慢等问题,用来弥补DB与Java程序之间的性能差距,同时,也可以在DB吞吐跟不上系统并发量时,避免请求直接落入DB从而起到保护DB的作用。

2022-11-14 11:29:31 710

原创 @Spring解决循环依赖

简单说,就是A对象依赖B对象,B对象又依赖A对象,类似的代码如下:

2022-11-04 21:21:36 972

原创 @堆外内存和堆内内存及虚引用的应用

当。

2022-11-02 21:19:40 1648 1

原创 限流模块再理解

令牌桶算法最初来源于计算机网络。在网络传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送。令牌桶算法就实现了这个功能,可控制发送到网络上数据的数目,并允许突发数据的发送。如果我们需要在一秒内限制访问次数为 N 次,那么就每隔 1/N 的时间,往桶内放入一个令牌;在处理请求之前先要从桶中获得一个令牌,如果桶中已经没有了令牌,那么就需要等待新的令牌或者直接拒绝服务;桶中的令牌总数也要有一个限制,如果超过了限制就不能向桶中再增加新的令牌了。

2022-10-22 13:09:14 517

原创 项目中缓存的使用

Guava Cache是 Google 提供的一套 Java 工具包,是一套非常完善的本地缓存机制(JVM缓存)。Guava Cache 的设计来源于 CurrentHashMap,可以按照多种策略来清理存储在其中的缓存值,且保持很高的并发读写能力。本项目中缓存策略是Redis结合本地缓存,秒杀业务下,高频读取缓存对Redis压力很大,使用本地缓存结合Redis缓存使用,降低Redis压力,同时本地缓存没有连接开销,性能更优。好的博客,记得结合慕课视频对应章节的问答面试官:你对Redis缓存了解吗?

2022-10-19 21:17:20 962

原创 @项目中使用到的Spring注解及其作用

上述这一过程那就是:从 ClassPath下扫描所有的 META-INF/spring.factories 配置文件,并将spring.factories 文件中的 EnableAutoConfiguration 对应的配置项通过反射机制实例化为对应标注了 @Configuration 的形式的IoC容器配置类,然后注入IoC容器。

2022-10-16 18:51:24 1575 1

原创 @Java的序列化和反序列化及其在项目中的使用

可以的。对于序列化一个对象需调用 ObjectOutputStream.writeObject(saveThisObject), 并用 ObjectInputStream.readObject() 读取对象, 但 Java 虚拟机提供的还有一件事, 是定义这两个方法。如果在类中定义这两种方法, 则 JVM 将调用这两种方法, 而不是应用默认序列化机制。同时,可以声明这些方法为私有方法,以避免被继承、重写或重载。

2022-10-13 23:57:03 1673

原创 @Java中实现定时任务

创建 java.util.TimerTask 任务,在 run 方法中实现业务逻辑。通过 java.util.Timer 进行调度,支持按照固定频率执行。所有的 TimerTask 是在同一个线程中串行执行,相互影响。也就是说,对于同一个 Timer 里的多个 TimerTask 任务,如果一个 TimerTask 任务在执行中,其它 TimerTask 即使到达执行的时间,也只能排队等待。如果有异常产生,线程将退出,整个定时任务就失败。}}

2022-10-12 21:16:26 3473

原创 @常用设计模式在Java源码中的体现

AQS的典型设计模式就是模板方法设计模式。AQS全家桶(ReentrantLock,Semaphore)的衍生实现,就体现出这个设计模式。如AQS提供tryAcquire,tryAcquireShared等模板方法,给子类实现自定义的同步器。

2022-10-10 18:49:43 515

原创 @工厂模式详解及在项目中的使用

它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。实现了创建者和调用者分离,工厂模式分为简单工厂、工厂方法、抽象工厂模式策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的的客户。这个策略模式的定义是不是有点抽象呢?通俗易懂的比喻:假设你跟不同性格类型的小姐姐约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去逛街买买买最合适。

2022-10-09 20:59:45 1057

原创 @ThreadLocal原理与Java中的四种引用深入理解

类访问共享变量时,会在每个线程的本地,都保存一份共享变量的拷贝副本。多线程对共享变量修改时,实际上操作的是这个变量副本,从而保证线性安全。变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候,实际是在操作自己本地内存里面的变量,从而起到。因为使用了线程池,线程池有很长的生命周期,因此线程池会一直持有。,如果当前线程再迟迟不结束的话(比如线程池的核心线程),这些。类型的值,我们可以好理解,因为它是线程隔离的嘛。可以发现,在子线程中,是可以获取到父线程的。

2022-10-08 15:35:04 387

原创 @TCP粘包问题

语义解释为:指TCP协议中,发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。TCP是面向字节流的协议,就是没有界限的一串数据,本没有“包”的概念,“粘包”和“拆包”一说是为了有助于形象地理解这两种现象。

2022-09-23 12:54:13 766

原创 @项目线程池优化及库存行锁优化

就本项目而言,设置了拥塞窗口的为20的等待队列,在秒杀场景下,很容易堆积大量的请求,系统。----推荐的文章不错。

2022-09-11 19:47:31 320

原创 @多线程难点

是Thread类的静态方法,当前线程将睡眠n毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进入可运行状态,等待CPU的到来。睡眠不释放锁(如果有的话)。

2022-08-24 23:16:53 813 1

原创 电商秒杀项目收获(二)

它们控制着从连接池中获取连接的流程:如果当前连接数小于最小连接数,则创建新的连接处理数据库请求;如果连接池中有空闲连接则复用空闲连接;如果空闲池中没有连接并且当前连接数小于最大连接数,则创建新的连接处理请求;如果当前连接数已经大于等于最大连接数,则按照配置中设定的时间等待旧的连接可用;如果等待超过了这个设定时间则向用户抛出错误。......

2022-08-04 23:57:57 587

原创 秒杀项目收获

项目架构设计对应三层模型所得到的启示异常处理全局异常统一处理MD5加密数据库设计数据库优化:查询请求增加时,如何做主从分离?主从读写分离主从读写的两个技术关键点1.主从复制的缺点:本项目采用的解决主从复制缺点的方案:使用缓存本项目如何保证数据一致性(解决引入缓存后数据不一致):缓存简介:缓存分类:缓存的不足:针对缓存重点应该关注的点:多级缓存:查询性能优化项目中的缓存逻辑缓存库存:交易性能优化交易性能瓶颈解决方案:库存行锁优化.

2022-08-03 23:00:09 706

原创 @HTTP状态码

HTTP 状态码的作用是服务器告诉客户端当前请求响应的状态,通过状态码就能判断和分析服务器的运行状态;状态码的第一位数字表示状态类型,第二、三位数字表示具体的情况

2022-07-22 23:51:03 246

原创 数据链路层及网络层协议要点

计算机网络

2022-07-01 20:42:20 276

原创 @阻塞队列和线程池

阻塞队列当队列是空的,从队列中获取元素的操作将会被阻塞当队列是满的,从队列中添加元素的操作将会被阻塞试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增常见的BlockingQueue1.ArrayBlockingQueue(常用)2.LinkedBlockingQueue(常用)3.DelayQueue4...

2022-06-03 14:48:14 1440 1

原创 计算机网络体系

体系结构分层的作用(为什么需要网络协议的分层?)分层最大的好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接。 在代码中,类似于定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类 (使用方,使用服务): 对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。 TCP/IP五层(或四层)模型 TCP/IP是............

2022-05-23 17:22:14 553

原创 Java技巧

日期类蓝桥杯比赛中经常出现的有关日期问题的题目,通常需要大量的代码判断日期,非常不方便。Java为我们封装好了日历类Calender省去了大量的代码编写,使用该类能够让日期问题变得十分简单~创建Calender实例使用 Calender 的工厂方法 :Calender.getInstance()获取Calender实例:public static void main(String[] args) throws IOException { Calendar calendar = C.

2022-05-13 23:44:17 539

原创 三万字总结Java多线程

JUC简介在Java中,线程部分是一个重点,本篇文章说的JUC也是关于线程的。JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包,JDK1.5开始出现的。线程与进程程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。进程(process)是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。---生命周期进程 — 资源分配的最小单位。线程(th..

2022-05-04 18:08:11 5184 3

原创 动态规划刷题攻略(二)

序列型动态规划265.粉刷房子 II---- 序列型动态规划动态规划组成部分一:确定状态动态规划组成部分二:转移方程优化后代码: public int minCost(int[][] A) { if(A.length == 0){ return 0; } int n = A.length; int k = A[0].length; int[][]...

2022-04-19 23:24:07 412 2

原创 Java的JDBC编程

JDBC到底是什么?JDBC(Java Database Connectivity),java数据库连接。JDBC是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,用于执行SQL语句的Java API。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,各种不同类型的数据库都有相应的实现,本文中的代码都是针对MySQL数据库实现的。JDBC工作原理JDBC 为多种关系数据库提供了统一访问方式,.

2022-04-06 15:23:44 1434 1

原创 动态规划入门攻略(一)

什么是动态规划?定义:动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。 在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接 使用这些结果。动态规划具备了以下三个特点:1. 把原来的问题分解成了几个相似的子问题。 2. 所有的子问题都只需要解决一次。 3. 储存子问题的解。 动态规划的本质,是对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系) 动态规划问题一般从以下四个角度

2022-04-04 20:53:27 1129 1

原创 优先级队列(堆)及Top K问题

2022-03-11 13:00:05 1382 2

原创 Java集合常用方法及总结

Collection接口public interface Collection<E> extends Iterable<E> {源码中方法List接口public interface List<E> extends Collection<E> {Queue接口public interface Queue<E> extends Collection<E> {Deque接...

2022-02-18 22:55:02 2083 2

原创 LinkedList源码分析

ArrayList与LinkedList简洁对比:ArrayList是查询速度比较快,插(插入中间,而不是末尾)删速度比较慢,而LinkedList就是查询速度比较慢,插(插入中间)删速度比较快,到底是什么原因导致了它们的不一样呢?了解过它们的底层实现,就可以知道,ArrayList底层是由数组实现的,数组就是在内存里面申请一段连续的内存,然后在里面读写数据,它查询的时间复杂度是O(1),但是如果要往数组里面添加或者删除数据的话,在添加(删除)位置后面数都要往前或者往后相应的位置,所以它增删的时间复杂度

2022-02-17 20:21:14 1391 1

原创 ArrayList源码分析

ArrayList继承结构和层次关系ArrayList:说明ArrayList支持泛型。extends AbstractList :继承了AbstractList。为什么要先继承AbstractList,而让AbstractList先实现List?而不是让ArrayList直接实现List?这里是有一个思想,接口中全都是抽象的方法,而抽象类中可以有抽象方法,还可以有具体的实现方法,正是利用了这一点,让AbstractList是实现接口中一些通用的方法,而具体的类, 如ArrayList就继承这个A

2022-02-16 19:23:57 277

原创 HashMap的源码分析

目录简介:HashMap存储结构JDK1.7:JDK1.8:面试点:jdk8中HashMap为什么要引入红黑树?常用的变量面试点:为什么HashMap的默认初始化长度是16?面试题:负载因子的大小,对HashMap有什么影响?modCount的注意点:HashMap构造函数tableSizeFor()面试点:put()方法面试点:hash()计算原理面试点:关于映射关系的key是否可以修改?面试点:为啥重写equals方法的时候需要重写hashCo

2022-02-14 22:21:26 1519 7

原创 模板设计模式和代理模式

一、基于抽象类的模板设计模式:eg:用代码描述喝咖啡a.把水烧开 b.将咖啡导入顾客杯子中 c.将咖啡倒入顾客杯子中 d.加糖和牛奶public class Coffee{ //一键启动按钮,点这个按钮就能出一杯咖啡 public void prepareRecipe(){ boilWater(); brewCoffeeBag(); pourInCup(); addSugarAndMilk(); }}

2022-01-26 20:26:15 638

原创 详解单链表

1

2021-12-05 20:07:00 1969 7

原创 MYSQL查询(分组和连接)

分组查询语法: 语法: select 分组函数,列(要求出现在group by的后面) form 表 【where 筛选条件】 group by 分组的列表 【order by 子句】注意: 查询列表必须特殊,要求是分组函数和group by后出现的字段特点: 1.分组查询中的筛选条件分为两类 数据源 ...

2021-11-24 21:41:05 1756 5

原创 Java中的键盘输入

使用 Scanner 读取字符串/整数/浮点数import java.util.Scanner;//需要导入util包Scanner sc = new Scanner(System.in); System.out.println("请输入你的姓名:"); String name = sc.nextLine();System.out.println("请输入你的年龄:"); int age = sc.nextInt();System.out.println("请输入你的工资...

2021-11-19 21:39:34 411

原创 【递归+迭代详解】二叉树的morris遍历、层序遍历、前序遍历、中序遍历、后序遍历

分析二叉树的前序,中序,后序的遍历步骤1.层序遍历二叉树的层次遍历的迭代方法与前面不用,因为前面的都采用了深度优先搜索的方式,而层次遍历使用了广度优先搜索,广度优先搜索主要使用队列实现,也就不能使用前面的模板解法了。广度优先搜索的步骤为:初始化队列 q,并将根节点 root 加入到队列中;当队列不为空时:队列中弹出节点 node,加入到结果中;如果左子树非空,左子树加入队列;如果右子树非空,右子树加入队列;由于题目要求每一层保存在一个子数组中,所以我们额外加入了 level 保存每

2021-11-14 21:40:41 1769 7

空空如也

空空如也

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

TA关注的人

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