自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(115)
  • 问答 (2)
  • 收藏
  • 关注

原创 Redis中的fork操作

Redis使用fork子进程实现持久化(RDB快照和AOF重写)和主从复制,通过写时复制技术共享内存页,避免阻塞主进程。fork虽高效,但大内存实例可能导致延迟和内存占用问题,可通过关闭Huge Page、优化数据结构、合理配置持久化频率等措施缓解。应监控fork耗时和内存使用,确保系统稳定性。

2025-06-03 17:10:15 1015

原创 Redis中SETNX、Lua 脚本和 Redis事务的对比

在 Redis 中,SETNX、Lua 脚本 和 Redis 事务 均可用于实现原子性操作,但各有其适用场景和局限性。SETNX 适用于简单的单键操作,如分布式锁,但无法处理多键或复杂逻辑。Lua 脚本则适用于多键操作和条件判断,能够保证全局原子性,但需要编写脚本并可能带来性能开销。Redis 事务适用于批量操作,但不支持条件逻辑且部分命令失败时不会回滚。Spring Data Redis 默认不提供原子性保障,需通过 Lua 或事务显式实现。Redisson 的 putIfAbsent 方法通过 SETN

2025-05-20 17:07:46 864

原创 RedissonClient主要功能概述

在实际应用中,可以根据业务需求选择合适的组件,并结合 Redis 的集群、Sentinel 等模式实现高可用和高性能的分布式系统。Redisson 提供了多种线程安全的分布式集合和映射,适用于分布式环境下的数据存储和操作。Redisson 提供了多种锁和同步机制,用于解决分布式环境下的并发问题。

2025-05-20 16:45:57 1139

原创 Redis中的事务和原子性

Redis 中的事务和原子性是保证操作一致性和可靠性的关键。Redisson 和 Spring Data Redis 在处理原子性操作时有显著区别。Redisson 通过封装 Lua 脚本或 Redis 事务,简化了开发,适合分布式集合操作和锁场景。Spring Data Redis 则需开发者显式使用 Lua 脚本或事务,适合高性能缓存和复杂业务逻辑。Redisson 默认线程安全,开发简单但可能引入额外开销;Spring Data Redis 性能更高,但开发复杂度较大。选择工具时,应根据具体需求决定:

2025-05-20 16:10:09 1060

原创 Redisson分布式集合原理及应用

接口继承:RMap实现了和接口,这意味着它可以像普通的Java Map一样使用,并且支持并发操作。功能特性支持异步、非阻塞的操作方法,例如putAsyncgetAsync等。提供了原子性操作,如replaceremove等。支持键值对的过期时间设置,可以为每个键单独设定有效时间和最长闲置时间。支持本地缓存,可以在客户端缓存一些数据以减少网络请求次数。具有写入策略选项,比如WRITE_BEHIND,适合在高负载情况下优化写入性能。

2025-05-20 15:13:43 967

原创 OkHttp连接池

连接池的配置对应用性能至关重要,尤其是在高并发场景下。通过调整最大空闲连接数和连接保持时间,可以有效优化网络请求处理。最大空闲连接数建议根据并发量设置为10~50,连接保持时间通常为1~5分钟。示例代码展示了如何在Java中使用OkHttpClient自定义连接池,并建议在Spring Boot中注册为Bean以便复用。此外,避免连接池过大和复用OkHttpClient实例是提升系统稳定性的关键。调试时,可以通过打印连接池状态来监控其运行情况。

2025-05-14 17:47:45 838

原创 Kubernetes 集群中对应的 Secret 对象如何修改

要更改的值,您需要更新 Kubernetes 集群中对应的 Secret 对象。首先,确认mongodbSecret 的当前内容。

2025-04-17 15:43:35 452

原创 代码提错分支处理方法

如果一切顺利,这个提交将会被成功地应用到正式分支。假设你想要将“Add new feature X”(commit ID: abc1234)应用到正式分支。这样你就成功地将一个特定的提交从测试分支应用到了正式分支,而没有引入其他不必要的更改。

2025-04-15 17:50:46 172

原创 git强制回滚到指定版本

请注意,强制推送会覆盖远程仓库中的所有更改,因此在执行此操作之前,请确保你已经备份了所有重要的更改,并且团队成员都了解这一操作的影响。要将远程分支强制回滚到指定版本(commit hash 为。),可以使用 Git 的命令行工具。确保你是在正确的分支上,例如。

2025-03-25 14:54:58 515

原创 RecursiveTask, ForkJoinTask和FutureTask对比

