自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (1)
  • 收藏
  • 关注

原创 LVS、Keepalived和Nginx面试

LVS是一款基于Linux内核的负载均衡软件,可以将客户端的请求分发到多台服务器上处理,从而实现负载均衡。Keepalived是一款基于VRRP协议的高可用软件,可以保证当LVS集群中的一台服务器出现故障时,能够自动将请求转发到正常的服务器上。另外,LVS可以实现四层负载均衡和七层负载均衡,而Nginx只能实现七层负载均衡。Nginx支持多种负载均衡算法,如轮询、IP哈希、最小连接数等,同时Nginx还可以通过动态添加或删除服务器来实现自动负载均衡,从而提高网络的可扩展性和可靠性。

2024-04-26 23:54:07 154 1

原创 lvs+keepalived+nginx

将keepalived安装成linux系统服务 因为没有使用keepalived的默认安装路径 /usr/local 安装后需要修改一些工作。删除原有的keepalived.conf 新建 keepalived.conf 写内容。启动keepalived service keepalived start。cd /usr/local/nginx/html 更改index.html内容。停止keepalived service keepalived stop。配置虚拟ip相关文件内容。

2024-04-26 02:05:19 372 3

原创 如何保证缓存与数据库的数据一致性

推荐这种,更新完数据库后删除缓存的速度是非常快的,所以在这个间隔内插入其他事务概率会比较低。缓存更新成功后,数据库更新失败,则会造成数据不一致性,而且也有并发问题,不推荐。更新数据库成功了,但是在删除缓存的阶段没有成功,则之后读取的缓存都是错误的。并发更新数据库场景下,会将脏数据刷新到缓存,不推荐。改进方法:先删缓存,再更新数据库,再删缓存。先更新数据库,再更新缓存(有bug)先更新缓存,再更新数据库(有bug)先删除缓存,在更新数据库(有bug)先更新数据库,再删除缓存(有bug)

2023-09-17 21:22:02 440

原创 redis面试问题总结

(linux的io多路复用机制指的是一个线程处理多个io流,即select\epoll机制,内核一直监听套接字的请求,一旦有相关请求,就交给redis处理,从而实现redis线程处理多个io流的效果,为了在请求到达时通知redis线程,select\epoll提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数,相关事件被放到一个事件队列,redis单线程对该事件队列不断处理,避免一直轮询是否有请求发生造成cpu资源浪费,因为redis一直在处理事件队列,所以能及时响应请求)。

2023-09-17 16:39:58 80

原创 Redis底层结构全了解

redis的集合对象set的底层存储结构特别神奇,我估计一般人想象不到,底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。压缩列表,压缩列表(ziplist)是Redis为了节省内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。相对地,释放内存的次数也由两次变为一次。

2023-09-17 15:21:00 155

原创 深入理解redis——redis经典五种数据类型及底层实现

1.Redis的基础类型dictEntry和redisObject。2.程序员使用redis时的底层思维。3.String底层数据结构。4.Hash数据结构介绍。5.List数据结构介绍。7.ZSet数据结构介绍。6.Set数据结构介绍。

2023-09-17 01:06:51 86

原创 AbstractQueuedSynchronizer之AQS

该方法创建一个node节点,设置当前线程和节点模式(排他的)由于开始tail为null,故pred为null,直接执行enq(node).该方法中tryAcquire方法返回false 取反为true,之后执行acquireQueued方法中的addWaiter()方法。例如是第二个线程执行,在执行到tryAcquire方法后会获取资源,并将head指向第二个节点,将第一个节点设置为null。入参node,node前置节点为head时 该节点还会尝试获取锁执行tryAcquire方法,后面还执行。

2023-07-17 22:19:38 37

原创 聊聊ThreadLocal那些事儿

ThreadLocalMap使用ThreadLocal的弱引用来作为key,如果一个ThreadLocal没有外部强引用引用它,那么gc的时候,这个ThreadLocal势必会被回收,这样一来,ThreadLocalMap中就会出现key为null的entry, 就没有办法访问这些key为null的entry的value,如果当前线程再迟迟不结束的话(比如使用线程池),这些key为null的entry对象的value就会一直存在一条强引用连。不再被使用的对象或者变量占用内存不能被回收,就是内存泄露。

2023-07-06 22:05:24 152

原创 CAS原子类

