自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 XXL-JOB 分布式任务调度平台

XXL-JOB 是由国人许雪里开发的一个 开源的。学习简单、轻量级、易扩展,开箱即用,现已开放源代码并接入200多家公司线上产品线。

2023-02-21 10:52:19 1387 1

原创 邮件头构造分析

目录转发 "Resent-":路径字段"Return-Path":“Reply-To":”Received":信息源字段"From/Resent-From":”Sender/Resent-Sender""Reply-To/Resent-Reply-To"“DKIM-Signature :”接受者字段“To/Resent-To”:“Cc/Resent-Cc”:“Bcc/Resent-Bcc”:参考字段“Message-ID/Resent-Message-ID” :“In-Reply-To”“Reference

2022-07-05 15:04:28 3704

原创 gRPC详解

gRPC是rpc框架中的一种,是rpc中的大哥是一个高性能,开源和通用的RPC框架,基于Protobuf序列化协议开发,且支持众多开发语言。面向服务端和协议端,基于http/2设计,带来诸如双向流,流控,头部压缩,单TCP连接上的多路复用请求等特性。这些特性使得其在移动设备上表现的更好,更省电和节省空间。在gPRC里客户端可以向调用本地对象一样直接调用另一台不同机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多RPC系统类似,gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的

2022-06-17 11:59:36 39937 2

原创 Suricata详解

Suricata引擎能够进行实时入侵检测(IDS)、内联入侵预防(IPS)、网络安全监控(NSM)和离线pcap处理。是一款开源、快速、高度稳定的网络入侵检测系统Suricata引擎能够实时入侵检测,内联入侵防御和网络安全监控。Suricata由几个模块组成,如捕捉、采集、解码、检测和输出。Suricata使用强大而广泛的规则和签名语言来检查网络流量,并提供强大的Lua脚本支持来检测复杂的威胁。使用标准的输入和输出格式(如YAML和JSON),使用现有的SIEMs、Splunk、Logstash/Elast

2022-06-15 14:19:56 14857

原创 suricata配置文件内容架构详解

