- 博客(270)
- 资源 (3)
- 收藏
- 关注
原创 Redis缓存击穿
Redis缓存击穿是指在使用Redis作为缓存时,某个热点数据过期或不存在,导致大量请求直接打到后端存储系统(例如数据库),使得后端系统压力骤增,性能下降的情况。这种情况通常发生在热点数据失效的瞬间。
2023-07-25 14:27:27
663
原创 github获取token
1、在https://github.com登录你的帐号,登录以后点击右上角你的头像的Settings2、 点击Developer settings下的Personal access tokens3、点击https://github.com/settings/tokens/new这个超链接,就是创建你的token。4、在Token description中随便填一个描述名称,下面的复选框是你这个token需要的权限,全部勾上就可以了。然后点击下面这个绿色的按钮:5、下面
2020-12-13 18:11:49
4224
原创 tomcat官方下载
1.首先进入tomcat官方网址:http://tomcat.apache.org这里有7、8、9版本下载,我们选择Download下边最后一个选项Archives点击进入2.我们可以看到这里有好几个版本,你想要的版本都在这里,比如我们要选 tomcat-9版本,点击进入3.我们可以看到从Tomcat 9.0.0.M1到Tomcat 9.0.0.M9都有4.选择自己要的版本,点击进入5.选择bin/目录下点击进入,看到有好几种包的类型6.根据自己的操作系统和需要下载...
2020-12-13 17:48:13
384
原创 14、对硬盘操作
在Linux中给系统增加一块硬盘的步骤:一、分区1、硬盘分区基础2、Linux系统中硬盘设备名3、常用的磁盘操作命令fdisk命令【功能】用来进行创建分区、删除分区、查看分区信息等基本操作。【格式】fdisk [-l] [device]查看现有磁盘设备系统分区情况:fdisk –l对sdb硬盘创建分区等操作 :fdisk /dev/sdb二、格式化格式化实际是指在物理存储设备上重新创建文件系统。1、文件系统的创建文件系统的创建工作主要有两个方面的内容.
2020-12-06 14:14:43
356
原创 13、用户、组管理
一、相关概念用户管理的核心是对用户及其资源使用的各种权限的审核账户:一个用户在系统上标识。用户账户:文件、进程、任务,给每个用户提供特定的工作环境 组账户:具有相同特征的用户的集合体 用户(账户):超级用户:root 系统用户:伪账户 普通用户组(账户):私有组 标准组 主组:登陆后所属的组 附加组二、与用户相关的文件1、passwd文件位置:/etc/passwd作用:保存各个用户的账户信息(密码除外)。文件格式:每行定义一个用户账号,一行中又划分为多个字
2020-12-03 13:45:30
476
原创 12、网络基础配置
一、IP地址IP地址是TCP/IP网络中,用于识别主机的唯一地址。1、IPv4地址32位二进制表示,每8位二进制数组成一组,共四组,中间以.间隔,即用形如x.x.x.x的格式表示。x为8位二进制数转换而来的十进制数,其值为0~255。例如:192.168.2.5这种格式的地址通常称为:点分十进制。每个IP地址包含两个部分:网络号和主机号2、CIDR(Classless Inter-Domain Routing)方法划分子网CIDR方法划分:192.168.2.0/.
2020-12-02 15:40:20
3300
原创 Java注解2--解析注解
一、概念通过反射获取类、函数或成员上的运动时注解信息,从而实现动态控制程序运行的逻辑。二、操作代码1、准备注解2、编写解析代码public class ParseAnn{ public static void main(String[] args){ //1、使用类加载器加载类 try{ Class c=Class.forName("com.ann.test.Child"); //2、找到类上面
2020-08-12 11:09:44
166
原创 Java注解学习1
一、概念Java提供了一种源程序中的元素关联任何信息和任何数据的途径和方法。二、JDK自带注解1、@Override(表示方法覆盖父类的方法)2、@Deprecated(表示该方法过期了)3、@SuppressWarning(表示忽略警告)三、注解的分类按运行机制分源码注解--注解只在源码中存在,编译成.class文件就不存在了 编译时注解--注解在源码和.class文件中都存在 运行时注解--在运行阶段还起作用,甚至影响运行逻辑的注解按照来源分来自JDK的注解
2020-08-12 10:50:31
154
原创 Cookie和Session的工作原理与作用
一、Cookie1、介绍因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪而储存
2020-08-11 15:10:59
385
原创 Https加密过程
一、HTTP和HTTPS区别HTTP:直接通过明文在浏览器和服务器之间传递信息。HTTPS:采用对称加密和非对称加密结合的方式来保护浏览器和服务端之间的通信安全。二、对称加密与非对称加密对称加密:加密和解密都是同一个密钥。非对称加密:密钥成对出现,分为公钥和私钥,公钥和私钥之间不能互相推导,公钥加密需要私钥解密,私钥加密需要公钥解密。区别对称加密速度快,非对称加密速度慢(相对慢100倍)。 对称加密相对非对称加密不安全,只要密钥暴露和,明文传递没有区别;非对称加密可以将公...
2020-08-11 14:13:12
581
原创 算法练习--二叉树展开为链表
题目:给定一个二叉树,将它展开为一个单链表。示例:个人思路:其实就是进行前序遍历,用列表存储每个节点,然后对每个节点的指针进行修改代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int va
2020-08-11 13:46:35
153
原创 算法练习--打家劫舍 III--递归
题目:在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例:个人思路:用一个flag进行标记,为0表示不抢,那么最大金额来自左右子树的最大抢劫之和;为1表示抢,那么最大金额为该
2020-08-11 13:29:21
347
原创 线程池自学笔记14--取款业务练习
案例介绍:设计一个程序,使用两个线程模拟在两个地点同时从一个账号中取钱,假如卡中一共有1000元,每个线程取800元,要求演示结果一个线程取款成功,剩余200元,另一个线程取款失败,余额不足;要求:1:使用线程池创建线程2:解决线程安全问题思路提示:1:线程池可以利用Executors工厂类的静态方法,创建线程池对象;2:解决线程安全问题可以使用synchronized方法控制取钱的操作;3:在取款前,先判断余额是否足够,且保证余额判断和取钱行为的原子性;代码:编写任
2020-08-03 14:45:28
247
原创 线程池自学笔记13--秒杀商品练习
案例介绍: 假如某网上商城推出活动,新上架10部新手机免费送客户体验,要求所有参与活动的人员在规定的时间同时参与秒杀挣抢,假如有20人同时参与了该活动,请使用线程池模拟这个场景,保证前10人秒杀成功,后10人秒杀失败;要求: 1:使用线程池创建线程 2:解决线程安全问题思路提示: 1:既然商品总数量是10个,那么我们可以在创建线程池的时候初始化线程数是10个及以下,设计线程池最大数量为10个; 2:当某个线程执行完任务之后,可以让其他秒杀的人继续使用该线程...
2020-08-03 01:41:40
364
原创 线程池自学笔记12--异步计算结果(Future)
我们有时需要利用线程进行一些计算,然后获取这些计算的结果,而java中的Future接口就是专门用于描述异步计算结果的,我们可以通过Future 对象获取线程计算的结果;Future 的常用方法如下: boolean cancel(boolean mayInterruptIfRunning)试图取消对此任务的执行。 V get()如有必要,等待计算完成,然后获取其结果。 V get(long timeout, TimeUnit unit)如有必要,最多等待为使计算完成所给定的时间之后,获..
2020-08-03 01:13:17
250
原创 线程池自学笔记11--scheduleWithFixedDelay练习
编写任务类class MyRunnable3 implements Runnable{ private int id; public MyRunnable3(int id) { this.id = id; } @Override public void run() { String name = Thread.currentThread().getName(); try { Thread
2020-08-02 22:30:37
295
原创 线程池自学笔记10--scheduleAtFixedRate练习(间隔重复执行)
编写任务类class MyRunnable2 implements Runnable{ private int id; public MyRunnable2(int id) { this.id = id; } @Override public void run() { String name = Thread.currentThread().getName(); try { Thread
2020-08-02 22:26:53
686
原创 线程池自学笔记9--schedule练习
编写任务类class MyRunnable implements Runnable{ private int id; public MyRunnable(int id) { this.id = id; } @Override public void run() { String name = Thread.currentThread().getName(); System.out.println(name+"执
2020-08-02 22:19:54
146
原创 线程池自学笔记8--ScheduledExecutorService接口
ScheduledExecutorService是ExecutorService的子接口,具备了延迟运行或定期执行任务的能力,常用获取方式如下:static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)创建一个可重用固定线程数的线程池且允许延迟运行或定期执行任务;static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, Th
2020-08-02 22:16:48
280
原创 线程池自学笔记7--shutdown、shutdownNow练习
编写任务类/* 任务类,包含一个任务编号,在任务中,打印出是哪一个线程正在执行任务 */class MyRunnable4 implements Runnable{ private int id; public MyRunnable4(int id) { this.id = id; } @Override public void run() { //获取线程的名称,打印一句话 String name
2020-08-02 21:37:48
281
原创 线程池自学笔记6--newSingleThreadExecutor练习
编写任务类/* 任务类,包含一个任务编号,在任务中,打印出是哪一个线程正在执行任务 */class MyRunnable3 implements Runnable{ private int id; public MyRunnable3(int id) { this.id = id; } @Override public void run() { //获取线程的名称,打印一句话 String name
2020-08-02 21:11:03
224
原创 线程池自学笔记5--newFixedThreadPool练习
编写任务类/* 任务类,包含一个任务编号,在任务中,打印出是哪一个线程正在执行任务 */class MyRunnable2 implements Runnable{ private int id; public MyRunnable2(int id) { this.id = id; } @Override public void run() { //获取线程的名称,打印一句话 String name
2020-08-02 21:08:54
167
原创 线程池自学笔记4--newCachedThreadPool练习
编写任务类/* 任务类,包含一个任务编号,在任务中,打印出是哪一个线程正在执行任务 */class MyRunnable implements Runnable{ private int id; public MyRunnable(int id) { this.id = id; } @Override public void run() { //获取线程的名称,打印一句话 String name =
2020-08-02 19:19:04
233
原创 线程池自学笔记3--ExecutorService接口
一、ExecutorService介绍ExecutorService接口是java内置的线程池接口,通过学习接口中的方法,可以快速的掌握java内置线程池的基本使用常用方法: void shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。List<Runnable> shutdownNow() 停止所有正在执行的任务,暂停处理正在等待的任务,并返回等待执行的任务列表。<T> Future<T> submit(Callable.
2020-08-02 12:23:17
204
原创 线程池自学笔记2--线程池工作原理
我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池; 这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理;一、ThreadPoolExecutor构造方法public ThreadPoolExecutor(int corePoolSize, //核心线程数量 int maximumPoolSize,// 最大线程数 l
2020-08-02 11:26:52
226
原创 算法练习--队列的最大值__单调队列
题目:请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value需要返回 -1示例:输入:["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1],[2],[],[],[]]输出:[null,null,null,2,1,2...
2020-08-01 21:56:14
941
原创 算法练习--二叉搜索树的后序遍历序列__递归
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。示例:个人思路:根据二叉搜索树的后序遍历可以知道最后一个数是当前节点,而左树从开头开始并且比当前节点小的序列,右树是从左树之后到当前节点前一位。所以只要从头开始找到左右树的序列,在判断右树最后一个节点是不是当前节点的前一个,如果不是,那么无法构成二叉搜索树,同时二叉搜索树的左右子树也必须是二叉搜索树。代码:class Solu..
2020-08-01 21:43:32
191
原创 算法练习--矩阵中的最长递增路径__递归
题目:给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例:个人思路:通过递归,判断上一个值是否小于当前值,如果小于,那么长度加1,继续向下递归,否则返回当前长度。代码:class Solution { public int longestIncreasingPath(int[][] matrix) { int re=0; for(in
2020-08-01 21:15:46
286
原创 泰坦尼克号乘客数据的简单分析
前几天帮同学进行了有关泰坦尼克号乘客数据的分析,重新回忆了自己对python数据分析方面的知识。果然,学了不用,就忘记了,真是太难了(留下没知识的眼泪)。题目如下:能力有限,只对里面简单的部分进行了分析话不多说,代码如下:#导入处理数据包import pandas as pdimport matplotlib.pyplot as plt#导入数据train = pd.read_csv('train.csv')#打印列信息#print(train.info())#进行年
2020-07-27 18:36:31
1348
原创 浏览器输入url后经历的流程
一般会经历以下几个过程:1、首先,在浏览器地址栏中输入url2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求; 操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近的DNS查询缓存); 路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存; ISP缓存:若上述均失败,继续向ISP搜
2020-07-17 01:32:17
516
原创 线程池自学笔记1_线程池介绍
一、什么是线程池线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。二、为什么使用线程池使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量,且可以对所有线程进行统一的管理和控制,从而提高系统的运行效率,降低系统运行运行压力三、优势线程和任务分离,提升线程重用性; 控制线程并发数量,降低服务器压力,统一管理所有线程; 提升系统响应速度,假如创建线程用的时间为T1,执行任务用的时间为T2,销毁线程用的时间为T3,那么
2020-07-13 18:55:19
108
原创 10、软件安装
一、常见的软件安装方式以软件包的方式安装在线方式安装以源代码的方式安装二、以软件包的方式安装软件包是指软件提供方已经将软件程序编译好,并且将所有相关文件打包后所形成的一个安装文件。不同类型的安装包就需要使用不同的软件包管理工具完成管理工作。1、Linux业界主要有两种形式的软件包:rpm软件包: 由Redhat公司提出并使用在Redhat、Fedora、CentOS中,对应的软件包管理工具称为rpm包管理器。 deb软件包: 由Debian社区提出并使用在Debian和Ubuntu
2020-07-09 19:06:20
342
原创 synchronizedList自学笔记
因为ArrayList本身不是线程安全的,通过Collections.synchronizedList可以将其包装成一个线程安全的List。例如://这句话其实是产生一个新的对象,List list = Collections.synchronizedList(new ArrayList());1、方法源码//来看看这个函数public class Collections { //上面省略了很多源码.... public static <T>...
2020-07-08 19:12:07
525
原创 synchronizedMap自学笔记
创建了一个synchronizedMapstatic Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());底层其实是通过synchronized锁机制实现的按住ctrl点击进去发现创建了一个synchronizedMap的实例:实际上是在Collections类中维护了一个静态内部类SynchronizedMap,该内部类中维护了一个普通的map和一个对象.
2020-07-08 18:55:49
704
1
SpringBoot.docx
2020-02-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人