CAS是靠硬件实现的从而在硬件层面提升效率,最底层还是交给硬件来保证原子性和可见性,实现方式是基于硬件平台的汇编指令,在intel的cpu中(x86机器上),使用的是汇编指令cmpxchg指令。执行cas操作的时候,将内存位置的值和预期原值比较,如果匹配,那么处理器会自动将该位置的值更新为新值,如果不匹配,处理器不做任何操作,多个 线程同时执行cas操作只能一个成功。核心思想就是:比较要 更新变量的值V和预期值E,相等才会将V的值设为新值N,如果不相等自旋再来。1 循环时间长 开销大。

2023-06-28 21:32:17 53

原创 LockSupport与线程中断

中断只是一种协商机制,java没有给中断增加任何语法,中断的过程完全需要我们自己实现,若是要中断一个线程,需要手动调用个该线程的interrupt方法,该方法也仅仅是将线程对象中的中断标识设成true;(2)如果线程处于被阻塞状态(例如调用sleep wait join等方法) 在别的线程中调用当前线程的对象的interrupt()方法,那么线程的中断标识位被清除true变为false,将立即退出被阻塞状态,并抛出一个InterruptedException异常。

2023-06-23 22:39:44 38

原创 java的“锁”事儿

2 使用多线程很重要的考量点是线程切换的开销,当 线程采用非公平锁时 当一个线程请求锁获取同步状态,然后释放同步状态, 所以刚释放锁的线程在此刻再次获取同步状态的概率就变的非常大,所以就减少线程开销。如果这个数据没有被更新,当前线程将自己的修改的数据成功写入,如果这个数据已经被其他线程更新,则根据不同的实现方式执行不同的操作,比如放弃修改、重试抢锁等。在目标锁对象的计数器不为零的情况 下,如果锁对象的持有线程是当前线程,那么java虚拟机将将计数器加1,否则需要等待,直到持有线程释放该锁。

2023-06-19 19:44:07 44

原创 CompletableFuture异步编排

传入一个自定义的线程池时 如果执行的第一个任务的时候调用thenRun方法执行第二个任务,则第二个任务和第一个任务使用的是同一个线程池。如果调用thenRunAsync执行第二个任务时,则第一个 任务使用的是自定义线程池,第二个 任务还是使用的默认的线程池。定义了操作异步任务执行的一些方法,比如获取异步任务的执行结果 取消任务的执行 判断任务是否被i取消 判断任务执行是否完成。一个阶段的执行可能被单个阶段的完成触发 也可能有多个阶段一起触发。异步执行任务的三个特点 多线程 有返回结果 异步任务。

2023-06-13 23:16:20 70

原创 java线程和进程

管程 Monitor 监视器,也就是我们平时所说的锁。其实它是一种同步机制,它的义务是保证同一个时间只有一个线程可一个访问被保护的数据和代码。守护线程 是一种比较特殊的线程 是为其他线程服务,在后台默默的完成一系列系统性的服务,不如垃圾收集线程。JVM中的同步是基于进入和退出监视器对象的来实现的,每个对象实例都会有一个Monitor对象。进程 简答的说在系统运行中的一个应用程序就是一个进程,每个进程有自己的内存空间和系统资源。用户线程 是一种系统的工作线程,他会完成这个程序需要的完成的业务操作。

2023-06-13 20:24:23 30

原创 ThreadPoolExecutor源码分析

第一点核心 通过execute方法 查看到线程池的整个执行流程 以及避免并发情况判断。第二点核心 为什么添加一个空任务的非核心线程到线程池。执行任务的流程 并做了中断的判断。添加工作线程 启动工作线程。如果从工作队列中获取任务。

2023-01-28 00:55:56 93

原创 java线程池

ThreadPoolExecutor 构造函数参数定义线程执行流程存放任务的工作队列有6种主要的实现,分别是 ArrayBlockingQueue、LinkedBlockingQueue、LinkedBlockingDeque、PriorityBlockingQueue、DelayQueue、SynchronousQueue。线程池中的线程已经用完了,无法继续为新任务服务,同时,等待队列也已经排满了,再也塞不下新任务了。这时候我们就需要拒绝策略机制合理地处理新进来的任务。

2023-01-19 16:05:51 154

原创 jmm和volatile

volatile的可见性volatile禁止重排写指令读指令凭什么我加个volatile关键字,系统底层就会加内存屏障?两者有什么关系,从字节码角度分析内存屏障是什么内存屏障能干什么内存屏障的四大指令三句话总结。

2023-01-18 15:32:44 117

原创 java内存模型之jmm

