- 博客(40)
- 收藏
- 关注
原创 JMM(Java内存模型)
JMM即Java内存模型(Java memory model),在JSR133里指出了JMM是用来定义一个一致的、跨平台的内存模型,是缓存一致性协议,用来定义数据读写的规则。
2024-02-08 23:45:21
934
原创 synchronized关键字的底层原理
重量级锁就是一个悲观锁了,但是其实不是最坏的锁,因为升级到重量级锁,是因为线程占用锁的时间长(自旋获取失败),锁竞争激烈的场景,在这种情况下,让线程进入阻塞状态,进入阻塞队列,能减少cpu消耗。锁的等级从无锁,偏向锁,轻量级锁,重量级锁逐步升级,并且是单向的,不会出现锁的降级。上面已经讲过,当线程没有获得monitor对象的所有权时,就会进入阻塞,当持有锁的线程释放了锁,当前线程才可以再去竞争锁,但是如果按照这样的规则,就会浪费大量的性能在阻塞和唤醒的切换上,特别是线程占用锁的时间很短的话。
2024-02-08 23:41:57
915
原创 HashMap的扩容机制
HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据因为在查询上使用散列码(通过键生成一个数字作为数组下标,这个数字就是hash code)所以在查询上的访问速度比较快,HashMap最多允许一对键值对的Key为Null,允许多对键值对的value为Null。它是非线程安全的。在排序上面是无序的。
2024-02-03 16:05:03
2461
原创 HashMap中的put方法
1、put操作可以覆盖原来的value,前提条件就是hash值相同且是同一个key,或者hash值相同且两个key equals。2、插入链表后,元素大于8个,将链表转成红黑树3、元素是放在链表的尾端4、插入后,size += 1,如果size > threshold,执行扩容,5、扩容时,对链表中的键值对重新计算桶索引,方法很巧妙。原来的链表会分裂为两个新链表,一个存放索引值不变的键值对,另一个存放索引值变化的键值对;并且键值对在新链表中的相对顺序没有变;
2024-02-03 15:53:38
2472
原创 【Mybatis的一二级缓存】
缓存其实就是存储在内存中的临时数据,这里的数据量会比较小,一般来说,服务器的内存也是有限的,不可能将所有的数据都放到服务器的内存里面,所以, 只会把关键数据放到缓存中,缓存因为速度快,使用方便而出名!
2024-01-27 21:28:33
1967
原创 Mybatis懒加载
通过上面的示例可以发现深度加载的方式最为懒,通过这种方式可以让mybatis在执行查询的时候减少sql的查询从而提高程序的执行效率,但是并不是所有场景下使用懒加载都能提高效率,有些场景比如在查询一对多时,就需要将一方和多方都查询出来,这样的话开启懒加载反而有可能会拖慢程序的执行效率。
2024-01-27 21:07:41
373
原创 redis是单线程的为什么还这么快?
注意这里我们强调的单线程,指的是网络IO和键值对读写 (文件事件分派器) 使用一个线程来处理,即一个线程处理所有网络请求,但Redis的其他功能,比如持久化、异步删除、集群数据同步等等,实际是由额外的线程执行的。那为什么使用单线程呢?在redis的多线程模式下,接收,发送和解析命令可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点,但是命令的执行,也就是内存操作,依然是单线程运行的。如图,一次redis请求,要建立连接,然后获取操作的命令,然后执行命令,最后将响应的结果写到socket上。
2024-01-19 20:15:48
902
原创 spring bean的生命周期
本文将从以下两方面去帮助理解 Bean 的生命周期:1、生命周期的概要流程:对 Bean 的生命周期进行概括,并且结合代码来理解;2、扩展点的作用:详细介绍 Bean 生命周期中所涉及到的扩展点的作用。最后总结下如何记忆 Spring Bean 的生命周期:首先是实例化、属性赋值、初始化、销毁这 4 个大阶段;再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;
2024-01-19 20:05:23
963
原创 数据库中常用的锁
行级锁通常在高并发读写的场景下使用,而表级锁在一些特殊的操作场景下使用。排他锁是一种最基本的锁,确保在事务中对资源的独占访问。当一个事务持有排他锁时,其他事务不能访问相同的资源,直到锁被释放。意向锁是一种用于在事务中指示其对资源的意向的锁。共享锁是一种允许多个事务同时读取资源的锁,但不允许写入。多个事务可以同时持有共享锁,但如果一个事务持有了共享锁,其他事务就不能获得排他锁。行级锁是针对表中的一行数据的锁。写锁用于阻止其他事务读取或写入资源,确保持有写锁的事务是唯一能够对资源进行写操作的事务。
2023-12-11 20:50:18
84
1
原创 IO密集型与CPU密集型的区别
一个计算为主的应用程序(CPU密集型程序),多线程或多进程跑的时候,可以充分利用起所有的 CPU 核心数,比如说16核的CPU ,开16个线程的时候,可以同时跑16个线程的运算任务,此时是最大效率。但是如果线程数/进程数远远超出 CPU 核心数量,反而会使得任务效率下降,因为频繁的切换线程或进程也是要消耗时间的。因此对于 CPU 密集型的任务来说,线程数/进程数等于 CPU 数是最好的了。
2023-12-07 19:52:32
101
原创 ELK的使用
安装Elasticsearch:安装Logstash:安装Kibana:配置Logstash收集日志:创建索引模板:在Kibana中创建可视化和仪表板:监控和调优:集成其他工具:安全设置:
2023-12-06 20:24:24
31
原创 【无标题】
解决方式:用 RabbitMQ 提供的 ack 机制,简单来说,就是你必须关闭 RabbitMQ 的自动 ack,可以通过一个 api 来调用就行,然后每次你自己代码里确保处理完的时候,再在程序里 ack 一把。比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面加一个全局唯一的 id,类似订单 id 之类的东西,然后你这里消费到了之后,先根据这个 id 去比如 Redis 里查一下,之前消费过吗?2,MQ收到消息,暂存内存中,还没消费,自己挂掉,数据会都丢失。
2023-12-02 20:44:01
16
原创 RPC和http
通常情况下,RPC 会使用二进制协议进行数据传输,而不是像 HTTP 那样使用文本协议。可以使用不同的传输协议,如 gRPC 使用的是 Protocol Buffers,Thrift 使用的是 Thrift Protocol。HTTP 通常使用 JSON 或 XML 这样的文本形式来传输数据,这使得数据对人类更加可读,但相对于二进制格式来说,可能更加占用带宽。它是一种无状态协议,每个请求和响应都是独立的,服务器不会保留任何有关客户端状态的信息。HTTP/1.1 和 HTTP/2 是两个常见的版本。
2023-11-26 22:40:56
28
原创 ConcurrentHashMap和HashMap的区别
HashMap: HashMap 是非线程安全的。如果多个线程同时操作(读写)一个 HashMap 实例,而其中至少有一个线程在进行写操作,那么必须通过外部手段(例如显式地使用同步机制,如 Collections.synchronizedMap)来保证线程安全性。ConcurrentHashMap: ConcurrentHashMap 是设计用来支持高并发的,因此它是线程安全的。它通过分段锁(Segment)的方式实现高效的并发访问。不同的段可以被不同的线程同时访问,从而提高并发性能。
2023-11-21 21:03:46
128
原创 声明式事务的四个标准隔离级别
一个事务读取了另一个事务未提交的,尚处于临时、未稳定状态的数据,若此数据最终回滚了,那么读取的数据就是无效的,这个操作就被称为脏读。
2023-11-16 14:17:27
54
1
原创 MQ中的生产者与消费者模型
MQ的全程是Message Queue,即消息队列。可以使不同模块之间不需要直接连接就能数据互通,可以理解为一个消息中间件。
2023-10-30 20:44:12
128
1
原创 数据库分表分库原则
通俗来说就是专表专库,用户表放到用户库中,订单表放到订单库中优点是可以在业务层面上解耦合、同时也方便对数据库进行扩展缺点是部分表无法进行join操作,只能通过接口聚合的方式解决(join操作即是连接,包括内连接、左连接和右连接)目前来说,解决方法是在service层多次查询,比如说查权限,先通过角色表查到权限id,再去权限表查一遍权限的内容。
2023-10-28 20:33:57
35
1
原创 ThreadLocal
ThreadLocal叫做线程变量,意思是在ThreadLocal中填充的变量是属于当前线程的,该变量对于其他线程而言是隔离的,也就是说该变量是当前线程独有的变量同一个ThreadLocal所包含的对象,在不同的Thread中有不同的副本:1、对某个Thread来说,其内部的副本只能当前thread使用2、其他的thread不能访问该thread副本,因而就不存在线程间的共享问题。
2023-10-25 21:34:57
33
1
原创 CAS的一些性质
CAS是一种计算机结构的指令集架构,它支持在多线程环境下实现原子性的操作。CAS包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。若在指定内存位置的值和预期原值一样,那么系统就会自动将该位置的值更新为新值,否则将会放弃该次更改(1)ABA问题如果一个线程t1正修改共享变量的值A,但还没修改,此时另一个线程t2获取到CPU时间片,将共享变量的值A修改为B,然后又修改为A,此时线程t1检查发现共享变量的值没有发生变化,但是实际上却变化了。
2023-10-24 21:00:36
96
原创 springboot整合redis
配置好之后在这里设定一下自启动,让这个配置在spring启动过程就给他加载好然后就可以使用了这里可以看到直接传入car参数即可其中1是用自带的,然后car.toString传进去的,2是用自定义的方法传的,可以看到已经变成了json的特有的{}类型。
2023-10-22 15:29:17
30
1
原创 RBAC(Role-Based Access Control)
基于角色的访问控制通过用户关联角色,角色关联权限,来间接的给用户赋予权限为什么要增加这一层关系呢?不可以直接给用户权限吗?合理的解释是,当数据库中有大量的用户时,一方面是一个一个用户赋予权限很麻烦并且容易出错,另一方面是当权限需要整体修改时,那么采用RBAC模型的话修改权限只需要修改权限表即可同时,当用户需要改变权限是,修改他的角色信息即可,很方便。
2023-10-21 16:51:19
113
1
原创 docker上redis的安装与基础使用
首先先查询这里可以看到查到了很多版本接着进行拉取,我们选择stars最多的那个,通常就是官方版本拉取成功然后就可以在镜像里面查看了然后我们就创建一个含redis的集装箱,使用run语句,这里就要用个简单的语句即可创建成功然后我们进入redis接着再输入ping。如果返回pong那么就说明redis可以成功运行了ping然后我们可以使用redis自带的压力测试,第一个测试是不带管子的,第二个测试带管子,可以看到效率提高了四十倍有余。
2023-10-19 21:15:05
60
1
原创 Spring缓存
用户在前端发送http请求,controller层拿到请求发送到service层,service发送请求到dao层,dao通过orm从数据库中取回数据,并将其发送给service进行业务处理,处理加工后的数据会发送到controller层最终返还给客户而当有了缓存后,客户的请求就只会在第一次从数据库中取值,并且顺手放在缓存中,之后同样的get请求就会直接从缓存中获取了,这样就会大大提高系统的效率,因为其实每次从数据库查询数据是很耗费时间的。
2023-10-18 21:26:40
36
原创 springMVC的工作流程
1、用户发送请求(Http请求)给Controller控制器 ,也就是DispatcherServlet,DispatcherServlet是整个spring MVC的核心,它的作用是接收所有的客户端请求。3、找到了用于匹配的控制器后,DispatcherServlet会将请求委托给该控制器,然后控制器会执行相应的操作,比如说添加货品到购物车等等。4、当控制器处理完请求后,会生成一个model对象,其中包含了需要在视图中呈现的数据,可能包括添加进购物车商品的价格、图片等等。7、用户就可以浏览了。
2023-10-17 20:15:38
32
原创 mysql数据库引擎-Inodb,MyISAM
数据库引擎是用于储存、处理和保护数据的核心服务。它可以控制访问权限并快速处理事务从,从而满足大多数的企业内需要处理大量数据的应用程序的要求。
2023-10-16 20:14:54
30
1
原创 一些常见的java错误
关于A,我常认为Java中的变量必须初始化而直接判错就不看下面的了但是其实光int a是没问题的,只要你不使用a这个值就行,使用的话则必须初始化至于D,错的太离谱了short是短整型,不能加小数点。
2023-10-15 22:14:43
39
1
原创 Maven私服搭建
通常来说平时调取依赖等资源的流程图如下:先从本机上的本地库中拉取,如果本地库上没有的话,本地库会去公司的maven私服上拉取,私服上没有的话国内因为不可抗力的原因通常会去阿里云的镜像上拉取,阿里云镜像也没有的话就去最终的官方网站上调取关于为什么要搭建私服,每个人有自己的看法,也有不少小伙伴认为直接在官网或者阿里云镜像上调取就行,我个人的观点就是几方面:数据更安全,使用的个性化更高,调取的效率和稳定性更高提示:以下是本篇文章正文内容,下面案例可供参考。
2023-10-12 21:10:29
59
1
原创 模块搭建规范(含依赖)及接口测试
在实际的开发过程中,有一个很重要的观点就是“约定大于配置”,通过遵照这个观念,我们可以减少自己所做决定的数量,我们只需要去规定那些不合规范的部分即可,从而提高了开发效率这里我们了解并练习了接口测试与压力测试。
2023-10-11 20:02:09
151
2
原创 主从搭建的一些步骤
为了满足更高的性能要求,同时也为了提高数据冗余性从而使数据更安全这里须引入CAP理论C:一致性 (在分布式系统中所有节点的数据一致)A:可用性 (性能要强,不能出现长时间的不可用状态)P:分区容错性 (当节点之间出现故障时,各分区仍可以独立运行)CAP理论的核心观点是:三者无法同时满足,只能三者选其二实现,即CA or CP or AP。
2023-10-09 22:05:40
113
3
原创 20231008 docker入门
在Linux虚拟机中,最外部是作为宿主的Linux大环境,然后里面承载着docker,在Linux中的docker内部通常也是Linux环境,docket中会有很多container(俗称容器或集装箱),这些container内部也是Linux环境,里面就装着我们需要交互的MySQL,因此相当于被包裹了三层,那么我们从MySQL退出时也是要退出两次才能到最外部的Linux。
2023-10-08 21:17:03
79
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人