1.vars(变量表)越具体,警报准确性和性能越好1.default-log-dir(默认日志的目录)2.Global stats configuration(全球数据的配置)stats(统计数据)interval(日志打印间隔时间)decoder-events(添加事件流作为统计)decoder-events-prefix(在统计中解码器事件前缀)stream-events(添加事件流作为统计)plugins(为每个插件共i相对想指定文件名)outputs (配置警报和其他日志的记录类型)-fast(基于

2022-06-10 11:42:33 2217 1

原创 ElasticSearch(ES)介绍,安装配置和基础使用

ElasticSearch直译过来就是智能搜索,实质上是一个分布式搜索引擎ES是一个近实时(NRT)的搜索引擎,一般从添加数据到能被搜索到只有很少的延迟(大约是1s),而查询数据是实时的。一般我们可以把ES配合logstash,kibana来做日志分析系统,或者是搜索方面的系统功能,比如在网上商城系统里实现搜索商品的功能也会用到ES。它是ELK(ELK实际上是三个工具的集合,Elasticsearch + Logstash + Kibana,这三个工具组合形成了一套实用、易用的监控架构,很多公司利用它来搭建

2022-06-09 18:27:58 835

原创 理解IPS和IDS

Intrusion Detection System依照一定的安全策略,对网络,系统的运行情况进行监视,尽可能的发现各种攻击企图,攻击行为或者攻击结果,以保证网络资源的机密性和可用性假如防火墙是门锁,IDS就是监视系统。一旦小偷进来了,或者内部成员有越界行为,只有实时监视系统才能发现情况IDS是一个旁路监听设备,没有也不需要跨接在任何链路上,无需网络流量流经便可以工作,因此,对IDS部署的唯一要求是:IDS应当挂接在所有所关注的流量都必须流经的链路上。在这里,“所关注流量”指的是来自高危网络区域的访问流量和

2022-06-09 10:32:59 1572 1

原创 protobuf 基本介绍安装和使用

Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。protobuf功能是把某种数据结构的信息以某种格式保存起来。它主要用于文件存储以及传输协议格式等场合。(什么是序列化,反序列化:Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。将程序中的对象,放入文件中保存就是序列化,将文件中的字节码重新转成对象就是反序列化。)类似的还有 XML、Json、Java

2022-06-07 10:37:27 2672

原创 HTTPS加密通信过程原理

1.什么是HTTPS?HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。 HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。2.什么是SSL和TLS?SSL(Secure Sockets Layer)协议既安全套接字层协议TLS(T

2022-05-10 17:03:08 452

原创 Hashmap中的扩容操作reisze()方法

一.何时会发生resize()扩容1.初始化HashMap的默认扩容一个 cap为16 ,threshold(阈值)为12的Node<K, V>[] newTab2.HashMap中元素数量达到阈值,每次扩容的容量都是之前容量的2倍。。二.resize()扩容的大致流程第一步: 确定新数组的 容量 和阈值(极限值/临界值)第二步:将旧数组内容 复制到 新数组 当中(扩容的本质是 新数组替代旧数组)注意:在对链表进行拆分的时候,会分为两个链表,因为数组扩容后长度是原来的二.

2022-05-07 15:16:27 741

原创 HashMap中put方法(白话加源码分析)

一.首先不看代码用白话分析一下流程我们在使用put方法的时候会传进key和value参数在我们将这两个参数传入后,第一步,我们的put方法会去判断这个hashmap是否为null 或者长度是否为0,如果是则对hashmap数组进行resize()扩容,第二步,put方法会根据这个key计算hash码来得到数组的位置,(这里需要解释一下,我们的hashmap默认是由一个数组加链表组成的)得到位置后当然是继续判断这个数组下标的值是否为null,为null 自然是直接插入我们的value值,如

2022-05-06 18:36:55 9145 3

原创 Redis 缓存穿透,击穿,雪崩及解决方法

目录1.缓存穿透1)什么是缓存穿透?2)造成缓存穿透的基本原因:3)解决办法2.缓存击穿1)什么是缓存击穿2)发生场景3)解决方案3.缓存雪崩1)什么是缓存雪崩2)发生场景3)解决方法1.缓存穿透1)什么是缓存穿透?缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库。缓存穿透问题可能会使.

2022-05-03 17:50:49 463

原创 Redis持久化机制详解(RDB和AOF)

1.Redis为什么需要持久化?很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后恢复数据),或者是为了防止系统故障而将数据备份到一个远程位置。2.Redis持久化的方法有哪些?Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持两种不同的持久化操作。Redis 的一种持久化方式叫快照(snapshotting,RDB),另一种方式是只追加文件(append-only file, AOF)。

2022-05-03 16:51:59 1142

原创 Redis五大常用数据类型以及使用场景

Redis 数据存储格式redis自身是一个Map类型的存储方式,其中所有的数据都是采用key:value的形式存储 我们讨论的数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串1.string1).介绍 :string类型是二进制安全的。虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串表示,而是自己构建了一种 简单动态字符串 。(simple dynamic string,SDS)。相比于 C 的原生字符串,Redis ..

2022-05-02 16:08:07 5868

原创 Mysql基本架构和存储引擎

目录1.什么是MySQL?2.Mysql的基本架构3存储引擎4.字符集及校对规则5.总结(语句执行流程)1.什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是33

2022-05-01 15:49:38 414

原创 数据库索引

目录1.为什么要使用索引?2.索引这么多优点,为什么不对表中的每一个列创建一个索引呢?3.使用索引的注意事项?4.Mysql索引主要使用的两种数据结构哈希索引BTree索引MyISAM和InnoDB实现BTree索引方式的区别5.选择索引和编写利用这些索引的查询的3个原则6.为什么索引能提高查询速度7.覆盖索引介绍8.聚集和非聚集索引9.最左前缀原则10.注意避免冗余索引11.Mysql如何为表字段添加索引???1.为什么要使用索引?

