- 博客(27)
- 收藏
- 关注
原创 数据库常用锁
锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制,MySQL中的锁是在服务器层或者存储引擎层实现的,保证了数据访问的一致性与有效性。MySQL锁可以按模式分类为:乐观锁与悲观锁。按粒度分可以分为全局锁、表级锁、页级锁、行级锁。按属性可以分为:共享锁、排它锁。按状态分为:意向共享锁、意向排它锁。按算法分为:间隙锁、临键锁、记录锁。
2023-12-11 19:13:17 457
原创 CPU密集型和IO密集型对 CPU内核之间的关系
CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU 负载很高。,因为单核CPU在同一时间只能运行一个线程,线程之间还有切换的时间消耗,无论开几个模拟的多线程,该任务都不可能得到加速,因为CPU总的运算能力就只有这么多。例如:计算1+2+3+…每个线程都有CPU去运行,不会发生等待CPU时间片的情况,也没有切换的额外消耗。
2023-12-07 19:27:27 424
原创 ELK的日志解决方案
日志可以记录一个服务的所有行为的数据。ELK对服务行为数据进行分析,可以快速、准确查询和分析日志。在conf下创建elasticsearch.yml,修改权限777。修改linux的vm.max_map_count。2、创建logback-spring.xml。一、搭建ElasticSearch。这里修改为自己的ip地址即可。启动后查看控制台并访问端口。1、拉取Logstash。1、拉取kibana。
2023-12-06 19:37:05 995
原创 线程池,及7大参数,4大拒绝策略详解
序列参数名含义1核心线程数,是指线程池中长期存活的线程数。2最大线程数(必须大于核心线程数),当线程池的任务队列满了之后,可以创建的最大线程数。3空闲线程的存活时间,当线程池中没有任务时,会销毁一些线程,销毁的线程数=maximumPoolSize(最大线程数)-corePoolSize(核心线程数)。4Unit时间单位5workQueue用于存放任务的队列,用来存储线程池的所有待执行任务。6线程工厂、用来创建新线程7handler。
2023-12-05 20:19:43 849
原创 三种定时任务总结
因为在日常的业务中任务的执行时间经常会变动,即cron的表达式,所以用@Scheduled就有些麻烦了,因为需要去找到各个位置并修改,而quartz就很好的可以封装成一个可修改的调用接口,方便业务的多变性。可以这样理解Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,而TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。2、Quartz 集群的节点之间负载结果是随机的,谁抢到了数据库锁就由谁去执行任务,这就有可能出现旱的旱死,涝的涝死的情况,发挥不了机器的性能。
2023-12-04 20:41:25 930
原创 sychronized关键字
Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized、volatile、final等。而synchronized通过加锁的方式,使得其在需要原子性可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操作都能使用synchronized来完成。
2023-11-30 20:26:11 414
原创 过滤器,拦截器,aop之间差异
客户端发送HTTP请求,DispatcherServlet控制器拦截到请求,调用HandlerMapping 解析请求对应的Handler,HandlerAdapter根据Handler来调用真正Controller处理请求,并处理相应的业务逻辑,Controller返回一个模型视图ModelAndView,ViewResolver进行解析,返回一个视图对象,DispatcherServlet渲染数据对象Model,将得到视图对象返回给客户端,最终显示在相应的页面上。:根据请求的url查找Handler。
2023-11-29 21:04:13 935
原创 Spring是如何解决循环依赖的
如果一二级缓存都没有找到,说明这个Bean还没有实例化,Spring容器会去实例化这个Bean,而这个初始化的实例Bean被称为早期Bean,然后会把这个目标Bean放入到二级缓存,同时会加入一个标记表示它是否存在循环依赖,如果不存在就会把这个Bean放入到二级缓存,否则会标记这个Bean存在循环依赖,然后等待下一次轮训,等@Autowired注解赋值完成后,会将目标存入一级缓存。第二种是三者之间的依赖,A依赖B,B依赖C,C又依赖A,形成了一个循环依赖。第三种是自我依赖,A依赖A形成的循环依赖。
2023-11-27 19:53:00 1021 1
原创 http协议和websocket协议
http协议和websocket协议之间的区别?http协议有一个缺陷:单向请求,只能是由客户端向服务器发出请求,服务器返回查询结果,http协议做不到服务器主动向客户端推送信息。所以如果服务器有连续的状态变化,只能每隔一段时间发出询问,了解服务器有没有新的信息。websocket:解决上述那种低效率、浪费资源(http需要一直打开)的问题,websocket能够从服务器主动向客户端推送信息,客户端也能主动向服务器发送信息,属于服务器推送技术的一种。与HTTP不同,它以ws://或wss://开头。
2023-11-22 19:14:17 445
原创 ConcurrentHashMap和HashMap的区别
ConcurrentHashMap 和 HashMap 是 Java 中两个不同的 Map 实现,它们有一些关键的区别,特别是在多线程环境中。Hashmap的key和value都可以为null, 是非线程安全的,hashmap是在bucket中存储键值对,当put存入键值对时,会用hashcode()方法,返回的hashcode用于找到bucket位置,用于存储entry对象,当两个对象的hashcode相同时,代表他们的bucket位置相同,此时会发生“碰撞”。
2023-11-21 19:28:48 70 1
原创 OSI和TCP与udp的区别
七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。OSI参考模型也采用了分层结构技术,把一个网络系统分成若干层,每一层都去实现不同的功能,每一层的功能都以协议形式正规描述,协议定义了某层同远方一个对等层通信所使用的一套规则和约定。应用层:协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP,主要是为应用进程提供服务的。DNS的。
2023-11-20 21:23:47 88 1
原创 gitlab的搭建流程
GitLab是一个基于 Git 的版本控制工具,并在此基础上搭建起来的Web服务,旨在提供一个全面的工作流程来帮助管理代码、协作和部署。版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理。其中gitlab-ce是它的社区版,gitlab-ee是企业版,是收费的。管理方便:存储、管理以及浏览已上传的代码,可以对代码库进行版本控制、分支管理和合并请求等操作,集中式服务器更能保证安全性。
2023-11-18 19:38:14 469 1
原创 生产者消费者模型
生产者和消费者问题是线程模型中的经典问题,生产者和消费者在同一时间段内共用一个存储空间,生产者在其中添加产品,消费者从其中取走产品,当存储空间为空时,消费者阻塞,当存储空间满了时,生产者阻塞。基础实现、缓冲区满或空时都调用wait()方法等待,当生产者生产了一个产品时或消费者消费了一个产品之后会唤醒所有线程。中间的KFC相当于缓冲区,生产者生产产品放到其中,消费者从其中拿走并消费。2、如何保证消费者和生产者之间的同步和协作关系。1、如何保证容器中的数据状态一致。它的底层实现方式:数组,链表。
2023-10-30 20:42:12 47 1
原创 CAS(乐观锁)
CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。与其相反的synchronized,是悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。这种线程一旦得到锁,其他需要锁的线程就只能挂起。对共享资源多线程操作造成数据的不一致性·。所以线程需要保证三条性质。CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。
2023-10-24 20:09:48 76
原创 搭建nexus私服部署项目
username/password: nexus的登录用户名密码。url:是nexus的maven-public。id: 名字不能重复,和pom引入名称相同。4.配置maven-public。3.添加snapshot仓库。2.添加release仓库。pom中部署maven。能看到自定义仓库东西。
2023-10-23 19:39:34 71
原创 redis的五中常用类
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
2023-10-19 20:06:20 67 1
原创 Spring缓存注解
清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作,在每次调用被@CacheEvict注解的方法时,会触发删除它指定的缓存的动作。被@Cacheable注解的方法上表示改方法的返回结果是能够缓存的,会把该方法的返回结果放在缓存中,在以后使用。
2023-10-18 19:21:50 50 1
原创 SpringMVC的工作流程
SpringMVC是一个Spring内置的MVC框架。SpringMVC也是一个容器,使用IOC核心技术,管理界面层中的控制器对象。SpringMVC的底层就是servlet,以servlet为核心,接收请求、处理请求,显示处理结果给用户。在此之前这个功能是由Servlet来实现的,现在使用SpringMVC来代替Servlet行驶控制器的角色和功能。其核心Servlet是:DispatcherServlet。
2023-10-17 23:16:34 39
原创 mysql数据库引擎-InnoDB,MyISAM
数据库引擎是数据库系统中的核心组件之一,负责实现数据库的存储、索引、事务和并发控制等方面的功能。这些功能的实现依赖于各种算法、数据结构和技术,并通过数据备份和恢复来保证数据的可靠性和持久性。不同的数据库引擎有不同的特点,针对自己的项目选择适合的数据库引擎可以有效改善服务器端存储性能。
2023-10-16 19:34:21 59 1
原创 接口测试工具swagger2(knife4j)
是一组围绕 OpenAPI 规范构建的开源工具,可帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具包括:Swagger Editor – 基于浏览器的编辑器,您可以在其中编写 OpenAPI 规范。Swagger UI – 将 OpenAPI 规范呈现为交互式 API 文档。swagger2于17年停止维护,现在最新的版本为 Swagger3(Open Api3)。tips: 配置除enable,其它测试阶段可以省略。在HttpResp(用户封装返回对象的类)
2023-10-11 19:49:44 100
原创 springboot整合Dockerfile
(6)在software下新建文件夹project(mkdir project),将idea中打包好的jar包上传到此处,并开放指定端口。(1)在/user/local 下新建software/jdk文件夹(mkdir -p software/jdk)curl http://linux的ip地址:2375/info。(5)让/etc/profile文件修改后立即生效。2.修改文件(:set number 显示行数。编辑/etc/profile文件。(2)将jdk上传到此文件夹中。3.重启docker。
2023-10-10 19:50:27 71 1
原创 docker常用命令总结
docker run -it -v linux文件/夹位置 :容器的文件/夹位置 (卷挂载)--ip用于自定义容器ip,会强制分配192.168.1.10这个ip给新启动的容器。在宿主机存储mysql容器中的数据data,容器与linux能够数据(文件)同步。1.docker run 镜像名:版本 加载镜像,创建容器。镜像是容器执行的前提条件,以下列出查看、搜索、下载、删除。创建完容器之后,可以对容器进行启动、停止、重启或者删除。进入容器内部的各种操作,启动、关闭、重启、日志查询等。-i用于控制台交互。
2023-10-08 20:06:42 44
原创 js调用方式对比与回调函数。
函数可以作为参数使用,当一个函数作为参数时,这个函数可以被称为回调函数,如果看到一个函数作为参数了,那就是回调函数。回调函数可以将一类函数用一个回调函数实现,只需要输入你想要完成的功能即可。js有三种使用方式:行内js、内部js、外链js。这种方式比较麻烦,一般不推荐使用。
2023-07-05 20:31:29 51
原创 树表示数组,Map与双重for对照。
双重for循环,遍历list1中每个数据与list2对比,时间复杂度是O(2),将其中一个list转化为map之后,成为了并列for循环,遍历list后通过list.get(i)的key直接查询对应的value此时的时间复杂度为O(1)。HashMap底层是通过数组和链表的数据结构实现的,如果每次计算的hash值是同一个,会造成链表长度过长,如果每次计算的hash值都不一样,会导致HashMap的容量不断扩大,为了解决这些问题,使用红黑树维持树的平衡。1:为了保持左右平衡,有序数组中间的数就是树的根节点。
2023-07-04 20:42:18 64
原创 缓存的局部性原理
缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度比内存读写速度要快很多,这样会使CPU花费很长时间等待数据,或把数据写入内存。缓存是位于CPU与内存之间的临时存储器,它的容量比内存小得多,但是交换的速度却比内存要快得多。一个块区域包含多个数据对象,将该区域所有数据对象复制到缓存中,即一个内存位置被引用了,很快这个位置附近的位置也被引用了,就是有了空间局部性。循环累加int[15000] [15000]的二维数组,按照i,j的顺序访问,利用了缓存的空间局部性,提高了效率。
2023-07-03 19:45:44 135
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人