先看计算机硬件cpu的运行并不是直接操作内存的,而是先把内存中的数据读到缓存,而内存中的读和写操作的时候就会造成不一致的问题。JVM规范中试图定义一种java内存模型JMM,来屏蔽各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的内存访问效果。J并不真实的存在,,通过规范定义了程序中尤其是多线程时各个变量的读写访问方式,并决定一个线程对共享变量的写入何时以及如何变成对另一个线程可见,关键技术点都是围绕着展开的。jmm能干嘛呢?1 通过jmm来实现和之间的。

2023-01-17 23:56:11 60

原创 synchronized锁升级

java的线程是映射到操作系统原生线程之上的,如果要阻塞或者唤醒一个线程就需要操作系统介入,需要在用户态和内核态之间切换,这种切换会消耗大量的系统资源,因为用户态和内核态都有各自的内存空间,专用的寄存器,用户态切换内核态需要传递给许多变量、参数给内核,内核也要保护好用户态在切换时的一些寄存器、变量等,以便内核态调用结束后切换回用户态继续工作。偏向锁只有一个,争夺轻量级锁失败时,自旋尝试抢占锁,轻量级锁每次退出同步代码块都需要释放锁,而偏向锁是在竞争发生时才释放锁。说白了先自旋,不行才升级阻塞。

2023-01-16 00:10:10 365

原创 java对象内存中的布局和对象头

在hotspot虚拟机中,对象在堆内存中的布局分为三部分 :对象头(header)、实例数据(Instance Data)、对其填充(padding 保证8字节的倍数)在openJdk中对象头分为对象标记(markoop)和类元信息(klassoop),类元信息存储的是指向该对象类元数据klass的地址。对象标记(mark word): 对象标记中持有哈希码、GC标记、GC次数、同步锁标记、偏向锁持有者。在64位的系统中 mark word 占用 8字节 类型指针占用 8字节 一共16字节。

2023-01-12 23:32:33 127

原创 并发编程基础知识及底层原理-synchronized

理论篇1 一个对象里面如果有多个synchronized方法 某一时刻内 只要有一个线程去调用其中的一个synchronized方法了,其他线程都只能等待,换句话说 某一时刻内 只能有唯一的一个线程去访问这些synchronzied方法,锁的是当前对象this 被锁定后,其他线程都不能进入到当前对象的其他的syncronzied方法,从编写的类上理解 就是锁住了整个资源类2 同一个类中 普通方法和synchronized方法互不影响。

2023-01-12 21:51:01 79

原创 一文读懂Java内存模型(JMM)及volatile关键字

Java 内存模型(Java Memory Model 简称JMM)是一种抽象的概念,并不真实存在,它描述的一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问方式。

2022-12-27 16:57:22 173

原创 安装mysql5.7.28指令整理

安装mysql5.7.28指令整理:一、开始按顺序安装rpm包tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar//先看下服务器有没有这个包,以防止版本冲突rpm -qa | grep mariadb//如果有 就执行命令删除rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps//开始安装rpm -ivh mysql-community-common-5.7.28-1.el7.x8

2022-04-03 20:40:00 984 1

原创 hashMap1.7put方法源码剖析

hashMap1.7底层是Entry对象的列表和table数组Entry对象的属性final K key; V value; Entry<K,V> next; int hash;1 开始的时候table数组为空 没有初始化 开始初始化下列初始时化方法中capacity字段值为16默认的,toSize值 为16 通过roundUpToPowerOf2()方法计算出来的。roundUpToPowerOf2方法 计算出来的值都是...

2021-11-15 21:54:51 422

原创 ConcurrentHashMap1.7源码详细分析 主要是put方法

此分析是根据视频中讲解截图,并做记录可能有些混乱,在看时手边能有源码 效果更好分析前有一些基本的介绍1、ConcurrentHashMap是segment类型的数组,、2、segment类型中有HashEntry类型的数组、loadfactor加载因子、threshold扩容阈值HashEntry 有hash、key、value、HashEntry next属性3、一个segment对象元素其实很类似于一个HashMap,Segment 类型继承了ReentrantLock 所以可以跟

2021-11-14 00:22:13 734

原创 java内置锁-synchronized

2021-11-08 01:41:44 252

转载 IO模式和IO多路复用

1.1 用户空间和内核空间  现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内存的地址),再通过总线的传递,最后处理器拿到某个物理地址返回的字节。  对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对li..

2021-11-08 01:17:46 134 1

concurrenthashmap1.7.docx

concurrenthashmap1.7的源码分析

2021-11-13

空空如也

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

TA关注的人

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