- 博客(56)
- 收藏
- 关注
原创 【分布式事务】
场景一 跨多个JVM进行事务,如果开启事务后对远程服务调用此时用本地事务进行回滚操作是会发生数据不一致的问题。场景二就是跨多个数据库,可能造成两个数据库直接数据关系不一致。
2024-12-15 01:22:16
945
原创 【JVM虚拟机】面试经典八股文(应届生必看)
java程序在运行中,会在虚拟机中加载.class字节码文件,并且通过加载、验证、准备、解析、初始化五步,最终形成一个虚拟机可以使用的类。加载字节码文件,通过验证格式是否符合jvm,数据是否正确,使用的符合是否符合规范。准备将数据赋默认值,解析符合引用变为直接引用,最后初始化赋值。双亲委派模型是一种类加载的特殊机制,在一个类加载的过程中它不会首先自己加载这个类,而是寻找父类加载器进行加载,不断向上寻找直到找到bootstrap classloader为止,如果还不能加载,那么此时才会直接加载此类。
2024-12-02 13:32:34
852
原创 Dubbo
架构图是这样的,提供者像注册中心提供注册,然后消费者向注册中心进行订阅,然后可以像注册中心进行拉取提供者地址,消费者知道提供地址后可以调用提供者。dubbo中,消费者知道提供者地址,消费者可以直连提供者。
2024-11-21 09:55:42
234
原创 【Redis】持久化机制RDB与AOF
RDB模式是就是将内存中的数据存储到磁盘中,等到连接断开的时候会进行持久化操作。但是如果服务器宕机,会导致这个持久化机制不会执行,但是内存中的文件会直接丢失。所以可以设置一个触发机制,save 60 1000 就是代表60秒 执行1000次修改就触发这个条件,等这个数据数量到达了一定值的时候,就出发持久化操作。这个持久化文件是存储在当前运行的目录中。
2024-11-20 16:23:25
646
原创 【Redis】BitMap实现签到
它一共有32位比特,有一个标志位,所以正好可以作为签到的数据结构。这种数据结构实际上是由string结构实现的,因为它本身存储的就是字节,然后string底层其实也是字节,然后布隆过滤器实际上就是bitmap这种类型。
2024-11-20 03:41:27
192
原创 【Redis】GEO数据结构
可以根据类型分为不同的redis的key,分散GEO数据单挑存储的数据坐标,然后value就是店铺地理位置,最后的值是店铺的id。因为代码中有根据分类查店铺,为了避免之后分类查询效率太低,提前根据分类id存geo数据。
2024-11-20 03:22:36
417
原创 【Redis】实现点赞功能
那么可以用数据库创建一张表来维护这个数据,不多对于数据库来说这个有点重了,首先这个数据不是特别重要,其次这个数据可以访问量操作次数特别高,对于数据库来说频繁进行读取数据,导致大量的io操作,对数据的压力还是比较大的,然后它效率相比redis来说比较慢,所以使用redis是一个比较好的操作,因为他是存在内存中,所以不会过多消耗性能,而且他读取写操作效率高。
2024-11-20 00:54:36
605
原创 【Redis】Redis实现的消息队列
消息基于redis存储不会因为受jvm内存上限的限制,支持消息的有序性,基于redis的持久化机制,只支持单一消费者订阅,无法避免消息丢失。
2024-11-19 18:31:19
693
1
原创 【Redis】实现异步秒杀功能
不过基于内存保存订单信息,如果宕机了,redis中存的数据丢失,后端异步操作的信息还没存入数据库,会有数据不一致问题。可以用消息队列进行操作,这样它会有持久化机制,即使内存中数据丢失,硬盘的数据还会存在。将判断条件缓存到redis中,如果判断成功直接操作redis中的数据,然后将数据写入redis,如果成功返回一个值。然后根据这个值判断是否成功,如果成功把用户id,优惠卷id,订单id存入阻塞队列中,开启新线程将阻塞队列的数据与数据库进行异步操作查询下单等操作,提供效率。
2024-11-19 07:14:50
381
原创 【Redis】基于Redis实现秒杀功能
业务的流程大概就是,先判断优惠卷是否过期,然后判断是否有库存,最好进行扣减库存,加入全局唯一id,然后生成订单。
2024-11-19 06:37:32
1008
原创 全局ID生成器
使用全局ID生成器,它一共有64位,第一位是符号位,然后后面31位是时间戳,最后32位是序列号可以实现自增效果。符号位永远为0占用1bit,后31位以秒为单位,可以使用69年,最后32位秒内计数器,支持每秒2^32个不同id。
2024-11-19 03:07:39
233
原创 【Redis】redis缓存击穿,缓存雪崩,缓存穿透
缓存就是与数据交互中的缓冲区,它一般存储在内存中且读写效率高,提高响应时间提高并发性能,如果访问数据的话可以先访问缓存,避免数据查询直接操作数据库,造成后端压力过大。但是可能会面临数据不一致问题,比如访问数据时拿到的是缓存中的数据,但是实际上数据库此时已经改变了,那么拿到的缓存中拿到数据与数据库中数据会有不一致的问题。解决数据一致性问题会要进行代码操作,增加代码维护成本,如果使用redis还会有运维成本。
2024-11-19 02:12:17
1177
1
原创 【Redis】使用redis实现登录校验功能
答:因为如果是jwt的话,它的特点是根据加密方法签发一个token,一旦签发就不能修改,缺陷是一旦下发,服务后台无法拒绝携带该jwt的请求,如果要实现退出等操作由于他的一致存在性,导致需要将该jwt的信息加入黑名单等操作。登录校验的时候可以设置两个拦截器,第一个拦截器只用来拦截获取用户信息,可以用threadlocal存,刷新token,第二个拦截器用来判断存储的用户信息是否为空,如果为空就需要拦截,如果有值说明token存在验证成功,不需要拦截。为什么不用session,jwt,反而只用token呢?
2024-11-17 06:49:11
647
原创 【MYSQL】分库分表
分库分表就是指在一个数据库在存储数据过大,或者一个表存储数据过多的情况下,为了提高数据存储的可持续性,查询数据的性能而进行的将单一库或者表分成多个库,表使用。
2024-11-16 18:13:12
2090
原创 【MYSQL】读写分离【自我复习版】
所以先配置好主从机制,然后读写分离,实际上就是为了避免DML操作过慢导致查询速度下降,所以将主节点作为DML操作的库,然后把从节点当做DQL操作的库。所以就不能保证数据库的高可用。可以通过业务分类操作不同的库,这也侵入性强实现起来代码比较繁琐,不好后续维护,可以根据mycat,应用程序不用连接mysql,然mycat连接mysql,将sql语句发送给mycat,让mycat将不同sql路由给不同库,如果是DQL就发送给从节点,DML操作就走从节点,从而实现读写分离。
2024-11-16 04:17:01
297
原创 【MYSQL】什么是关系型数据库与非关系型数据库?
关系型数据库(最经典就是mysql,oracle):它是支持SQL语言,并且关系型数据库大部分都支持SQL语言,它可以进行一些复杂的查询操作。除了用一些插件外,它是垂直扩展,它扩展只能增加单个数据库硬件的资源来适应大量数据存储的情况。而非关系型数据库对于不同的数据库存储的数据结构不同,有的是键值对,有的是文档,有的是列簇。它进行扩展是水平扩展的方式,增加节点适应大量数据的情况,天生支持分布式。它不支持事务,它对数据量大,一致性弱的数据,只要保证最终一致性即可。它是以表格的形式存储数据的有表,列,行。
2024-11-15 23:07:16
607
1
原创 【MYSQL】主从复制机制(图解)
主从复制是一种通过binlog(二进制日志)进行操作的一直复制机制,它会有一个主数据库,还会有一个从数据库,根据binlog就可以把主数据库中的信息复制到从数据库之中。这个主从复制的好处就是如果在并发压力大的时候,可以在主数据库进行增删改操作,在从数据库进行查操作可以降低主数据库的压力。如果主数据库崩溃了,此时可以把从数据库顶上。在主数据库备份期间,一般保证数据的一致性会加一把全局锁,此时为了保证数据库正常操作可以将从数据库进行访问操作。
2024-11-14 23:44:34
467
1
原创 【MYSQL】触发器
在DML操作后可能会在前或后触发到提前定义好的SQL集合,使用OLD和NEW引用触发器中变化的内容。对于MYSQL只支持行级触发器。
2024-11-14 18:18:44
403
原创 【MYSQL】InoDB引擎以及MVCC多版本并发控制【详解】
一个表空间对应的一个ibd文件,里面有许多段,其中包括数据段和索引段还有回滚段,在数据存储模型中的B+树中,叶子节点就是数据段进行存储的,非叶子节点就是索引段进行存储的,回滚段里存储了 undo log日志。然后里面还分为区->页->行。
2024-11-14 06:36:31
1106
原创 【MYSQL】锁详解(全局锁、表级锁、行级锁)【快速理解】
锁是处理并发情况下,对数据的一致性的关键因素,也是并发情况下对效率影响非常大的。1、全局锁:锁定表中所有数据。2、表级锁:锁定整张数据库表。3、行级锁:对某行数据进行锁定。
2024-11-14 04:38:50
1189
原创 MYSQL 精通索引【快速理解】
索引是一种可以快速查询的有序的数据结构。如果查询没用上索引的话,那么就会出现把表中的每一条数据进行扫描,这样效率太差。索引的优点就是查找速度快,并且减少进行IO请求次数,根据索引排序减少与CPU消耗。但是存储索引要空间进行存储,并且增删改的时候效率较低因为要在数据结构上修改节点。
2024-11-13 02:12:01
744
原创 MYSQL 存储引擎
在对于数据的完整性和一致性比较强,并且在并发条件下对数据的一直性强,那么就可以用Innodb引擎,对于一些不重要的数据,或者一致性较弱,但是频繁插入的数据可以用MyISAM引擎。这是MYSQL默认的存储引擎,它具有以下特点,第一点就是DML操作遵循ACID原则,并且支持。特点 1.不支持事务,不支持外键 2.支持表锁,不支持行锁。存储在内存上,只能用作临时表和缓存使用,访问速度快,支持hash索引。每一个表对应的一个ibd文件,存储该表的结构,数据,索引。,且有四种隔离级别。,提高并发访问性能。
2024-11-13 00:29:34
506
原创 Spring加载流程,Springboot自动装配原理
接下来就是通过BeanPostProccser下的beforeXXX进行初始化前的一些方法然后进行initBeanFactory下的afterpropertiSet放法实现初始化功能,可以自定义一些方法,初始化完成之后进行BeanPostProccser的afterXX方法,此时AOP就在这里进行的,因为AOP增强的肯定是可以用的bean里的各种方法,不然AOP在之前出现,就没有意义了因为bean都没被创建,代理对象都无法生成。之后使用然后进行销毁disableFactory的destroy方法销毁。
2024-11-11 01:36:16
351
原创 ReentrantLock【复习】
判断有没有人在阻塞队列就是先判断头结点和尾节点是不是相等,如果是相等证明是null,说明阻塞队列中没有元素,如果判断头节点的下一个节点是是自己当前线程,如果是证明是一个可重入锁,那么会返回false,否则返回true,或者判断头节点的下一个节点是不是null,如果是null此时证明有可能是多线程情况下,加入队列的两个节点,第一个节点可能还没有将头节点的next想连,此时第二个节点也加入队列,判断head.next是不是null,如果是null证明此时阻塞队列有元素,考虑到并发勤快了。
2024-11-10 14:57:04
562
原创 线程池ThreadPoolExcutor【复习必看】
因为如果使用Excutors这个类下提供好的线程,它里面有一些线程池是会有问题的,比如它们的某些队列是无界的,如果将线程加入道阻塞队列里不断地添加,会造成OOM。并且使用自定义线程池可以让这个线程池在这个程序达到最强的性能。如果有的业务是IO密集型的,核心线程数就是CPU核数*2,CPU密集型就是CPU核数+1,类似这种可以优化线程池达到最强性能。并且可以设置线程工厂的,在这可以定义每个线程造出来的时候设置线程的名字编号,为了之后出错调试信息的时候可以更加方便。
2024-11-09 02:58:48
478
原创 Cookie、Session、Token究竟区别在哪?图解
如图所示,左边是用户端(浏览器),右边是服务端(服务器)。如果想实现一个登录操作,那么我们可以在浏览器像服务器发送一个HTTP请求,通过对比账号和密码,服务器对比后正确的话,会在服务器设置cookie的值,他是一个key-value的一种结构,通过set-cookie发送给浏览器,浏览器接收到set-cookie的话,会直接将cookie里的值设置成浏览器的cookie里。
2024-11-07 07:57:08
322
原创 Java中四种引用类型【快速理解】图文
我们正常手动new出来的对象都是强应用,不对他进行别的操作的时候它是不会进行垃圾回收的。除非将它的,此时调用垃圾回收器才会将它回收。
2024-11-07 04:16:13
1029
原创 【线程与并发】详谈 可见性,有序问题
如果我们要进行一个数据处理,我们先需要在硬盘中存储的数据读取到我们的内存中,此时cpu要将数据读取出来进行计算,是直接从内存中读取放到自己的register中,然后进行计算,这个速度在计算机看来还是不够快,这个时候就出现了缓存,现在计算机有三级缓存。根据下表可以看出来3、2、1级缓存读取时间依次减少。现在我们的CPU一个里面有多颗CPU,如果是双核CPU那么一颗CPU里有两个核,L1、L2都存在核内,L3存在核外CPU内。
2024-11-06 20:29:58
683
原创 【乐观锁与悲观锁】synchronized锁精讲(图文理解)
它们直接最大的区别就是权限不一致。用户态权限较低,不能进行特权操作以及对硬件资源进行操作。反观内核态权限最高,可以进行特权操作,可以对硬件资源操作,比如对内存进行管理以及进程调度。在Java中用户态可以操作jvm,而内核态是进行系统的操作的。在JDK早期,synchronized是重量级锁,执行重量级锁定时候,就需要jvm像系统进行操作,也就是从用户态转向内核态,并且申请到锁后,还要从内核态转回用户态,这样比较消耗资源,效率低下。
2024-11-06 07:37:18
2156
原创 【乐观锁悲观锁】什么是CAS?
通过学习后发现实际上它底层为了保证CAS过程中,比如将取到的值,和准备交换前获取的数据对比,如果一致将计算好的值存放进去。大概流程是如果要对某一位置进行数据修改操作,那么先读取最新的值,然后进行将准备存入的新数据处理或计算好,在存入前再获取一下存入值的位置的数据,与最初读取的数据是否一致,如果一致就可以把计算或处理好的值存入,如果不一致,从新从最开始的流程来一遍,直到该位置两次读取的两个值一致确认没有线程对该位置的值操作,那么可以将处理和计算后的值存进去。实际上CAS操作就是它的全名一致,比较和交换。
2024-11-06 00:35:19
157
原创 FutureTask、completableFuture简单介绍
其次就是new Thread(这里面都是Thread实现类,或者实现runnable接口的)如果放callable接口是无法存放的,所以借用一个futuretask,它即是runnable的实现类又是callable的实现类,所以他可以放到这个Thread里创建任务。它是一个执行异步计算的一个接口,不过他的get接口是阻塞接口,如果进行异步计算的过程中,调用了get接口,那么开始阻塞,直到计算完成把结果返回,get出来才会结束。
2024-11-05 03:26:05
256
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人