是一种特殊的,适用于可以递归分解的任务,并能返回计算结果。是所有 fork/join 任务的基础类,支持任务的并行执行,特别适合于能够被细分为更小部分的工作负载。FutureTask则提供了一个通用的方法来包装可调用对象(Callable),使其能够在后台线程中执行,并在未来某个时间点获取执行结果。如果任务是可以被有效分割成多个较小部分的,那么或者更广泛的可能是最合适的选择。而对于只需要简单异步执行的任务,FutureTask可能就足够了。

2025-03-13 16:13:10 802

原创 同步线程池实现方式

在Java中,确保线程池中的所有任务都执行完毕之后再继续下一步操作是一个常见的需求。实现同步线程池的方式通常涉及到使用Java的接口以及其实现类,如。同步线程池的概念可能指的是确保所有提交给线程池的任务在继续执行后续代码之前已经完成。

2025-03-11 11:40:07 238

原创 ForkJoinPool.commonPool() 的使用场景

并行流 (Fork/Join 框架任务。的默认线程池。第三方库或框架的并发任务。由于其线程数量有限且默认配置适合 CPU 密集型任务,因此在使用时需要特别注意任务类型和资源消耗,必要时应创建自定义线程池以满足特定需求。

2025-03-10 14:38:45 675

原创 Java 中实现异步的方式

线程池):适用于一般的异步任务。:适用于复杂的异步操作和链式调用。:适用于可以分解成多个子任务并行处理的场景。Callable和Future:适用于需要获取任务结果的场景。:适用于定时任务和周期性任务。根据具体需求选择合适的异步处理方式,可以提高程序的性能和可维护性。希望这些示例对你有所帮助!如果有更多问题或需要进一步的帮助,请随时提问。

2024-11-26 20:59:29 3054 2

原创 Rysnc安装方法

这将会安装 gcc 和其他一些必需的编译工具。如果在编译或安装过程中遇到任何问题,请根据提示的错误信息来解决,或者查找与具体问题相关的资源。请确保系统中安装了编译工具,比如 Xcode Command Line Tools。在 macOS 系统中,默认情况下并没有预安装。是 macOS 系统自带的工具,它可以完成与。下载完毕后,你可以按照以下步骤来编译和安装。使用服务器指定的文件名来保存下载的文件。

2024-02-06 12:51:55 397

原创 Spring Boot中如何实现bean加载

如果满足条件,返回true,表示条件满足,对应的bean将被创建;上述代码中,@Configuration注解表示该类是一个配置类,@Bean注解表示创建一个bean对象。在这里,我们使用@Conditional(EnvironmentCondition.class)注解来设置条件,即只有在EnvironmentCondition类中的条件满足时,才会创建对应的bean。以上示例中,根据当前环境的属性值来创建不同的DataSource对象,可以根据具体环境的不同来创建适合该环境的bean对象。

2023-09-26 11:07:46 1348

原创 AQS原理

AQS 简单介绍AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask(jdk1.7) 等等皆是基于 AQS 的。当然,我们自己也能利用 A

2020-10-12 15:17:06 3074

原创 关于死锁的总结

死锁是多个线程在运行过程中互相竞争资源发生的僵局,若无外力作用,它们都无法推进下去。死亡如风,常伴吾身。窝窝头,嘿嘿!死锁的四个必要条件互斥条件:一个资源每次只能被一个进程使用。请求和保持条件:一个进程因为请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已经获得的资源在没有使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。解决死锁的基本方法预防死锁:1)资源一次性分配:一次性分配所有资源,这样就不会有请求了(破坏请求条件)2)只要有一个资源得

2020-08-01 21:20:07 395

转载 简单理解jdk的动态代理