2022-05-01 14:24:40 414

原创 数据库事务与事务回滚

目录1.什么是事务?2.事务的特性(ACID)3.并发事务带来的问题4.事务隔离级别5.什么是回滚?6.什么是事务回滚?7.如何进行事务回滚1.什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对

2022-05-01 10:36:39 5783

原创 伪异步I/O编程

采用线程池和任务队列可以实现伪异步I/O编程实现原理:当客户端接入时,将客户端的Socket封装成一个Task( 该任务实现java.lang.Runable线程任务接口)交给后端的线程池中进行处理。JDK 的线程池维护一个消息队列和 N 个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。代码实例:用伪异步io的方法实现通信1)首先构建服务器端//目标:实现伪异步性能架

2022-04-25 18:08:55 291

原创 Java BIO,NIO,AIO 概述

在学习I/O之前我们先要了解两组概念同步和异步当你同步执行某项任务时,你需要等待其完成才能继续执行其他任务。当你异步执行某些操作时,你可以在完成另一个任务之前继续进行。 同步 :两个同步任务相互依赖,并且一个任务必须以依赖于另一任务的某种方式执行。 比如在A->B事件模型中,你需要先完成 A 才能执行B。 再换句话说,同步调用中被调用者未处理完请求之前,调用不返回,调用者会一直等待结果的返回。 异步: 两个异步的任务是完全独立的,一方的执行不需要等待另外一方的执行。再换句话说,

2022-04-25 14:12:23 281

原创 Java设计模式之适配器模式详解

