自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java之分布式事务

A 事务中的所有操作,要么全部成功,要么全部失败 影响事务的操作,一般指的是增删改,也就是一个事务中,有多个增删改的SQL:C 事务开始前到事务结束后,数据状态需要一致 如 转账 李四给张三转200 李四余额+200,张三余额-200 支付 王五买了一个iphone12,支付了5500 王五余额-5500 订单状态,由 0 -> 1,0:未支付,1:已支付:I 多个事务之间的操作相互隔离,互不影响 如 我这边转账,不影响你那么支付。反之亦然。

2023-09-26 21:07:27 635

原创 java之多线程基础

进程就是在内存中正在运行的程序,比如电脑上正在运行的某个软件;而线程指的是进程中的一个最小执行单元。一个进程最少得有一个线程,就比如该软件中的某个具体的功能。1、继承Thread类和实现Runnable接口,有什么区别?你一般选择哪个?为什么?首先,java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了。其次,如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

2023-09-25 21:25:34 87

原创 redis常见问题之如何保证双写一致性

这种策略可能已经避免掉了,策略2中缓存丢失的情况,但是再高并发的情况下,也会有不一致的情况,比如线程A做写操作,首先删除缓存然后准备更新数据库,这时候,线程B执行了写操作,没有命中缓存,然后查询数据库,这时候读取的是旧值,并把查询到的旧值保存到缓存中,接着线程A完成了数据库的更新,这时候数据库和缓存又出现了不一致的情况,解决方案:我们只要再线程A,完成数据库的更新之后,稍作延迟再删除一次缓存,也叫作延迟双删。解决方案:延迟双删,延时双删还是有问题的,如果删除缓存失败怎么办,当然是再次删除,不断的循环删除。

2023-09-21 21:42:17 211

原创 java之天穹头条day01

jwt的组成分为 头(HEADER), 载荷(PAYLOAD)验签(VERIFY SIGNATURE)1、登录成功后,生成一个token给客户端, token就是基于jwt生成的字符串。3、服务器获取到客户端传递的token后,要对其进行验签和解析,从中获取登录的信息。2、客户端把token保存起来,在下次请求时把token以请求头的形式发给服务器。4.设置网关的配置文件,可以拉取naco中的已经写好的配置文件。3.创建app端网关,父工程为网关模块。5.通过网关的端口测试接口。最后需要引入前端工程.

2023-09-20 18:18:30 58

原创 迭代器知识点

这个需要多方考虑,比如普通for循环用在数组是遍历最快的,它是直接获取数据,但普通for不能用在不知道长度的集合中,这就需要用iterator或者foreach,相对来说,iterator效率会高于foreach,因为foreach在访问过程中产生一个额外的Enumerator对象,这个对象会进行版本检查处理,所以它是线安全的。iterator是最强大的,他可以随时修改或者删除集合内部的元素,并且是在不需要知道元素和集合的类 型的情况下进行的,当你需要对不同的容器实现同样的遍历方式时,迭代器是最好的选择!

2023-09-18 21:42:49 42

原创 并发容器之 ConcurrentHashMap 详解(JDK1.8 版本)

并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性, 例如在 ConcurrentHashMap 中采用了一种粒度更细的加锁机制,可以称为分段锁,在这种锁机制下,允许任意数量的读线程并发地访问 map,并且执行读操作的线程和写操作的线程也可以并发的访问 map,同时允许一定数量的写操作线程并发地修改 map,所以它可以在并发环境下实现更高的吞吐量。那么它到底是如何实现线程安全的?同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。

2023-09-16 21:42:14 296

原创 关于Elasticsearch

倒排索引是ES实现快速搜索功能的核心概念,在介绍倒排索引之前,首先得说一说什么是正向索引,正向索引就是先通过文件名找到具体的文件,再获取文件中的内容过程,mysql的查询功能就是正向索引的思想,先根据ID查询记录,再从记录中获取相关字段的数据.把要搜索的内容进行分词,根据分词后的结果去词条表中根据词条进行匹配,得到文档ID列表,再通过文档ID返回具体的文档信息;再通过文档ID找到对应的文档;Document: 文档, 就是一条条的数据, 类似数据库中的行(Row), 文档都是json格式;

2023-09-15 21:41:22 30

原创 如何保证消息不重复消费

4.乐观锁机制:对于需要更新数据库等持久化存储的操作,在更新数据前先查询数据版本号或修改时间戳等字段,并将其与要更新的数据一起提交。如果数据版本号或修改时间戳不匹配,则说明数据已经被其他进程修改,这时候需要重新获取最新的数据进行操作。如果消费者由于某种原因没有发送确认信息,则该条消息会继续保留在队列中,直到有其他消费者来处理它。当消费者从队列中获取消息时,检查该消息是否已经被处理过。3.时间戳:给每个消息设置一个时间戳,在消费者获取到该消息后,检查当前时间与时间戳之间的差值是否超过了某个阈值。

2023-09-14 16:47:32 131

原创 关于java中的死锁

synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,这就是所谓的“活”, 而处于死锁的实体表现为等待;同步方法块,锁是括号里面的对象。A需要B解锁,B需要A解锁,两个都在中间互相等待,却谁也无法满足条件,从而发生阻塞,就是死锁。ReentrantLock默认使用的是非公平锁,减少一定的上下文切换,保证系统更大的吞吐量。

2023-09-12 21:03:07 46 1

原创 InnoDB的回表问题及解决方法

在B Tree数据类型在保证树的平衡的过程中,每次关键字的变化,都会导致结构发生很大的变化,这个过程是特别浪费时间的,所以创建索引一定要创建合适的索引,而不是把所有的字段都创建索引,创建冗余索引只会在对数据进行新增,删除,修改时增加性能消耗。InnoDB是mysql最常用的储存引擎,InnoDB回表即第一次B+tree的叶节点上没能直接获取数据,还需要通过叶节点上的数据做为新的索引在另一张表上进行第二次B+tree的扫描,直到获取最终想要的数据。覆盖索引(就是联合索引)。

2023-09-11 21:08:25 113

原创 HashMap的底层实现原理

添加第二元素并发生了哈希冲突时,才进入红黑树转化的判断,同时初始化binCount=0,它判断的是binCount>=7,也就是0至7,有8个元素时,再加上没有进行判断的1个元素,即第9个元素时,才会转化为红黑树。初始化后,当存入新的键值对时,会先判断数组长度是否大于64,再判断链表元素是否大于等于8时,如果两者都成立,链表会自动转换成红黑树,如果数组小于64,会从第9个开始先扩容,直到数组大于等于64时,链表长度再增加,就会转为红黑树。JDK8以前,Hash表的底层是【数组】+【链表】

2023-09-09 21:41:36 53 1

原创 什么是java分布式架构

Java中可以使用Java API for XML Web Services(JAX-WS)和Java API for RESTful Web Services(JAX-RS)等技术构建和发布Web服务。分布式架构允许将应用程序的不同组件部署在不同的计算机或服务器上,并通过网络进行通信和协作,以实现更高的性能、可伸缩性和可靠性。- 客户端/服务器架构是最基本和常见的分布式架构模式。这些分布式架构模式和技术提供了丰富的选择,可以根据应用程序的需求和复杂性选择合适的架构模式和技术组合。

2023-09-07 19:55:39 122

原创 如何将JSON对象转化为java对象,如何将java对象转化为JSON对象

需要注意的是:在Java代码中表示JSON字符串时,我们需要在双引号前加上转义字符\,其中,"表示一个双引号字符,\表示一个转义字符。gson.fromJson(input.toString(), User.class)的这两个参数分别为JSON字符串对象和要转化的对应的java实体类。String jsonStr = "{ \"name\": \"张三\", \"age\": 18, \"gender\": \"男\" }";通过Gson对象的fromJson方法将json对象转化java实体类对象。

2023-09-06 21:47:16 211 1

原创 redis缓存三兄弟解决方案

当对一个元素进行查询时,通过对该元素进行相同的哈希计算,并检查对应位图上的位置是否都为1,如果都为1,则表示该元素可能存在于集合中;缓存空对象是当查询一个不存在的键时,可以在缓存中存储一个表示空对象的值,用于表示该键对应的数据不存在。这样,在后续的请求中,当再次查询同一个键时,可以直接从缓存中获取到空对象的值,而不需要再次访问数据库。缓存层承载着大量的请求,有效保护了存储层。但是如果由于缓存大量失效或者缓存整体不能提供服务,导致大量的请求到达存储层,会使存储层负载增加,这就是缓存雪崩的场景。

2023-09-05 20:39:59 88 1

原创 Linux常用命令

is [参数] [目录]: 展示指定目录下的内容, 参数 -a 展示所有, -d 展示目录, -l 以列表的形式展示, 目录 有,则展示指定目录内容,无,展示当前所有目录内容。more: 分页展示文件内容,适用于看大文件->回车键 向下滚动一行, 空格键 向下滚动一屏, b 返回上一屏,q或者Ctrl+C 退出more。vi 文件名: 三种模式: 命令模式通过i,a,o进入插入模式,通过:进入底行模式;rm [-rf] 目录名: 删除目录, -r 递归, -f 不提示。history: 查看历史命令,!

2023-09-03 21:19:36 31

原创 什么是线程同步和线程互斥,有哪几种实现方式?

实现线程同步的方法 • 同步代码方法:sychronized 关键字修饰的方法 • 同步代码块:sychronized 关键字修饰的代码块 • 使用特殊变量域 volatile 实现线程同步:volatile 关键字为域变量的访 问提供了一种免锁机制 • 使用重入锁实现线程同步:reentrantlock 类是可冲入、互斥、实现了 lock 接口的锁他与 sychronized 方法具有相同的基本行为和语义。线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。

2023-09-02 21:48:22 115 1

原创 Java 中的线程调度

在运行池中,会有多个处于就绪状态的线程在等待 CPU,JAVA 虚拟机的一项任务就是负责线程的调度,线程调度是指按照特定机制为多个线程分配 CPU 的使用权。Java 虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用 CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用 CPU。(3)notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并 不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且 与优先级无关;

2023-08-29 21:44:57 48 1

原创 什么是集合?

集合框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部 分上,而不是为了让程序能正常运转而将注意力于低层设计上。在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方 法,例如查找、排序等。这些算法通常是多态的,因为相同的方法可以在同一个 接口被多个类实现时有不同的表现。用于存储数据的容器。集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。对象的个数确定可以使用数组,对象的个数不确定的可以用集合。

2023-08-28 20:31:17 35 1

原创 HashMap 与 HashTable 有什么区别?

②创建时如果给定了容量初始值,那么 Hashtable 会直接 使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小。在 Hashtable 的类注释可以看到,Hashtable 是保留类不建 议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用 则用 ConcurrentHashMap 替代。JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的 变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减 少搜索时间。

2023-08-27 22:48:50 30 1

原创 java中的并发理论

finalize 是 Object 类的一个方法,该方法在 Object 类中的声明 protected void finalize() throws Throwable { } 在垃圾回收器执行时会调用被回收对象的 finalize()方法,可以覆盖此方法来实 现对其资源的回收。注意:一旦垃圾回收器准备释放对象占用的内存,将首先调 用该对象的 finalize()方法,并且下一次垃圾回收动作发生时,才真正回收对象 占用的内存空间。垃圾回收是在内存中存在没有引用的对象或超过作用域的对象时进行的。

2023-08-25 21:46:41 34 1

原创 java中的死锁

活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,这就是所谓的 “活”, 而处于死锁的实体表现为等待;当线程 A 持有独占锁 a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需 要的锁,而发生的阻塞现象,我们称为死锁。死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成 的一种互相等待的现象,若无外力作用,它们都将无法推进下去。3、不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。

2023-08-24 21:49:31 15 1

原创 数据库优化

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等。表的规范化程度越高,表和表之间的关系越多,需要连接查询的情况也就越多, 性能也就越差。因为系统的吞吐量瓶颈往往出现在数据库的访问速度上, 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢, 数据是存放在磁盘上的,读写速度无法和内存相比。因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。

2023-08-23 17:52:22 23 1

原创 spring的事务隔离

发生幻读的原因也是另外一个事务新增或者删除或者修改了第一 个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。4. ISOLATION_REPEATABLE_READ:可重复读,保证多次读取同一个数据时, 其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据 (会造成幻读),MySQL 的默认级别;2. ISOLATION_READ_UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);

