- 博客(241)
- 收藏
- 关注

原创 idea设置JVM运行参数调优 体验优化
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms256m -Xmx256m -Xss512k -XX:+UseConcMarkSweepGC添加完成后,点击apply ok就设置成功了,重启项目
2020-12-30 21:52:44
665

原创 SpringCloud与Dubbo的区别
1.SpringCloud与Dubbo的区别两者都是现在主流的微服务框架,但却存在不少差异:初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理生态环境不同:SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。调用方式:SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用
2020-10-21 23:09:41
75889
7
原创 什么是“墙”
有时候,用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户,这个上网的过程就是用到了正向代理。通过正向代理服务器访问目标服务器,目标服务器是不知道真正的客户端是谁的,甚至不知道访问自己的是一个代理。“墙”在这里指的是一种网络屏蔽机制,它通过对互联网流量进行控制,阻止用户访问特定的外部网站或服务。
2025-02-28 09:02:46
168
原创 什么场景只能用HTTP,不能用RPC?
1、在异构系统(跨语言和跨平台),HTTP具有更好的兼容性,因为HTTP是一种通用的协议,几乎所有的编程语言和操作系统都支持HTTP协议,而不是所有的编程语言和操作系统都支持相同的RPC协议。2、RPC适合用在企业内部,要求使用同一套注册中心进行服务治理,如果是跨组织,或者跨公司,这种情况只能用更加通用的HTTP进行通信。
2025-02-27 09:23:08
247
原创 Redis中hash结构比string的好处有哪些?
对于String类型,要存储对象的话,需要把对象序列化成一个SON字符串,然后把整个字符串保存在Redis的String结构中,而使用Hash接口的话,则只需要把对象转成map(比如使用fastison可以直接转),就可以直接把这个map存储到Redis的hash结构中了。String就是字符串,用于存储简单的值,而Hash是一种哈希表结构,用于存储本身具有k-v结构的数据。当然,也可以不把一个对象都存在一个key里面,也可以拆分一下,比如用独立键的方式,如。相比之下,同样是存储对象的话,
2025-02-27 09:22:57
255
原创 Redis的事务和MySQL的事务区别?
Redis的事务的好处是,简单,轻量,不需要复杂的事务管理,之所以这么设计,是因为Redis天生就是一个缓存框架,他的目的就是为了性能。而且Redis的事务也没有隔离级别的走义,本身是单线程的,也没啥隔离的必要了。我们知道,Redis和MySQL都宣称自己支持事务的,但是他们的事务是不一样的。:同一事务内的查询结果一致(防止不可重复读,但是会出现幻读,MySOL默认)。MySQL的事务机制是遵循标准的 ACID 的,所谓ACID,就是。:只能看到已提交事务的数据(可以防止脏读,但是会出现不可重复读)。
2025-02-26 09:22:27
347
原创 Redis能完全保证数据不丢失吗?
在开启混合持久化的情况下,AOF 重写时会把,Redis 的持久化数据,以 RDB 的格式写入到 AOF 文件的开头,之后的数据再以 AOF 的格式化追加的文件的未尾。如果在写入缓冲区之后,没写磁盘前,机器挂了,那么数据就丢了。如果在这这个延迟过程中,机器挂了,那么数据也就丢了。首先Redis是基于内存存储的,虽然有了RDB和AOF的持久化机制,当Redis进程异常退出或服务器断电等情况发生时,内存中的数据可能会丢失。有一种极端情况,那就是AOF这个持久化方案中,有一种Always的写回策略,即同步写回。
2025-02-26 09:22:17
249
原创 RDB和AOF的写回策略分别是什么?
同步写回”可靠性肯定是最高的,但是它在每一个写命令后都有一个落盘操作,而且还是同步的,这和直接写磁盘类型的数据库有啥区别?,操作系统控制的写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓中区,由操作系统决定何时将缓冲区内容写回磁盘。,每秒写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔一秒把缓中区中的内容写入磁盘;每秒写回“是在二者之间折中了一下,异步的每秒把数据写会到磁盘上,最大程度的提升效率和降低风险。,同步写回:每个写命令执行完,立马同步地将日志写回磁盘;
2025-02-25 09:37:07
275
原创 Redisson 的 watchdog 什么情况下可能会失效?
续期是通过时间轮在后台执行的,如果到了该执行的时候,因为种种原因,没有执行成功,比如说机器崩溃了,或者机器的 CPU 被打满了,无法执行这个动作了,都有可能导致没能及时执行续期动作。,在上面的文章中我们看了源码,深入的介绍了,当你调用 Redisson 的加锁方法时如果自己指定了超时时间,redisson 就不会再帮你续期了。,还有一种情况就是续期任务执行了,但是执行的时候失败了,比如 Redis服务器挂了,网络连不上了,也可能会导致无法续期。
2025-02-25 09:36:56
209
原创 如何在 Redis Cluster 中执行 lua 脚本?
例如,如果你有多个与用户ID 相关的键,可以使用 user:(12345}:profile 和 user:{12345}:settings 这样的命名方式,确保它们都位于同一个节点。因为 Redis Cluster 中,数据会被分片到多个节点上,跨节点的 lua 脚本是不支持的,所以就会失败。有了这个特性,我们就可以在设计键名时,可以将共享相同逻辑或数据集的键包含相同的 hashtag。2.拆分操作:尽量将需要事务处理的逻辑拆分成多个独立的、可以在单个节点上执行的小操作,从而避免跨节点事务的需求。
2025-02-24 09:15:08
792
原创 Redis Cluster 中使用事务和 lua 有什么限制?
主节点负责处理写操作,而从节点负责复制主节点的数据并处理读请求。在Redis的Cluster 集群模式中,会对数据进行数据分片,将整个数据集分配给不同节点。Redis 不会在节点之间迁移数据来支持跨节点的脚本执行。Lua 脚本执行为原子操作,但是如果脚本因为某些键不在同一节点而失败,整个脚本将终止执行,可能会影响数据的一致性。这个思想就和我们在MVSQL 中做分库分表是一样的,都是通过一定的分片算法,把数据分散到不同的节点上进行存储。如果尝试在一个事务中包含多个分片的键,事务将失败。
2025-02-24 09:14:53
299
原创 什么是RPC,和HTTP有什么区别?
而我们熟知的HTTP,他的中文名叫超文本传输协议,所以他就是一种传输协议。所以,我们可以认为RPC和HTTP并不是同一个维度的两个概念。只不过他们都是可以作为远程调用的,所以经常拿来对比。RPC是Remote ProcedureCall的缩写,译为远程过程调用。要想实现RPC通常需要包含传输协议和席列化协议的实现。RPC的具体实现上,可以像HTTP一样,基于TCP协议来实现,也可以直接基于HTTP协议实现。
2025-02-21 09:12:36
1216
原创 为什么Redis不支持回滚?
Redis事务是提交后一次性在单线程中执行的,而关系型数据库如MVSOL是交互式的多线程模型执行的,所以MySQL需要事务的回滚来确保并发更新结果不出现异常。我们都知道,Redis是不支持回滚的,即使是Redis的事务和Lua脚本,在执行的过程中,如果出现了错误,也是无法回滚的,可是,为什么呢?:在Redis中,命令失败的原因比较有限:语法错误、操作的数据的类型不一致、Redis资源不足等。而这几种问题,是应该在编码阶段就发现的,而不应该在Redis执行过程中出现。不支持回滚主要的原因是。
2025-02-21 09:04:50
389
原创 对于 Redis 的操作,有哪些推荐的 Best Practices?
7、对于需要频繁更新的数据,可以使用 Redis 的 Hash 数据结构,以减少 Redis 实例的内存占用和网络传输数据量。9.对于需要高可用的 Redis 实例,可以使用 Redis Sentinel 或 Redis Cluster 进行搭建,以实现 Redis 的高可用性。8.避免在 Redis 实例上运行复杂的计算逻辑,因为这会导致 Redis 的主线程被阻塞,影响 Redis 的性能。3.避免在 Redis 中存储大的数据块,因为这会导致 Redis 实例内存占用过高,影响 Redis 的性能。
2025-02-21 09:04:40
168
原创 Redis如何实现发布/订阅?
订阅者可以订阅特定频道以接收他们感兴趣的日志消息,例如错误或异常消息,并能够实时更新。当教据被更新时发布者将消息发布到特定频道,订阅者将接收到消息并更新其本地缓存。即在Redis中定义频道,客户端可以订阅一个或多个频道并接收它们所发布的消息。订阅者可以订阅特定频道以接收他们感兴趣的消息,并能够实时更新。订阅者可以订阅特定频道以接收他们感兴趣的实时数据更新,并能够实时更新。Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者(sub) 接收消息。
2025-02-20 09:04:11
227
原创 什么是事务消息,为什么需要事务消息?
有问题,因为会出现一种极端情况,那就是当出现网络抖动的时候,发送MQ因为网络超时返回了失败,本地事务回滚之后,但是网络超时不一定是MO没有接收到,有可能处理成功了,但是返回的时候超时了。而且,MQ自身也不一定可靠,不管是哪种MQ,在极端情况下,都是有可能丢消息的,也就说,可能会出现本地事务成功之后,发送MO成功了,但是因为MQ自身原因,导致消息丢了,还是会出现不一致。一旦在第一个参与者本地事务操作之后,如果出现了MO发送失败、或者发送成功了,但是MQ自己存储失败了等原因,可能就会导致不一致了。
2025-02-20 09:03:59
182
原创 什么是OAuth2?有什么用?
OAuth 2.0(OAuth2)是一种开放授权协议,它允许用户将有限的访问权限授权给第三方应用,而无需直接共亨用户的凭据(如用户名和密码)。后续客户端再访问资源服务器的时候,只需要带上这个令牌,资源服务器会对Access Token做验证,验证通过后则进行数据返回。大致流程就是客户端先向授权服务器请求权限,权限校验通过后向客户端颁发一个令牌,即Access Token。:存储资源所有者的数据,并响应客户端的请求如 API)。:第三方应用程序,如浏览器、APP等,希望访问一些特定的数据。
2025-02-19 09:05:47
515
原创 Redis 分布式锁和zk分布式锁哪个对死锁友好?
而ZooKeeper在客户端崩溃时,链接会自动断开,那么就会自动删除崩溃客户端创建的锁节点,这样就相当于解锁了,那么就可以很大程度上来避免死锁。而Redis锁虽然有超时释放的机制,但如果客户端在执行关键任务时突然崩溃,其他客户端需要等超时时间到了之后才能加锁成功。什么叫死锁友好呢,就是可以减少锁的时长、提供自动释放等机制,就可以提前释放锁,就能降低死锁发生的概率,所谓的死锁友好。
2025-02-19 09:05:36
325
原创 Seata的4种事务模式,各自适合的场景是什么?
这种模式可以支持多数据源的情况,不管你是Redis、MySQL还是ES,反正他就是要你自己实现Try、Confirm和Cancel,具体的逻辑你自己写,提交、回滚的代码你自己来实现就行了,所以他对代码有一定的侵入性。就是没有侵入性,你只需要按照Seata的要求引入@GlobalTransaction注解,就可以实现你的分布式事务了,他不需要做额外的操作,你只需要关注你的业务逻辑即可。以上三种都是最终一致性,而XA模式这种就适合于你对一致性要求非常高的场景,只有他是一种强一致性模型。
2025-02-18 10:49:06
167
原创 Seata的AT模式的实现原理
所谓代理数据源,其实就是在应用自己的Datasource之上做了一层代理,是的原本的JDBCDatasource变成Seata DatasourceProxy,这样就可以在这层代理当中控制SQL语句的提交、回滚等操作。:如果所有的 RM 都同意提交,说明他们此时他们的本地事务都已经执行成功了,那么心就可以释放该全局事务的所有锁,然后异步调用RM清理Undo Log。1、RM针对本次要执行的本地事务的SQL进行解析,得到SQL的类型、修改的表以及where条件等信息。并把本地事务的执行结果上报给 TC。
2025-02-18 09:02:26
541
原创 为什么不建议用数据库唯一性约束做幂等控制?
这里是通过catch了DuplicateKeyException依赖来做的处理,这样就对异常有了依赖,不建议大家在代码中根据异常来控制业务流程(原文见下方链接),另外,这里和DuplicateKeyException绑定了,一旦有-天换了数据库、换了ORM框架,换了Spring版本等等,这个异常就可能会发生改变,也许就不再抛这个异常了,那么就会出现问题。,以上的方案,有一个局限性,就是需要在做insert的时候才行,这种情况下会因为幂等操作导致重复记录,而触发唯一性约束冲突。2、如果有,则直接返回。
2025-02-18 09:02:04
252
原创 TCC是强一致性还是最终一致性?
所以,因为在调用 confirm 或 cancel 的时候也可能因为某种原因(比如网络延迟)导致调用失败,就需要通过重试等方式来解决,这个过程就会出现短暂的不一致。在理想情况下,如果所有参与组件都能正确执行其Try、Confirm和Cancel逻辑,并且系统之间的通信是可靠的那么TCC是可以提供强一致性的。Cancel阶段:如果任何Try操作失败,或者确认过程中遇到问题,执行Cancel操作来回滚所有的操作,释放锁定的资源。通过他这个通过精心设计的流程,你就能看得出他的设计尽可能确保数据的一致性。
2025-02-17 09:22:00
130
原创 TCC中,Confirm或者Cancel失败了怎么办?
这个方案用的是最多的,之所以可以这么做,主要是因为在Try的过程中已经锁定了资源,那么在Confirm的时候,大概率是可以成功,而如果Confirm失败就执行Cancel,就会导致可能只是因为网络原因导致的时候就使得整个事务都Cancel了,而且这时候如果Cancel再失败怎么办呢?Cancel阶段的目的是撤销在Ty阶段预留的所有盗源,确保系统回到事务开始前的状态。在Confirm失败的情况下,重要的是记录详细的错误日志和监控异常。在某些复杂或重要的事务中,如果自动化的重试和回滚失败,可能需要人工干预。
2025-02-17 09:21:37
376
原创 锁和分布式锁的核心区别是什么?
锁,我们常用的就是synchronized,ReentrantLock等,他们通常是在单个进程内起作用的同步机制,用于控制对共享资源的访问,多个线程或进程之间可以使用锁来确保对关键资源的互斥访问.所以,普通的锁主要用于单机环境,用于控制同一/M进程中多个线程对共享资源的互斥访问,而分布式锁则适用于分布式环境,用于协调多个计算机或多个进程之间对共享资源的互斥访问,确保分布式系统的一致性。这种锁,主要适用于单体应用,确保在同一M进程内多个线程同步共享资源的访问。
2025-02-13 09:41:30
217
原创 分布式ID生成方案都有哪些?
在单体应用中,我们可以通过数据库的主键!D来生成唯一的ID,但是如果数据量变大,就需要进行分库分表,在分库分表之后,如何生成一个全局唯一的ID,就是一个关键的问题。递增:根据不同的业务情况,有的会要求生成的ID呈递增趋势,也有的要求必须单调递增(后一个D必须比前一个大),也有的没有严格要求。全局唯一:必须保证全局唯一性,这个是最基本的要求。高性能&高可用:需要保证ID的生成是稳定且高效的。
2025-02-13 09:41:23
115
原创 什么是最大努力通知?
但如果由于网络问题、电子邮件服务器问题或其他原因导致通知发送失败,商城系统可能会做一些尝试,尽可能的通知,重试多次后还是不成功,则不再发夺。需要注意的是,在最大努力通知的过程中,可能会出现消息重复发送的情况,也可能会出现消息丢失的情况。因此,在设计最大努力通知系统时,需要根据实际业务需求和风险承受能力来确定最大努力通知的策略和重试次数以及对消息进行去重等处理。这个通知就可以采用最大努力通知的方式。最大努力通知这种事务实现方案,一般用在消息通知这种场景中,因为这种场景中如果存在一些不一致影响也不大。
2025-02-12 09:07:34
356
原创 什么是柔性事务?
柔性事务,是业内解决分布式事务的主要方案。所谓柔性事务,相比较与数据库事务中的ACID这种刚性事务来说,柔性事务保证的是“基本可用,最终一致。”这其实就是基于BASE理论,保证数据的最终一致性。在业内,关于柔性事务,最主要的有以下三种类型:异步确保型、补偿型、最大努力通知型。:事务完成后的一致性严格遭循;事务中的一致性可适当放宽。:并行事务间不可影响;事务中间结果可见性允许安全放宽。
2025-02-12 09:07:11
319
原创 什么是ThreadLocal,如何实现的?
比如一次用户的页面操作请求,我们可以在最开始的fiter中,把用户的信息保存在ThreadLocal中,在同一次请求中,在使用到用户信息,就可以直接到ThreadLocal中获取就可以了。ThreadLoca|存放的值是线程内共亭的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题。将此线程局部变量的当前线程副本中的值设置为指定值。返回此线程局部变量的当前线程副本中的值。返回此线程局部变量的初始值。移除此线程局部变量的值。
2025-02-11 09:09:39
139
原创 线程数设定成多少更合适?
线程数设定是个高频出现的题目,这个题目对于优秀的面试官希望得到的答案是面试者的思考过程,考察其分析线程数设定的思考方向是否全面(主要包括对操作系统线程的理解和实际设置经验)。但是,上面的公式中,前提要求是知道你的应用是I0密集型还是CPU密集型,那么,到底怎么样算10密集,怎么样又算CPU密集呢?很多时候,我们的应用部署在云服务器上面,有时候给我们分配的机器显示的是8核的,但是你要知道你实际上使用的只是虚拟机而已,并不是物理机,实际上大多数情况下不能发挥出8核的作用来。:不同的任务可能对线程数的需求不同。
2025-02-11 09:08:55
789
原创 什么是线程池,如何实现的?
线程池是池化技术的一种典型实现,所谓池化技术就是提前保存大量的盗源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。线程池,说的就是提前创建好一批线程,然后保存在线程池中,当有任务需要执行的时候,从线程池中选一个线程来执行任务。
2025-02-10 09:19:41
302
原创 run/start、wait/sleep、notify/notifyAll区别?
因为Java锁的目标是对象,而wait需要释放锁,所以针对的目标都是对象,所以把他定义在Object类中。而sleep()不需要释放锁,所以他针对的目标是线程,所以定义在Thread类中。所以,被notify0)/notifyAl()唤醒的线程,只是表示他们可以竞争锁了,竟争到锁之后才有机会被CPU调度。如果在创建好线程之后,直接调用其run方法,那么就会在单线程中直接运行run方法,不会起到多线程的效果。我们创建好线程之后,想要启动这个线程,则需要调用其start方法。,但 sleep 方法不会。
2025-02-10 09:19:15
258
原创 JDK21 中的虚拟线程是怎么回事?
在以前的JDK中,Java的线程模型其实比较简单,在大多数操作系统中,主要采用的是基于轻量级进程实现的一对一的线程模型,简单来说就是每一个ava线程对应一个操作系统中的轻量级进程,这种线程模型中的线程创建、析构及同步等动作,都需要进行系统调用。而新引入的虚拟线程,是JDK实现的轻量级线程,他可以避免上下文切换带来的的额外耗费。他的实现原理其实是JDK不再是每一个线程都一对一的对应一个操作系统的线程了,而是会将多个虚拟线程映射到少量操作系统线程中,通过有效的调度来避免那些上下文切换。
2025-02-08 08:56:40
208
原创 什么是守护线程,和普通线程有什么区别?
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)。用户线程一般用于执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务,守护线程最典型的应用就是GC(垃圾回收器)。这两种线程其实是没有什么区别的,唯一的区别就是)ava虚拟机在所有<用户线程>都结束后就会退出,而不会等<守护线程>执行完。
2025-02-07 09:15:05
226
原创 线程有几种状态,状态之间的流转是怎样的?
2.运行(RUNNABLE):Java线程中将就绪(READY)和运行中(RUNNING)两种状态笼统的称为“运行“就绪 (READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start0方法。该状态的线程位于可运行线程池中,等待被线程调度选中并分配cpu使用权运行中(RUNNING):就绪(READY)的线程获得了cpu时间片,开始执行程序代码。4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
2025-02-07 09:14:53
719
原创 什么是并发,什么是并行?
为了看起来像是“同时干多件事”,分时操作系统是把CPU的时间划分成长短基本相同的时间区间,即”时间片”,通过操作系统的管理,把这些时间片依次轮流地分配给各个用户使用。由于计算机的处理速度很快,只要时间片的间隔取得适当,那么一个用户作业从用完分配给它的一个时间片到获得下一个CPU时间片,中间有所”停顿”,但用户察觉不出来,好像整个系统全由它”独占”似的。所以,在单CPU的计算机中,我们看起来“同时干多件事”其实是通过CPU时间片技术,并发完成的。使用这些操作系统的用户是可以“同时”干多件事的。
2025-02-06 09:09:26
249
原创 能不能谈谈你对线程安全的理解?
简单来说,就是多个线程同时访问共享变量的时候,得到的结果和我们预期的一样,就是线程安全。所以有四个关键词:并发、多线程、共享变量、正确完成。这里所谓的正确完成,其实就是要满足所谓的原子性、有序性和可见性。中被调用时,能够正确地处理。之间的共享变量,使程序功能。线程安全是指某个函数在。
2025-02-06 09:09:07
70
原创 什么是多线程中的上下文切换?
在多线程编程中,上下文切换是一种常见的操作,上下文切换通常是指在一个CPU 上,由于多个线程共享 CPU时间片,当一个线程的时间片用完后,需要切换到另一个线程运行。此时需要保存当前线程的状态信息,包括程序计数器、寄存器、栈指针等,以便下次继续执行该线程时能够恢复到正确的执行状态。同时,需要将切换到的线程的状态信息恢复,以便于该线程能够正确运行。上下文切换是指 CPU 从一个线程转到另一个线程时,需要保存当前线程的上下文状态,恢复另一个线程的上下文状态,以便于下一次恢复执行该线程时能够正确地运行。
2025-02-05 09:12:23
115
原创 常见的分布式事务有哪些?
另外,还有一些分布式事务的组件,如Seata,他其实是一个开源的分布式事务解决方案,旨在为微服务架构提供高效目透明的事务管理。在讨论 Seata 的一致性特性时,需要明确其支持的不同事务模式,因为每种模式对一致性的保证不同。可靠消息实现最终一致性的方案其实就是借助支持事务消息的中间件,通过发送事务消息的方式来保证最终一致性,过程及原理可以参考——RocketMQ的事务消息是如何实现的?至于这个一致性到底是怎样的一致性,是强一致性、还是最终一致性,不同的分布式事务方案其实达到的效果并不相同。
2025-02-05 09:12:00
235
原创 什么是分布式事务?
在单机环境下,可以将这些操作放在同一个事务中,保证原子性、一致性和持久性。但在分布式环境下,可能存在多个服务(如库存服务、账户服务、订单服务)分布在不同的物理节点上,此时需要确保所有服务操作的事务都能够同步进行,避免出现数据不一致的情况。分布式事务是指在分布式系统中涉及到多个数据库或多个应用程序之间的事务处理,这些数据库或应用程序可能分布在不同的物理节点上,甚至可能位于不同的地理位置。在分布式事务中,需要确保所有参与者的事务操作都能够保持一致性,即所有参与者的事务要么全部提交成功,要么全部回滚。
2025-01-24 09:24:42
256
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人