1. 静态代理静态代理其实就是我们的装饰者设计模式,首先定义一个接口类,然后定义这个接口类的实现类,对每一个实现类定义一个代理类,这里面代理类里面传入这个实现类的引用。1.1 接口类public interface PersonInterface { void say();}1.2 实现类public class Students implements PersonInterface{@Overridepublic void say() { System.out.pr

2020-07-31 22:53:42 443

原创 由mybatis二级缓存和redis引起的思考

一级缓存Mybatis一级缓存作用域是session,session commit之后缓存就失效了二级缓存Mybatis二级缓存作用域是sessionfactory,该缓存是以namespace为单位的(也就是一个Mapper.xml文件),不同namespace下的操作互不影响。所有对数据表的改变操作都会刷新缓存。但是一般不要用二级缓存,例如在UserMapper.xml中有大多数针对user表的操作。但是在另一个XXXMapper.xml中,还有针对user单表的操作。这会导致user在两个命名空

2020-07-30 19:56:05 934

原创 单例模式的饿汉模式,懒汉模式,双重校验模式详解

1.饿汉式ublic class singleton { //饿汉式 private static singleton instance=new singleton(); private singleton(){} public static singleton getInstance(){ return instance; }}2.懒汉式class SingletonLazy{ //懒汉式 private static S

2020-07-21 17:17:32 691 1

原创 关于对象头引发的思考,对象在内存中是如何存储的

今天在看并发编程这本书的时候,看到了对象头这一名词(如下图所示),这是我第一次接触这个概念,或是说第一次留意到这个概念,这不仅引起了我的深思,对象到底是以何种形式存储在内存中呢首先,我上网搜了一下对象在内存中的存储结构,经过筛选得到这样一张图,了解到对象的内存结构包括对象头(MarkWord,类指针,数组长度),实例数据,对齐(为了加快访问速度,java对象的大小必然是8的整数倍)三个部分。下面直接上代码,看看对象的每个部分到底是怎么样的new Object() 和 new byte[0]占多少字

2020-07-20 12:38:10 551

原创 域名解析获得IP地址(全方位分析输入网址后计算机到底做了什么)

当你在浏览器地址栏输入www.baidu.com,www.bilibili.com时,你有想过浏览器是怎么通过域名解析到IP,定位到服务器吗,本文将帮你解决这个疑惑,准备上车!首先直接上图,整个流程如图所示:

2020-07-19 21:32:27 4194

转载 cookie和session详解和区别

写的非常详细,膜拜https://www.cnblogs.com/l199616j/p/11195667.html

2020-07-19 12:50:14 212

原创 Mybatis中的缓存详解

Mybatis中缓存分两种,一级缓存和二级缓存。一级缓存一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Mabits默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。 每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个Ha

2020-07-19 12:35:56 655

转载 栈帧中局部变量表,操作数栈,动态链接,方法出口的理解

栈帧的概念栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。一个线程中方法的调用链可能会很长,很多方法都同时处于执行状态。对于JVM执行引擎来说,在在活动线程中,只有位于JVM虚拟机栈栈顶的元素才是有效的,即称为当前栈帧,与这个栈帧相关连的方法称为当前方法,定义这个方法的类叫做当前类。执行引擎运行的所有字节码指令都只针对当前

2020-07-19 10:03:36 5447

原创 Java中的四种引用类型

Java中的四种引用类型:强引用、软引用、弱引用和虚引用有四种引用类型的原因在Java中是由JVM负责内存的分配和回收,这是它的优点(简化编程者的工作,不需要像C语言那样去手动操作内存),但同时也是它的缺点(不够灵活,垃圾回收对于编程者来说是不可控的)。在JDK1.2以前,如果一个对象不被任何变量引用,则程序无法再次使用这个对象,这个对象最终会被GC(GabageCollection:垃圾回收)。但是如果之后可能还会用到这个对象,就只能去新建一个了,这其实就降低了JVM性能,没有达到最大的优化策略。

2020-07-18 17:51:18 430

原创 有fullGC 为什么还会发生oom(OutOfMemoryError)

jvm有fullGc 为什么还会出现oom(OutOfMemoryError)问题:既然在触发full gc的时候,年老代和持久代都会被清理,那么为什么还会出现oom问题?而且对于强引用,当内存空间不足,java虚拟机宁愿抛出oom错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题;那么full gc机制的存在有何意义?还是说fgc主要针对的是驻扎在老年的的软引用? 既然如此,对于四种引用的方式如何抉择?总不能所有对象都创建引用队列使用软引用或弱引用吧?举个栗子类比下:为

2020-07-18 15:55:11 1588

原创 HTTP请求消息数据格式详解(请求头,请求行,请求体)

HTTP:概念:Hyper Text Transfer Protocol 超文本传输协议传输协议:定义了,客户端和服务器端通信时,发送数据的格式特点:基于TCP/IP的高级协议默认端口号:80基于请求/响应模型的:一次请求对应一次响应无状态的:每次请求之间相互独立,不能交互数据历史版本:1.0:每一次请求响应都会建立新的连接1.1:复用连接请求消息数据格式:1.请求行请求行包括三部分:请求方式 请求url 请求协议/版本GET /logi

2020-07-14 23:08:18 7136

原创 Java中Object对象方法

1.clone() 复制2.getClass() 获取对象的class3.equals() 对象值比较,重写equals方法必须重写hashcode,对象的约定,例如不重写,hashMap的kv不一致;4.hashCode() 对象的hash值5.tostring() 默认方法是 包名@改对象的hashCode十六进制表示6.notify() 线程唤起7.notifyall() 线程全部唤起8.wait() 线程等待9.finalize() 基本没啥用,垃圾回收前调用的方法...

2020-07-06 18:52:38 504

转载 深入分析Sleep(0)与Sleep(1)的区别

之前看到Sleep(0)以为是让线程不等待,字面理解,其实大错特错!!!目的:有时候我们想让线程不被调度一定的时间,也就是说让线程睡眠一段时间。API 接口:在 Win32中可以调用 Sleep,SleepEx 和 SwitchToThread 三个API。VOID WINAPI Sleep(DWORD dwMilliseconds);DWORD WINAPI SleepEx(DWORD dwMilliseconds, BOOl bAlertable);BOOl WINAPI SwitchTo

2020-07-06 18:36:06 1781

原创 CPU,缓存,内存,外存全解析

一:缓存定义:凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为Cache被扩充概念:如今缓存的概念已被扩充,不仅在CPU和主内存之间有Cache,而且在内存和硬盘之间也有Cache(磁盘缓存),乃至在硬盘与网络之间也有某种意义上的Cache──称为Internet临时文件夹或网络内容缓存等。存放的数据:内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存作用:用于协调两者数据传输速度差异的结构实际例子:缓存是CPU(Central Processing

2020-07-05 20:25:27 9900

原创 反转链表(自用复习)

2020-07-03 22:18:44 191

原创 java 二叉树的遍历(代码实现)

一、前序遍历访问顺序:先根节点,再左子树,最后右子树;1)递归实现public void preOrderTraverse1(TreeNode root) { if (root != null) { System.out.print(root.val + "->"); preOrderTraverse1(root.left); preOrderTraverse1(root.right); }}2)非递归实现public vo

2020-07-03 18:43:50 565

原创 一文读懂JVM内存栈

JVM栈(数据结构就是栈结构,FILO:fisrt in last out,先进后出)当一个线程启动的时候,栈内存都会为这个线程开辟一块单独的区域来供这个线程使用。举例:假如现在有线程1、线程2两个线程进行了下图的操作:那么,此时栈内存会为线程1、线程2分配两块内存空间:分配好的空间中又是什么结构呢?我们继续引出“栈帧”这个概念,栈帧其实就是每个线程在运行具体方法的时候所拥有的独立的内存空间,进而保证各自局部变量的作用域范围。如图:局部变量表和操作数栈:结合代码说明一下局部变量表和操作数栈

2020-06-30 18:20:35 457

原创 二叉树的深度优先遍历和广度优先遍历

数据结构中的有两个比较重要的算法。深度优先搜索和广度优先搜索。二叉树中的深度搜索就是对一个分支进行遍历,而广搜就是一层一层的搜索。一.深度优先遍历深度优先遍历包括:前序遍历,中序遍历,后序遍历三部分1.前序遍历2.中序遍历3.后序遍历一.广度优先遍历使用队列实现逐层入队,这一层入完,先进先出出队,出队的同时孩子节点入队...

2020-06-28 20:08:53 746

转载 Arrays.sort实现降序排序

在调用Arrays.sort()对数组进行排序时,默认是升序排序的,如果想让数组降序排序,有下面两种方法:1.Collections的reverseOrderimport java.util.*; public class Main { public static void main(String[] args) {// 注意这里是Integer,不是int Integer[] arr={9,8,7,6,5,4,3,2,1}; Arrays.s

2020-06-26 11:25:05 23433

原创 JAVA核心一知识点总结(一)

java的优势:跨平台windows下开发的linux也能使用jdk和jre的区别:jdk包括jre.java->.class文件jie将.class翻译成操作系统可以识别的语言main方法的特点:1.可以通过外界触发2.静态方法,程序的入口注释:功能,作者,创建时间,修改时间,上一次的修改人float精度丢失问题符号位阶位数值位float:1823double:11152数据类型boolen 32位 4字节char 不同

2020-06-16 16:00:25 354

原创 I/O操作四大抽象类及其字类 (装饰器模式)

装饰器模式

2020-06-14 16:35:36 281

原创 前端怎么接到后端抛出异常500的message值

500也是可以进success:function的,惊喜吧,惊喜吧!

2020-06-12 19:04:42 4670 3

原创 sql中的if和else

MySQL的IF既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用:IF表达式IF(expr1,expr2,expr3)如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。SELECT IF(sva=1,"男","女") AS s FROM table_name WHERE sva

2020-06-11 09:42:17 57268

空空如也

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

TA关注的人

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