2023-08-21 19:59:44 36 1

原创 依赖注入

依赖注入之所以更流行是因为它是一种更可取的方式:让容器全权负责依赖查询,受管组件只需要暴露 JavaBean 的 setter 方法或者带参数的构造器或者接口,使容器可以在初始化时组装对象的依赖关系。所谓依赖注入(Dependency Injection),即组件之间的依赖关系由容器在应用 系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到 应用系统中的各个关联的组件之中。依赖注入的基本原则是:应用组件不应该负责查找资源或者其他依赖的协作对 象。

2023-08-19 21:17:00 18

原创 ThreadLocal以及内存泄漏解决方法

ThreadLocal的工作原理很简单,每个ThreadLocal对象实际上都是一个变量的容器,它可以存储一个变量,并为每个线程提供一个副本。例如,在Web应用中,可以使用ThreadLocal在每个请求处理线程中保存当前用户的身份信息,以便在后续的处理过程中可以方便地获取该信息,而不需要每次都进行显式传递。3.使用线程池管理ThreadLocal:在使用线程池时,如果线程池中的线程重用,ThreadLocal变量可能会泄漏到下一个任务中。方法,在任务执行完毕后清理ThreadLocal变量。

2023-08-18 19:30:30 155 1

原创 什么是线程和进程?

在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在 Windows 系统中,一个运行的 xx.exe 就是一个进程。一个进程至 少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。

2023-08-16 20:00:53 26 1

原创 集合小介绍

算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方 法,例如查找、排序等。这些算法通常是多态的,因为相同的方法可以在同一个 接口被多个类实现时有不同的表现。集合框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部 分上,而不是为了让程序能正常运转而将注意力于低层设计上。集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。对象的个数确定可以使用数组,对象的个数不确定的可以用集合。集合存储的对象可以是不同数据 类型。对外的接口、接口的实现和对集合运算的算法。

2023-08-15 21:30:37 18 1

原创 String,Stringbuffer和stringbuilder

与StringBuffer不同,StringBuilder类没有实现同步,因此在单线程环境下,StringBuilder相对于StringBuffer的性能更高。由于StringBuffer是可变的,它在多线程环境下是线程安全的,适合在并发环境中使用。需要注意的是,从String转换为StringBuffer或StringBuilder时,会创建一个新的对象。需要注意的是,String、StringBuffer和StringBuilder之间可以相互转换,可以使用相应的构造函数或方法进行转换。

2023-08-14 21:33:43 58 1

空空如也

空空如也

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

TA关注的人

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