自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 nginx配置证书

引用证书(必须,放在conf/ssl目录下可以用相对路径,其他位置用自己定义的绝对路径)#自动跳转到HTTPS(可选,如果需要强制https可以添加该配置)3 配置完成后,重启nginx服务即可。#监听443端口(必须)#其他的配置信息···

2024-09-25 09:07:44 427

原创 Git任意文件读取漏洞修复

-将nginx['listen_port'] = 8000 改为 nginx['listen_port'] = 9999。--按照版本号依次升级(https://packages.gitlab.com/gitlab/gitlab-ce?--将listen *:8000;改为 listen *:9999;172.16.3.172 端口 9999 Git任意文件读取*1 漏洞。# 备注:如果是其他版本请更改版本号,我为centos7,固版本为el7。--结果:11.11.8。

2024-09-25 09:05:18 523

原创 linux使用keepalived做nginx负载和虚拟ip(vip)

script "/etc/keepalived/check_nginx.sh" ----脚本路径。virtual_router_id 151 --标识id,每个机器都不一样。state MASTER --主机标识,如果是从机就是BACKUP。priority 110 --优先级,主机大,从机小。172.16.16.103/24 --虚拟ip。interval 2 --每几秒刷新。

2024-09-25 09:02:17 566

原创 nginx升级-同时支持IPV4和IPV6

停止服务:备份:解压:安装:启动:./nginx验证:./nginx -v报错:解决:修改配置文件:修改监听端口如下:

2024-09-24 10:56:53 583

原创 微服务设计原则

每个微服务从开发、测试、构建、部署,都应当可以独立运行,微服务边界清晰,业务依赖最小化.1 单一职责原则:将业务完整、职责单一的功能单元拆分为独立微服务,耦合性强或存在紧密事务联系的相关功能尽量设计在同一微服务中。3 粒度适中原则:微服务拆分应保持适中的颗粒度,首次设计粒度宜粗不宜细,通常采用逐步拆分、持续演进的方式对微服务持续拆分。5 无状态原则:微服务应是无状态的,微服务本身不存储任何状态信息,业务完整、职责单一的应用功能单元应当拆分为独立微服务。7 具有重用性特点的公共功能应当拆分为独立微服务。

2024-09-24 10:53:55 361

原创 设计模式-策略模式

策略模式其实就是一种设计思路,它将每一个算法封装起来保证代码可读性和维护性,假设有一种场景需要多种if--else嵌套,如果你写了多个if---else的话, 代码看起来就特别特别的low。。。。。。

2024-09-24 10:53:13 367

原创 HashMap和HashTable

hashMap基于哈希表,底层结果由数组实现,添加到map里的元素以 key-value的形式存储在数组中,在数组中key-value已一个实体的形式存储, 也就是继承至map接口中的entry,下图是map源码enrty。

2024-09-24 10:47:57 1168

原创 阻塞双端队列BlockingDeque

如果你这么干的话,各种插入方法将会把新元素添加到双端队列的尾端,而移除方法将会把双端队列的首端的元素移除。如果生产者线程需要在队列的两端都可以插入数据,消费者线程需要在队列的两端都可以移除数据,这个时候也可以使用 BlockingDeque。超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不会超过给定值。特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。

2024-09-24 09:54:28 191

原创 Java并发工具包

BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景一个线程往里边放,另外一个线程从里边取的一个 BlockingQueue。一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里边插入新对象时发生阻塞。它会一直处于阻塞之中,直到负责消费的线程从队列中拿走一个对象。负责消费的线程将会一直从该阻塞队列中拿出对象。

2024-09-24 09:51:20 690

原创 ThreadLocal

ThreadLocal其实就是一个并发线程,假如在并发情况下使用同一个静态变量的情况下可以使用threadLocalthreadLocal可以单独为每一个线程创建一个只属于当前线程的变量,这样可以保证并发情况下不会同时操作到该变量,因为每一个线程使用的都是线程内单独的变量,当然,如果是共享变量的话,是不可以这么使用的,该情况只适用于一些数据库连接(template/redis/mongo等)啦,或者是一些不需要共享的变量,或者是一些具有独立属性(比如session)等场景。

2024-09-24 09:47:03 323

原创 Semaphore

此处有一个问题要注意, 就是释放信号量的方法release()方法, 因为release方法释放的信号量不一定是当前线程获取的信号量,也就意味着,如果发生线程中断的情况, 依旧会去执行release方法去释放信号量,这时会发生信号量溢出的情况,也就是没有拿到信号量的线程去释放了......可以看到,他们之间没有太大的差别,只是多个一个hasQueuedPredecessors方法, 这个方式是专为公平锁设计的方法,获取是否有线程排在当前线程前面的方法, 当然,如果保证公平性的话, 是会影响到并发性能的。

2024-09-24 09:43:29 469

原创 lock锁和synchronized

synchronized可以修饰代码块/静态方法/方法/类对象, 如果有一个线程获取锁, 那么其余线程必须等待释放,否则会一直等待下去,并且synchronized锁无法手动释放, 只有在线程主动释放(执行完被修饰的代码块或方法)或者发生异常时才会释放锁, synchronized一般只用于一些涉及到计算之类的少量代码块。

2024-09-24 09:39:37 359

原创 ForkJoinPool

只是forkjoinPool适用于一些可以拆分执行的需求, 他可以把一个任务拆分为多个任务, 由多个线程去分别执行拆分后的任务, 避免一个线程大量执行。forkJoinPool和executorService差不多, 都是线程执行任务。RecursiveTask:有返回值,小任务结束后,返回结果。RecursiveAction:没有返回值,只是执行任务。

2024-09-24 09:37:03 189

原创 ExecutorService

当你想要创建线程来执行任务的时候, 如果你new Thread()来创建的话,就太low了,第一 频繁的new Thread会大量消耗系统性能,第二 大量重复创建线程会导致线程太多导致系统OOM第三 相比ExecutorService来说 thread少了很多线程操作。

2024-09-24 09:34:32 1493

原创 CyclicBarrier

CyclicBarrier和CountDownLatch大致相同, 他们的不同点就是CyclicBarrier的计数器可以重置, 也就是说它可以重复使用,而且他们的概念也有些许不同。当有多个线程时, 他们可以相互等待,也就是说当全部线程都完成了,他们才会被释放,并且在释放后,可以重新使用CyclicBarrier来让另一组线程继续进入执行等待。CyclicBarrier也是通过计数器来判断线程是否释放的,与CountDownLatch不同的是, 它是在await()方法中执行减一操作。

2024-09-24 09:23:45 208

原创 CountDownLatch

那么我们可以假设为这个领导就是主线程,员工就是子线程,state就是员工人数,并且设置CountDownLatch的等待时间, 当每一个员工吃完饭后调用countDown()方法, 这是state减一, 当减到0时, 领导吃饭, 当然, 如果半小时后员工还没有吃完饭,也就是state大于0, 这时领导也会吃饭。假设一个使用场景, 有一个需求, 一个领导必须等所有员工吃饭后才可以吃饭,最多等待半小时, 如果半小时后员工还没有吃饭完,领导也可以吃。

2024-09-24 09:16:53 257

原创 CAS机制

看着没啥问题,对应一些修改数值之类确实也不会影响结果,但是如果是栈队列的话就有问题了, 现在有一个栈队列分别是A-B-C, 线程1拿到栈顶A要改为D,这时线程2拿到队列把A-B-C改成 A-C, 这时线程1去修改栈顶A改为B后栈变成了B-C。线程1获取到原值A, 线程2也获取到原值A, 这时线程2把A改成了B,然后线程3获取到了原值B,讲B改成了A,这时线程1再去修改值会发现依旧可以修改, 因为原值依旧是A,getAndSet方法,获取原值进行比较,如果相等,赋值, 同时可以返回旧的原值。

2024-09-24 09:03:19 204

原创 ConcurrentHashMap

一个HashEntry包含四个域, key, hash, value, next, 其中hash和key是被final修饰所以不可更改, value和next被volatile修饰,保证每次读到的都是最新值, 所以ConcurrentHashMap的读操作不需要加锁。(CAS有三个操作参数,内存位置,预期原值,新值, 也就是说,CAS会把预期原值放在内存中,当触发了CSA时,它会判断内存位置是否有值,如果有, 就会比较内存位置的值和预期原值是否 相等,如果相等就更新新值,如果不相等,就返回该内存位置的值)

2024-09-24 08:56:58 420

原创 redis问题记录

布隆过滤器就相当于一个二进制位数组,他通过hash算法将key计算为几个bit位,当然,多个key计算时会存在覆盖bit位的情况,也就是说如果有一个key本身是不存在的,但是刚好通过计算算到了其他key的bit位上, 这时布隆过滤器就认为这个key存在...这个问题避免不了,只能尽可能的给布隆过滤器设置合适的参数。缓存穿透是指当有查询操作时,先去查询缓存,缓存中不存在,去查询数据库,但是库里也不存在,就无法写入缓存,这时如果是大量的查询就会导致大量请求到数据库造成系统压力导致崩溃,这就是缓存穿透。

2024-09-23 16:18:52 329

原创 RDB和AOF

AOF就是记录redis的写记录(默认每秒钟写一次),如果redis挂了重启的时候会加载这些保存在磁盘的记录文件重新写入,缺点就是文件会比较大而且重新写入也会比RDB慢,也会有时间差写入失败的情况,而且写入磁盘的时候会分离出一个子线程来执行, 也要看磁盘的IO速度, 如果很慢的话会阻塞主线程。AOF如果在写入时发现磁盘满了或者是机器炸了之类的,也可以通过 redis-check-aof 修复,并且提供了重写机制, 就是当文件大小超过设定的值时, 会压缩写入命令, 假如是一百条记录会压缩为1条减少文件大小。

2024-09-23 16:17:27 268

原创 Nginx配置文件

从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。worker_processes 1:这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。

2024-09-23 16:15:30 843

原创 nginx简介

nginx是一个HTTP和反向代理的web服务器, 处理并发能力强, 占有内存少, 据研究可以支持50000个并发连接数。nginx可以用作正向代理和反向代理,并做动,静请求分离, 动态资源指的是代码块,动态页面。静态资源指的是一些图片,静态页面。

2024-09-23 15:59:39 627

原创 RabbitMQ

RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列。

2024-09-23 15:46:22 1366

原创 MQ中间件简介

为了减少程序之间的耦合度和减少依赖程序之间的响应时间避免。

2024-09-23 15:32:54 286

原创 用户权限与用户组

第一列例如 -rw-r--r--,拆分为4段(- rw- r-- r--)理解(3个为一组), 其中 -代表类型 rw-为拥有者权限, r--代表组内成员权限,r--代表其他人员权限。查看默认预设权限(默认预设权限指的是你在创建目录或者是文件的时候,目录和文件的默认权限减去预设权限,举个例子你要创建一个目录,目录的默认权限是777,减去预设权限后目录的权限就是755): umask。注意: 如果有一个目录其他人没有执行权限(也就是 x ),是无法cd到这个目录里的!第五列是大小,单位是字节(bytes)

2024-09-23 15:27:40 415

原创 Linux基础命令

显示当前目录路径: pwd (注意,这里有一个参数,就是 pwd -P,在linux中,会有连结档, 意思就是路径相同,加-P参数可以显示出正确完整路径, 意思就是显示出当前目录路径的,看图就明白了)加参数 -f 代表连续查看文件, 例如 tail -f , 代表连续查看文件内容,按ctrl+c结束查看, 一般用来查看实时日志用,例如tail -fn 100,代表查看该日志文件最后100行。解压文件到指令目录: tar -x -f 要解压的压缩文件 -C 目录位置。

2024-09-23 15:20:19 731

原创 java内存结构

------------------------------------------------------术语解答----------------------------------------------------------------------由于在编译过程中并不知道每个类的地址,因为可能这个类还没有加载,所以如果你在一个类中引用了另一个类,那么你完全无法知道他的内存地址,那怎么办,我们只能用他的类名作为符号引用,在类加载完后用这个符号引用去获取他的内存地址。

2024-09-23 15:00:25 807

原创 ES使用过程中遇到的问题

该实验是基于1000并发同时操作实验的, 如果你的同时并发没有很高,使用_version 重试机制还是可以满足大部分场景,只有一瞬间并发很高的时候,重试5次依旧没有更新到合适的_version版本时, 临时使用单个核心线程解决, 后边有机会在研究。在查询订单信息后,需要通过每个订单信息去查询该订单的商品信息,遇到的问题,如果你的查询条件参数太长(比如同时有10个订单编号去查询,会发生未命中的情况), 也是会请求失败的,es解析不到太长的参数集(使用Get查询)_version为1, 第二个线程拿到值为1,

2024-09-23 14:55:54 428

原创 ES--创建--TransportClient

创建ES连接(官网说es7之后不建议使用, 8之后就不再维护了, 不建议使用)java程序使用的连接方式是tcp连接,需要使用9300端口如果是在es可视化工具使用的是http连接, 使用9200端口。

2024-09-23 14:53:16 396

原创 ES--创建--JestClient

使用match查询时,Elasticsearch将对一个字段选择合适的分析器,所以可以确定,传给match查询的词条将被建立索引时相同的分析器处理。filterQueryBuilders.must(QueryBuilders.matchQuery("address", "程序员")).must(QueryBuilders.termQuery("male", "女"));词条查询是Elasticsearch中的一个简单查询。match:匹配的时候,会将查询的关键字进行分词,然后根据分词后的结果进行查询。

2024-09-23 14:48:50 1548

原创 五、索引策略

数据表可以理解为是一本字典,里边的数据就是字典中一页一页的字,索引就是字典的目录,可以通过索引(目录)快速找到你要查询的数据在哪(那一页)。

2024-09-23 14:37:36 864

原创 四、MYSQl调优

mysql的性能是什么,简单来说性能就是一条sql语句的响应时间。

2024-09-23 14:17:04 1280

原创 三、Mysql的存储引擎

InnonDB的数据存储在表空间中,表空间是由一系列的数据文件组成。采用MVCC来支持并发,并且实现了四个标准的隔离级别,默认是可重复读, 通过间隙锁策略防止幻读,间隙锁不仅仅锁定查询的行,还会对索引中的间隙进行锁定,防止幻行。InnonDB表基于聚簇索引建立, 聚簇索引对主键查询有很高的性能,但是他的二级索引(除了主键索引的其他索引)中必须包含主键列,所以如果主键索引很大的话,其他的索引也会很大。

2024-09-23 14:11:39 264

原创 二、Mysql事务(必会知识点)

Mysql事务相关概括

2022-07-02 17:48:11 315

原创 一、Mysql基础知识概念

Mysql基础知识概念

2022-07-02 15:16:47 344 1

空空如也

空空如也

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

TA关注的人

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