- 博客(116)
- 收藏
- 关注
原创 ShardingSphere分库分表相关
垂直分片按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。在拆分之前,一个数据库由多个数据表构成,每个表对应着不同的业务。而拆分之后,则是按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库。水平分片水平分片又称为横向拆分。相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。垂直分库在resources目录下新建配置文件,存放数据源、分片规则等配置信息。在。
2024-07-25 12:29:39 633
原创 ShardingSphere读写分离相关
考虑到业务场景的复杂性,提供基于SPI接口实现符合自己业务需要的负载均衡算法。提供了读库负载均衡算法接口,用户根据自定的算法返回一个可访问的读库。/*** @param name 读写分离逻辑数据源名称* @param writeDataSourceName 写库数据源名称* @param readDataSourceNames 读库数据源名称集合* @return 命中的读库名称*/实现/*** 配置类中的props属性* # 负载均衡算法* read: # 自定义的算法名称。
2024-07-23 14:38:52 330
原创 JVM基础与相关案例
我使用 jmap 命令,导出了一份线上堆栈,然后使用 MAT 进行分析,通过对 GC Roots 的分析,发现了一个非常大的 HashMap 对象,这个原本是其他同事做缓存用的,但是做了一个无界缓存,没有设置超时时间或者 LRU 策略,在使用上又没有重写key类对象的hashcode和equals方法,对象无法取出也直接造成了堆内存占用一直上升,后来,将这个缓存改成 guava 的 Cache,并设置了弱引用,故障就消失了。第三,由于缓存的使用,有大量的弱引用,拿一次长达 10 秒的 GC 来说。
2024-07-17 00:01:42 642
转载 JVM运行期的几种优化手段
在之前的文章中我们谈到过,相比 C/C++ 语言,Java 语言在运行效率方面要稍逊一些,因为 Java 应用程序是在虚拟机上运行,而 C/C++ 程序是直接编译成平台相应的机器码来运行程序。从虚拟机对外发布开始,开发团队一直在努力试图缩小 Java 与 C/C++ 语言在运行效率上的差距。从实际的结果来看,确实成果显著。本文就来聊聊 HotSpot 虚拟机为了提升 Java 程序的执行效率,都实现了哪些激动人心的优化技术。
2024-07-12 21:23:44 37
原创 MySQL相关
有个同学是这样写代码逻辑的。千万级别的文档对象,近10G的数据,对有索引的ID的查询 不会比mysql慢,而对非索引字段的查询,则是全面胜出。程序数据是在一个面向对象的、灵活的网络结构下,而不是严格的表中,但具备完全的事务特性、企业级的数据库的所有好处。哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。
2024-07-08 18:52:15 660
原创 分布式相关
所有数据都存储在缓存里,读服务在查询时不会再降级到数据库里,所有的请求都完全依赖缓存。主机宕机时,备机接管主机的一切工作,主机恢复正常后,以自动(热备)或手动(冷备)方式将服务切换到主机上运行,master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的。中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的。如果同步缓存失败了,被消费的 Binlog 不会被确认,下一次会重复消费,数据最终会写入缓存中;
2024-07-05 23:46:51 874
原创 高并发架构设计
高并发是指系统或应用程序在同一时间段内接收到大量并发请求的能力。具体来说,高并发环境下系统需要能够同时处理大量的请求,而不会出现性能问题或响应延迟。
2024-07-04 18:55:22 1892
原创 多线程基础
并且这种循环是链表的循环,相当于 A 节点指向 B 节点,B 节点又指回到 A 节点,这样一来,在下一次想要获取该 key 所对应的 value 的时候,便会在遍历链表的时候发生永远无法遍历结束的情况,也就发生 CPU 100% 的情况。如果需要同步的操作执行速度非常快,并且线程竞争并不激烈,这时候使用cas效率会更高,因为加锁会导致线程的上下文切换,如果上下文切换的耗时比同步操作本身更耗时,且线程对资源的竞争不激烈,使用volatiled+cas操作会是非常高效的选择;乐观锁体现的是悲观锁的反面。
2024-07-02 17:17:59 843
原创 常见 Java 代码缺陷及规避方式
问题列表NPE 或许是编程语言中最常见的问题,被 Null 的发明者托尼·霍尔(Tony Hoare)称之为十亿美元的错误。在 Java 中并没有内置的处理 Null 值的语法,但仍然存在一些相对优雅的方式能够帮助我们的规避 NPE。
2024-07-01 01:54:45 833
原创 工作中最常见的OOM问题
我们在写递归代码时,一定要考虑递归深度。很多时候,excel一次导出大量的数据,获取在程序中一次性查询的数据太多,都可能会出现这种OOM问题。如果实际工作中,出现这个问题,一般是由于创建的线程太多,或者设置的单个线程占用内存空间太大导致的。调用,如果递归的深度超过了JVM允许的最大深度,可能会出现栈内存溢出问题。是由于JVM在GC时,对象过多,导致内存溢出,建议调整GC的策略。有时候,我们的业务系统创建了太多的线程,可能会导致栈内存OOM。这个问题一般是由于加载到内存中的类太多,或者类的体积太大导致的。
2024-06-24 19:51:10 837
原创 实用 Java Streams API
它是一种特殊的收集器,允许您对另一个收集器的结果执行特殊类型的转换。该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而可能使我们避免空指针异常。在下面的示例中,我们的收集器通过首先使用索引到大写操作进行映射,然后使该映射成为不可修改的。在下面的示例中,有一个包含 null 的List。在下面的例子中,我们的种子是0,一元运算函数是 n -> n+2。在下面的示例中,我们删除小于3的元素,然后返回元素小于6的元素流。在下面的示例中,我们根据元素的字符串长度分为两个不同的组。
2024-06-24 01:24:58 438
原创 限流神器Sentinel
这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵。Sentinel 以流量为切入点,从流量控制熔断降级系统负载保护等多个维度保护服务的稳定性。丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一。
2024-06-12 16:18:29 1000
原创 lambda 之美
并且返回一个Optional对象,该对象是java8新增的类,专门为了防止null引发的空指针异常。本篇主要从实际使用讲述了常用的方法及流,使用java8可以很清晰表达你要做什么,代码也很简洁。本篇例子主要是为了讲解较为简单,大家可以去使用java8重构自己现有的代码,自行领会lambda的奥妙。本文说的Stream要组合使用才会发挥更大的功能,链式调用很迷人,根据自己的业务去做吧。我们看得reduce接收了一个初始值为0的累加器,依次取出值与累加器相加,最后累加器的值就是最终的结果。
2024-05-25 18:36:09 317
转载 ThreadLocal 搭配线程池使用造成内存泄漏的原因和解决方案
主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。和HashMap的最大的不同在于,ThreadLocalMap结构非常简单,没有next引用,也就是说ThreadLocalMap中解决Hash冲突的方式并非链表的方式,而是采用线性探测的方式。ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map的功能,其内部的Entry也独立实现。
2024-05-25 02:19:52 154
原创 性能优化思路及常用工具及手段
性能优化是降低成本的手段之一,每年大促前业务平台都会组织核心链路上的应用做性能优化,一方面提升系统性能,另外一方面对腐化的代码进行清理。现结合业务平台性能优化的经验,探讨一下性能优化的思路及常用工具及手段。性能优化本质上是对资源的合理利用,将更珍贵的资源用在更重要的业务上,从而实现资源的充分利用,资源的合理利用。性能优化的对象包括业务运行的容器、业务依赖的中间件、业务依赖的数据库存储的优化,性能优化包括两部分:一、发现需要性能优化的点;二、改造代码设计实现性能优化;
2024-05-23 14:56:01 582
原创 @Async注解没起效果的场景
而在类中直接进行方法的内部调用,在test()方法中调用async()方法,调用的是该类原对象的async方法,相当于调用了this.async()方法,而并非UserService代理类的async()方法。而@Async注解的异步功能,需要使用Spring的AOP生成UserService类的代理对象,该代理对象没法访问UserService类的private方法,因此会出现@Async注解失效的问题。有时候,我们的方法会使用static修饰,这样在调用的地方,可以直接使用类名.方法名,访问该方法了。
2024-05-11 20:24:38 825
原创 利用redis处理过期数据
但需要注意,要使用这个功能,需要确保你的Redis服务器开启了相关配置。"是一个模式匹配的主题,它可以匹配所有数据库的键过期事件。当一个键过期时,onMessage方法会被调用,你可以在这里加入你的逻辑来处理订单的超时取消。利用Redis的键过期事件功能,当订单生成时在Redis中存储一个键,设置30分钟过期,键过期时通过Redis的过期事件通知功能触发订单取消操作。在实际使用中,你可能需要根据自己的需要对代码进行相应的调整和优化。来订阅Redis的键过期事件,并指定回调方法进行处理。
2024-05-11 19:20:19 311
转载 Redis知识总结
如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发 送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量, 然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。因为跳表底层的单链表是有序的,为了维护这种有序性,在插入前需要遍历链表,找到该插入的位置,单链表遍历查找的时间复杂度是O(n),同理可得,跳表的遍历也是需要遍历索引数,所以是O(logn)。
2024-02-01 11:41:38 55
原创 MongoDB系统性能调优(持续更新)
默认情况下,cache_used超过80%将触发eviction,如果物理内存充足,建议设置足够大的cache_size,以加载全部数据,避免不必要的eviction。此时观察CPU负载,如果负载不高(相对于核数,CPU未充分利用),尝试调高此参数,能够一定程度上缓解问题,即使出现qw高,往往也是短暂的,可能下一秒恢复正常。cache_used是很关键的指标,超过80%将触发eviction,类似LRU算法,淘汰冷数据,避免cache用量持续增长。对于eviction线程,MongoDB默认配置是。
2024-01-15 17:36:02 1202
原创 kafka除了作为消息队列还能做什么?
与其之前的竞品不同,Kafka 不仅仅是一个消息队列,它还是一个适用于各种情况的开源事件流平台。Kafka 传输原始点击流数据,Flink 对其进行处理,而模型训练则消耗数据湖中的汇总数据。不同的是,指标是结构化数据,而日志是非结构化文本。例如,在下图中,事务日志被发送到 Kafka,并被 ElasticSearch、Redis 和二级数据库摄取。如上图所示,为了升级订单服务,我们更新了旧订单服务,以便从 Kafka 中消费输入,并将结果写入 ORDER Topic。如果它们完全相同,新服务就会通过测试。
2024-01-11 15:12:17 757
原创 Redis 内存淘汰策略有哪些?过期数据如何删除?
Redis 在面试中出现的概率非常大,毕竟后端项目如果用到分布式缓存的话,一般用的都是 Redis。目前,还没有出现一个能够取代 Redis 的分布式缓存解决方案。这篇文章中,我会分享几道 Redis 内存管理相关的问题,都很常见。不论是面试还是项目中用到 Redis,都能有帮助。
2024-01-10 15:23:12 1070 2
原创 如何保证分布式情况下的幂等性
幂等(idempotent、idempotence)是⼀个数学与计算机学概念,常⻅于抽象代数中。在编程中⼀个幂等操作的特点是其任意多次执⾏所产⽣的影响均与⼀次执⾏的影响相同。幂等函数,或 幂等⽅法,是指可以使⽤相同参数重复执⾏,并能获得相同结果的函数。这些函数不会影响系统状态, 也不⽤担⼼重复执⾏会对系统造成改变。例如,“setTrue()”函数就是⼀个幂等函数,⽆论多次执⾏,其结 果都是⼀样的,更复杂的操作幂等保证是利⽤唯⼀交易号(流⽔号)实现.
2023-12-19 11:13:29 478
原创 一个注解优雅的实现接口幂等性
简单来说,就是对一个接口执行重复的多次请求,与一次请求所产生的结果是相同的,听起来非常容易理解,但要真正的在系统中要始终保持这个目标,是需要很严谨的设计的,在实际的生产环境下,我们应该保证任何接口都是幂等的,而如何正确的实现幂等,就是本文要讨论的内容。比如,先请求了一次删除A的操作,但由于响应超时,又自动请求了一次删除A的操作,如果在两次请求之间,又插入了一次A,而实际上新插入的这一次A,是不应该被删除的,这就是ABA问题,不过,在大多数业务场景中,ABA问题都是可以忽略的。这样的更新就非幂等了。
2023-12-19 10:27:42 124
转载 23种经典设计模式的原理、背后的思想、应用场景
代码光“够用”是远远不够的,还要“好用”对程序员来说,除了算法,设计模式也是提升代码能力的关键技能,今天我就想跟你聊聊23种经典的设计模式。23种经典设计模式共分为3种类型,分别是创建型、结构型和行为型。今天,我们把这3种类型分成3个对应的小模块,逐一带你看一下每一种设计模式的原理、实现、设计意图和应用场景。一、创建型设计模式创建型设计模式包括:单例模式、工厂模式、建造者模式、原型模式。它主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。1...
2021-01-17 14:09:41 1234
原创 模板模式实操分享
一、介绍模板模式,顾名思义,定义一个模板,将部分逻辑以具体方法或者具体构造函数的形式实现,在抽象类中声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。模板模式涉及到三个角色: 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架; 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法; 客户角色:客户类提出使用具体类的请求; 二、示
2020-10-19 17:40:09 229
转载 详解:UML类图符号、各种关系说明以及举例
UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。 依赖**(Dependency)**:元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依
2020-08-27 17:56:11 585
原创 管理小结
总结下:1.管理者应该学会授权,而不是一味控制。更合理的做法是授权、关键节点的检查、资源支持、方向指引。2.管理者应该首先了解上级管理者的预期,而不是一味埋头苦干。尤其空降到中小公司当高管的朋友,一定先了解CEO的需求,衡量是否能满足CEO的预期。3.管理者千万别成为职场PUA,这一定会让你的团队分崩离析。4.创业公司的管理者要实现员工的梦想,毕竟大家跟着你苦哈哈的打江山,真的不容易。那些罔顾员工利益的创业者,最终都走不远。管理的道路并不平坦,甚至是充满泥泞。成为管理者的那一刻,你不
2020-08-25 14:21:01 147
原创 Spring Boot整合MongoDB
这节我们将整合Spring Boot与Mongo DB实现增删改查的功能,并且实现序列递增。Mongo DB下载地址:https://www.mongodb.com/download-center/community。Mongo DB的基本介绍和增删改查的用法可以参考我之前的文章:MongoDB shell、MongoDB文档CUD和MongoDB 文档查询。新建一个Spring Boot项目,版本为2.1.3.RELEASE,并引入如下依赖:1<dependency>2...
2020-07-22 19:59:51 512
原创 MongoDB的集群模式
概述 当前(2019-11-22) MongoDB 的稳定版为 4.2.1 MongoDB 的集群模式有三种:主从模式、副本集、分片集群。 主从模式(Master-Slave) 主从模式已过时,应该用副本集替换主从模式 从 MongoDB 3.2 开始,分片集群弃用(deprecate)主从模式作为组件 从 MongoDB 3.6 开始,弃用(deprecate)主从模式 从 MongoDB 4.0 开始,移除(remove)主从模式 URL
2020-07-15 17:53:22 855
原创 2020最新MongoDB规范
前言MongoDB是非关系型数据库的典型代表,DB-Engines Ranking 数据显示,近年来,MongoDB在 NoSQL领域一直独占鳌头。MongoDB是为快速开发互联网应用 而设计的数据库系统,其数据模型和持 久化策略就是为了构建高读/写的性能,并且可以方面的弹性拓展。随着MongoDB的普及和使用量的快 速增长,为了规范使用,便于管理和获取更高的性能,整理此文档。我们从 数据库设计规范、集合设计 规范、索引设计规范、文档设计规范、API使用规范、连接规范等方面进行阐述和要求。存储选型
2020-07-15 17:45:16 857
原创 springboot + rabbitmq 消息确认机制
这次我分享的是springboot+rabbitmq如何实现消息确认机制,以及在实际开发中的一点踩坑经验,其实整体的内容比较简单,有时候事情就是这么神奇,越是简单的东西就越容易出错。可以看到使用了RabbitMQ以后,我们的业务链路明显变长了,虽然做到了系统间的解耦,但可能造成消息丢失的场景也增加了。例如: 消息生产者 - > rabbitmq服务器(消息发送失败) rabbitmq服务器自身故障导致消息丢失 消息消费者 - > rabbitmq服务(消...
2020-07-10 14:25:38 7916 6
原创 RabbitMQ 消费端限流、TTL、死信队列
消费端限流1. 为什么要对消费端限流假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户端,会出现这样情况: 巨量的消息瞬间全部推送过来,但是我们单个客户端无法同时处理这么多数据!当数据量特别大的时候,我们对生产端限流肯定是不科学的,因为有时候并发量就是特别大,有时候并发量又特别少,我们无法约束生产端,这是用户的行为。所以我们应该对消费端限流,用于保持消费端的稳定,当消息数量激增的时候很有可能造成资源耗尽,以及影响服务的性能,...
2020-06-22 17:08:26 347
原创 java应用性能优化
1. 代码相关遇到性能问题,首先应该做的是检查否与业务代码相关——不是通过阅读代码解决问题,而是通过日志或代码,排除掉一些与业务代码相关的低级错误。性能优化的最佳位置,是应用内部。譬如,查看业务日志,检查日志内容里是否有大量的报错产生,应用层、框架层的一些性能问题,大多数都能从日志里找到端倪(日志级别设置不合理,导致线上疯狂打日志);再者,检查代码的主要逻辑,如 for 循环的...
2020-03-02 02:17:11 360
原创 性能优化
性能问题和Bug不同,后者的分析和解决思路更清晰,很多时候从应用日志(文中的应用指分布式服务下的单个节点)即可直接找到问题根源,而性能问题,其排查思路更为复杂一些。对应用进行性能优化,是一个系统性的工程,对工程师的技术广度和技术深度都有所要求。一个简单的应用,它不仅包含了应用代码本身,还和容器(虚拟机)、操作系统、存储、网络、文件系统等紧密相关,线上应用一旦出现了性能问题,需要我们从多方...
2020-02-29 01:10:03 2420
原创 数据库的分库分表
数据切分关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到 1000W 或 100G 以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定...
2020-02-26 01:36:50 544
原创 系统如何支撑高并发
一道面试题的背景引入大多数同学被问到这个问题压根儿没什么思路去回答,不知道从什么地方说起,其实本质就是没经历过一些真正有高并发系统的锤炼罢了。因为没有过相关的项目经历,所以就没法从真实的自身体会和经验中提炼出一套回答,然后系统的阐述出来自己负责过的系统如何支撑高并发的。所以,这篇文章就从这个角度切入来简单说说这个问题,用一个最简单的思路来回答,大致如何应对。...
2020-02-22 22:35:46 667
原创 SQL 注入攻击
目录 为什么要聊 SQL 注入攻击? 什么是 SQL 注入攻击? 如何进行 SQL 注入攻击? 如何防范? 常见面试题 瞎比比 为什么要聊 SQL 注入攻击?我这人有个想法,就是不管自己跳不跳槽,每年都会调个时间去面试一下,一来可以摸摸自己的底,知道自己的价值,二来也可以知道市场的环境局势。可以更好地为自己定位,能及时查缺补漏。所以半...
2020-02-22 14:40:45 596
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人