1.什么是适配器模式?将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作2.适配器模式中的角色分析 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。 需要适配的类(Adaptee):需要适配的类或适配者类。 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 3.实现方式1).类适配器(采用继承实现)2).对象适配器(采用对象组合方

2022-04-24 17:24:46 8377 1

原创 Java设计模式之工厂模式详解

1.什么是工厂模式?工厂模式的主要解决的问题是,将原来分布在各个地方的对象创建过程单独抽离出来,交给工厂类负责创建。其他地方想要使用对象直接找工厂(即调用工厂的方法)获取对象。2.作用:实现类创建者和调用者的分离3.核心本质: 实例化对象不使用new,用工厂方法代替 将选择实现类,创建对象统一管理和控制。从而将调用者和我们的实现类解耦 4.详细分类:1.简单工厂模式/静态工厂模式 用来生产同一等级结构中的任意产品 2.工厂方法模式 用来生产同一等..

2022-04-24 15:27:22 5765

原创 Java设计模式之单例模式详解

目录1.什么是单例模式?2.单例模式的要素3.恶汉式单例4.懒汉式单例5.如何防止指令重排?6.如何破坏懒汉式单例与饿汉式单例?7.枚举实现单例模式8.全文总结1.什么是单例模式?单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。2.单例模式的要素1、单例类只能有一个实例。2、单例类必须

2022-04-23 16:08:48 599

原创 Bean的自动装配

自动装配是spring满足bean依赖的一种方式 spring会在上下文中自动寻找,并自动给bean装配属性 在spring中有三种自动装配的属性 在xml中显示配置 在Java中显示配置 隐式的自动装配bean(重要) 1.byName自动装配会在容器上下文中查找,和自己对象set方法后面的值对应的beanid!<bean id="people" class="java.spring5.people" autowir..

2022-04-18 11:56:39 87

原创 IOC理论推导

1.IOC的原型在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码!如果程序代码量十分大,修改一次成本代价十分昂贵。public class UserServiceImpl implements UserService { private UserDao userDao; //利用set进行动态实现值的注入! public void setUserDao(UserDao userDao){ this.userDao ...

2022-04-15 15:26:46 513

原创 八大排序之希尔排序

基本思路:希尔排序实际上是,定义一组增量在增量内进行插入排序,并逐步缩小这个增量,(因此它又称缩小增量排序)时间复杂度:O(n^(1.3-2))尔排序没有时间复杂度为O(n(logn))的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择空间复杂度:常数阶O(1)图解:假设存在一个长度为8的无序数组 ,第一步在第一次定义增量时,增量为四组,在每一组内部使用插入排序来交换位置第二步第二次缩小增量,增量缩减为2组,在每...

2022-04-11 16:12:08 721

原创 leetcode力扣:567. 字符串的排列 滑动窗口解法

基本思路:这道题是典型的滑动窗口问题定义两个数组arr1,arr2。因为题目两个字符串都是由英文字母组成,所以长度都是26。我们要用这两个数组arr1储存s1字符串中各个字符的个数,arr2储存当前遍历子串中各个字符的个数把s1的长度n当作滑动窗口的长度,遍历s2中每个长度为n的字串。得到的arr2判断与arr1是否相等代码实现:class Solution { public boolean checkInclusion(String s1, String s2) ..

2022-04-10 13:01:47 574

原创 leetcode力扣:3. 无重复字符的最长子串 滑动窗口解法

基本思路:这道题用滑动窗口可解什么是滑动窗口?字符串abcabcbb为例我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:以 (a)bcabcbb开始的最长字符串为 (abc)abcbb;以a(b)cabcbb开始的最长字符串为 a(bca)bcbb;以 ab(c)abcbb开始的最长字符串为 ab(cab)cbb;以abc(a)bcbb 开始的最长字符串为 abc(abc)bb;以 abca(b)cbb开始的最长字符串为abca(bc)bb;以 abcab(...

2022-04-08 22:20:10 239

原创 Java contains用法示例

contains方法:用于判断list集合是否包含某个元素containsKey方法:用于判断Map键中是否包含某个键containsValue方法:用于判断map中是否包含某个value值代码示例:package ceshi;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;class index { public static

2022-04-08 16:32:42 610

原创 多线程 守护线程

1.线程分为用户线程和守护线程2.虚拟机必须保证用户线程执行完毕3.虚拟机不用等待守护线程执行完毕例如:后台记录操作日志,监控内存,垃圾回收等等4.代码举例:package Thread;//测试守护线程、//上帝守护你public class TestDemo { public static void main(String[] args) { God god = new God(); You you = new You();

2022-04-08 15:56:22 1095

原创 线程安全的三大不安全案例及解决方法

1.没有排队导致线程不安全示例:不安全买票原因:每个线程都有自己的工作内存,内存控制不当会造成数据不一致(最后一张票被多个线程同时载入内存)package syn;public class UnsafeBuyTicket { public static void main(String[] args) { BuyTickey station = new BuyTickey(); new Thread(station,"我").start();

2022-04-08 15:22:57 419

原创 Java HashMap getOrDefault() 方法

1.getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。2.getOrDefault() 方法的语法为 :hashmap.getOrDefault(Object key, V defaultValue)注:hashmap 是 HashMap 类的一个对象参数说明:key - 键 defaultValue - 当指定的key并不存在映射关系中,则返回的该默认值3.示例:package ceshi;import

2022-04-08 10:25:08 1056

原创 线程同步和同步方法,同步块

1.什么是线程同步?多线程操作同一个资源(例如:抢票,两个银行同时取钱)处理多线程问题时,多线程访问同一个对象(并发),并且某些线程还想修改这个对象。这个时候,我们就需要线程同步。线程同步其实就是一种等待机制,多个需要同时访问此对象进入这个对象的等待池形成队列,等待前面的线程使用完毕下一个线程再进行使用2.线程同步形成条件队列和锁(保证线程同步的安全性)3.什么是锁机制?由于同一进程的多个线程共享同一块储存空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访

2022-04-07 15:59:24 205

原创 多线程中的死锁

1.什么是死锁?多线程互相抱着对方需要的资源,然后形成僵持详细解释:多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止的情形,某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题2.产生死锁的四个必要条件1.互斥条件:一个资源每次只能被一个进程使用2.请求与保持条件:一个进程因请求资源而堵塞时,对已经获得的资源保持不放3.不剥夺条件:进程已获得的资源,再未使用完成前,不能强行剥夺。4.

2022-04-07 14:09:05 133

原创 leetcode力扣:73. 矩阵置零

基本思路:非常简单的一道题,需要注意的点就是,当你找到一个0的时候不能立刻在循环里将其行和列的数字置0,因为会干扰外层的循环,因此我们需要定义两个数组,将为的位置先存下里来,当整个二维数组都遍历完成后,再进行置0操作。代码实现:class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; ...

2022-04-07 13:11:19 309

原创 leetcode力扣:36. 有效的数独

基本思路:判断数独有效要满足三个条件:1.每行数字1-9没有重复的2.每列数字1-9没有重复的3.每个九宫格数字1-9没有重复的我的思路就是,用ascall码自建哈希表,记录出现的次数,如果每行,每列或者每个九宫格同一个数字出现的次数大于一次就输出false代码实现:class Solution { public boolean isValidSudoku(char[][] board) { //记录每行1到9每个数字出现的个数 int ...

2022-04-07 12:26:32 404

原创 Lambda表达式

1.为什么要用lambda表达式?1.避免匿名内部类过多2.可以让你的代码看上去更加简洁3.去掉了没有意义的代码只留下了核心逻辑2.理解函数式接口(Function Interface)是学习lambda的关键所在lambda表达式前提是为函数式接口函数式接口定义:1.任何接口,如果只包含唯一一个抽象方法,那么他就是一个函数式接口2.对于函数式接口,我们可以通过lambda表达式来创建该接口的对象3.lambda表达式的简化:简化时,只有在一行表达式的情况下才

2022-04-05 15:13:13 77

原创 java中的append()方法

1.Stringbuffer 有append()方法2.Stringbuffer其实是动态字符串数组 (StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象)3.append()是往动态字符串数组添加,相当于“xxxx”+“yyyy”相当那个‘+’号4.跟String不同的是Stringbuffer是放一起的String1+String2 和Stringbuffer1.append("yyyy")虽然打印效果一样,但在内存中表示却不一...

2022-04-05 10:26:19 13150

原创 剑指 Offer 09. 用两个栈实现队列

题目解析:用两个栈实现一个队列,简而言之就是要用两个栈实现先入先出的存取方法。示例中的CQueue就是创建队列的意思appenTail就是添加结点的意思执行上述两个操作的时候输出空就可以执行deleteHead时,如果没有可以取的就输出-1,如果有可以取的就输出取出的那个数字基本思路:定义两个栈,一个当作输入栈用于appendTail操作,一个当作输出栈用于deleteHead操作.当进行deleteHead操作时,先判断输出栈是否为空,若输出栈为空,则将输入栈的所有数据..

2022-04-04 13:00:30 310

原创 leetcode力扣:19. 删除链表的倒数第 N 个结点

第一次中等题完全靠自己写出击败100%的解法!!!基本思路:1.题目要求删除倒数第n个结点,那么我们先要知道链表的总长度2.然后找出要删除结点在链表中的具体位置3.在将删除的结点的左右结点个定义一个指针4.然后直接left = right.next ,将右指针后的那段链表连接到left后面(这样就相当于跳过了那个想要删除的结点)代码实现:/** * Definition for singly-linked list. * public class ListNode...

2022-04-02 14:06:24 327

原创 实现Runnable接口实现多线程(龟兔赛跑代码示例)

1.怎样实现Runnable接口实现多线程:1.创建一个类声明是实现了Runable的接口2.实现run()方法,编辑执行体3.创建线程对象,调用start()方法启动线程2.继承Thread与实现Runnable接口的区别:继承Thread启动线程:子类对象.start()实现Runnable启动线程:传入目标对象+Thread对象.start()3.比起Thread更推荐使用Runnable的原因:避免了单继承的局限性(Thread只能单继承),灵活方便,方便同一个对象,

2022-04-02 11:00:18 1621

空空如也

空空如也

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

TA关注的人

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