- 博客(30)
- 收藏
- 关注
原创 如何秒杀系统架构设计
还有一个问题,就是如果异步的请求失败了,怎么办?对系统来说,这些操作可以抽象为“读请求”和“写请求”,这两种热点请求的处理方式大相径庭,读请求的优化空间要大一些,而写请求的瓶颈一般都在存储层,优化的思路就是根据CAP理论做平衡,这个内容我在“减库存”一文再详细介绍。这几种方式都是无损(即不会损失用户的发出请求)的实现方案,当然还有些有损的实现方案,包括我们后面要介绍的关于稳定性的一些办法,比如限流和机器负载保护等一些强制措施也能达到削峰保护的目的,当然这都是不得已的一些措施,因此就不归类到这里了。
2024-06-10 18:21:42
895
原创 如何画系统架构图学习
第一步,明确Rank:也就是说,不要事无巨细地把一个大系统的方方面面都在一张架构图中展现出来,而应该明确你要阐述的系统所属的级别(L0~L4),然后只描述这个级别的架构信息。第三步,画出Relation:有了角色后,画出角色之间的关系,对应架构图中角色之间的连接线,不同的连接线可以代表不同的关系。第二步,画出Role:从不同的角度来分解系统,看看系统包含哪些角色,角色对应架构图中的区块、图标和节点等。第四步,最后画出Rule:挑选核心场景,画出系统角色之间如何协作来完成某项具体的业务功能,对应系统序列图。
2024-06-10 16:30:34
224
原创 算法题目学习汇总
1、二叉树前中后序遍历:https://blog.youkuaiyun.com/cm15835106905/article/details/124699173。2、输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。处理当前节点,将 prev 节点的 right 指针指向当前节点,当前节点的 left 指针指向 prev 节点。中序遍历: 使用递归的方式遍历二叉搜索树。head 用于记录转换后的双向链表的头节点。prev 用于记录当前节点的前一个节点。更新 prev 节点为当前节点。
2024-06-10 16:26:40
361
原创 integer对象加锁,导致失败
volatile 只能保证变量的可见性,即当一个线程修改了这个变量,其他线程可以立即看到它的变化,但不能保证复合操作(如自减操作)的原子性。这意味着在 ticket-- 操作中,多个线程可能会看到相同的 ticket 值,从而导致重复处理的问题。每次 ticket 的减一操作都会生成一个新的 Integer 对象,因此 synchronized 的锁对象在每次循环中可能都是不同的,这样会导致多个线程并发地访问这块代码,无法达到同步的目的。使用一个单独的锁对象来同步,而不是使用 ticket。
2024-06-05 17:01:41
327
原创 并发线上问题case
在 Java 8 中,parallelStream 通过 ForkJoinPool 来实现并行流的处理。默认情况下,ForkJoinPool中的公共线程池(common pool)用于并行流的任务执行。ForkJoinPool.commonPool():这是一个公共的、共享的线程池,默认情况下由所有并行流共享使用。ConcurrentHashMap 是线程安全的实现,它在并发环境下使用分段锁来实现高效的并发访问。注意:Java 8 中的 parallelStream 是使用自带的线程池来执行并行操作的。
2024-06-04 20:17:21
142
原创 多媒体实用工具
生成雪碧图:https://www.toptal.com/developers/css/sprite-generator。webp格式转png:https://converter.11zon.com/zh-cn/webp-to-png。mp4转mp3:https://www.aconvert.com/cn/audio/mp4-to-mp3/抽帧工具:https://www.bytedig.com/web/video-frame。小美听写:https://tingxie.sankuai.com/home。
2024-06-03 15:54:39
732
原创 sql死锁分析
首先,在RR的事务隔离级别下,insert on duplicate key这个sql与普通insert只插入意向锁和记录锁不同,insert on duplicate key sql如果没有找到对应的会在唯一键上插入gap lock和插入意向锁(如果有对应记录则会获取next key lock,next key lock 比gap lock多了一个边缘的记录锁)。1、事务a更新id=1记录,事务b更新id=2记录,事务a更新id=2记录事务b更新id=1记录,立刻发生死锁,同样是abba场景。
2024-06-02 20:25:36
1175
原创 常用系统命令/参数/工具统计
git rebase 会试图修改你已经commit的东西,比如覆盖commit的历史等,但是不能使用rebase来修改已经push过的内容,容易出现兼容性问题。git rebase是复位基底的意思,gitmerge会生成一个新的节点,之前的提交会分开显示,而rebase操作不会生成新的操作,将两个分支融合成一个线性的提交。git reset 不修改commit相关的东西,只会去修改.git目录下的东西。3、git merge和 git rebase区别。1、git rebase和git reset区别。
2024-06-02 10:51:06
264
原创 系统运维和监控
4、面向用户的功能,经常上线更改,并且客户端种类繁多,如何监控该功能是否正常。1、线上系统出现fullgc,如何进行排查。2、线上系统频繁fullgc,如何进行排查。3、一般系统监控那些指标。
2024-06-01 21:14:01
115
原创 个人软实力面试题目
设计模式之间的结合,例如策略模式+简单工厂模式的实践 设计模式的性能,例如单例模式哪种性能更好。说说你在项目中遇到感觉最难Bug,怎么解决的 说说你在项目中遇到印象最深困难,怎么解决的。介绍下工作中的一个对自己最有价值的项目,以及在这个过程中的角色。说说你在项目中使用过的 UML 图 你如何考虑组件化。说说你对敏捷开发的实践 说说你对开发运维的实践。说说你认为的架构师是什么样的,架构师主要做什么。说说你在项目中经常遇到的 Exception。4、说说你在项目中如何进行性能调优。说说你对非功能性需求的理解。
2024-06-01 21:00:01
264
原创 重点学习文章收集汇总
redis数据类型:https://www.runoob.com/redis/redis-data-types.html https://www.cnblogs.com/chenpingzhao/p/6965164.html。
2024-06-01 20:52:57
769
原创 java重要面试题集锦-date1
总的来说,finalize()方法的目的是为了在对象被回收前进行一些清理工作,但它存在不确定性和低效率的问题。二次探测法的优点是可以避免出现"聚集"的情况,因为它探测的步长会随着探测次数的增多而增大,所以每个位置都有 相同的概率被探测到。低效率 由于finalize()方法的调用是不确定的,而且会对垃圾回收器的效率产生负面影响,因此在Java 9之后,finalize()方法已被标记为过时(deprecated)。不确定性 垃圾回收器何时调用finalize()方法是不确定的,这取决于垃圾回收算法的实现。
2024-06-01 14:46:42
1675
原创 netty学习之路
与传统的 HTTP 长轮询(Long Polling)或服务器发送事件(Server-Sent Events)相比,WebSocket 提供了更高效、更灵活的通信机制,因为它不需要频繁地建立和关闭连接,也没有同源策略的限制。这种状态信息可能是用来追踪连接的状态,处理分段接收的数据,或者维护一些用于处理逻辑的变量。的并发访问是安全的。这个队列确保了事件的处理顺序,并且由于事件是在单个线程中被处理,因此不会发生并发执行的情况。应该是无状态的,除非它们的状态是只读的,或者使用了适当的同步机制。
2024-05-04 17:34:14
522
1
原创 网络io拷贝次数
在理想情况下,使用 Netty 的零拷贝技术,数据可以直接从发送源(如文件系统)传输到网络接口,而无需在用户空间和内核空间之间进行拷贝。总的来说,在传统的网络 I/O 操作中,数据至少会被拷贝两次:一次是从内核空间到用户空间,另一次是从用户空间回到内核空间。Netty 利用了操作系统提供的零拷贝(Zero-Copy)功能来减少数据在内核空间和用户空间之间的拷贝次数,以及在网络传输过程中的拷贝次数。在传统的网络 I/O 操作中,数据通常经历多次拷贝,这些拷贝操作发生在操作系统内核空间和用户空间之间。
2024-05-03 16:00:58
541
原创 垂直拆分与水平拆分
假设有一个用户表,包含数百万用户的数据。例如,用户 ID 从 1 到 10000 的用户存储在分片 1,用户 ID 从 10001 到 20000 的用户存储在分片 2,以此类推。通过将表中的列分离到不同的表中,可以减少单个查询的I/O负载,提高查询性能,并且可以单独优化和扩展高访问量的数据。通过垂直拆分,可以将用户的登录信息(如用户名和密码)存储在一个表中,而用户的个人信息(如电子邮件和头像)存储在另一个表中。在实际应用中,水平拆分和垂直拆分可以单独使用,也可以结合使用,以满足不同的性能和可扩展性需求。
2024-04-05 16:40:22
770
1
原创 对象字段比较工具方法
当两个对象有多个字段需要逐个比较时,为了避免使用多个if分支进行比较,需要使用工具类进行包装,减少代码开发量。方案二:org.springframework.beans.BeanWrapperImpl工具。方案一:ObjectMapper工具。
2024-04-04 17:30:30
328
1
原创 实函数和虚函数区别
在 Java 中,所有非静态方法默认都是虚函数,因为它们可以被子类覆盖(override),但是 Java 语言规范通常不会使用“虚函数”这个术语。在 Java 中,所有的非静态方法都具有虚函数的特性,因为它们都可以被子类覆盖(override),这是 Java 的多态性的一部分。性能:虚函数可能会引入额外的运行时开销(虚函数表查找),而实函数通常有更好的性能,因为函数调用可以在编译时就确定下来。覆盖:虚函数可以在派生类中被覆盖以提供特定的实现,而实函数在派生类中不会被动态绑定。
2024-03-31 15:28:15
962
1
原创 mybatis的guava内存溢出
但是,除非你的程序内存泄漏特别明显或者你正好在生成hprof文件之前复现了程序的内存泄漏场景,你才可能通过这个界面猜到程序出问题的地方,一句话就是比较看运气。在分页查询的时候,会缓存执行总条数,因为使用了CacheKey做Key,所以对于不同的SQL,如sql参数数量、顺序等等,都不会命中,而且是永久性缓存,所以导致内存被占用无法回收。可以定位是该位置问题导致。oldgen的区域内存一致持续不变,而另外一台机器的内存是持续在增长,结合上面的gc在频繁发生,可以分析,产生了old区发生了内存泄漏。
2024-03-16 15:11:01
1696
1
原创 元空间GC
对我们的业务使用场景,ScriptEngineManager使用是当做局部变量使用,所以对于缓存的动态编译的class,在后续的调用中不会再次被使用,每次代码执行都会创建一个新的ScriptEngine,都会创建一个ClassLoader及动态编译、加载一个Class,所以会产生大量的Klass对象,回收导致大量元数据区的内存碎片,频繁触发full gc,最终导致metaspace oom。④每一个类加载器的存储区域都称作一个元空间,当一个类加载器被垃圾回收器标记为不再存活,其对应的元空间会被回收。
2024-03-16 14:56:46
1453
1
原创 spring框架保证一次事务只使用一个连接池
通过这种机制,Spring 确保了即使一个事务中有对多个表的操作,也仅使用一个数据库连接,从而保证了事务的一致性和原子性。这也意味着,如果事务中的任何一个操作失败,整个事务都会被回滚,所有的更改都不会被保存到数据库中。当在一个事务中涉及多个表的操作时,Spring 保证使用同一个数据库连接来执行这些操作,从而确保事务的原子性。:当事务方法执行完成后,Spring 会处理事务的提交或回滚,并将数据库连接返回给连接池,同时清理与当前线程关联的事务信息。:在事务范围内,当你执行数据库操作时(如使用。
2024-03-16 14:54:02
536
1
原创 架构师方法论
https://www.w3cschool.cn/architectroad/architectroad-dns-polling.html
2024-01-14 16:24:29
327
1
原创 热部署相关参考文档
10:Dcevm简介 https://ssw.jku.at/Research/Papers/Wuerthinger10a/Wuerthinger10a.pdf。11:字节码增强技术探索 https://tech.meituan.com/2019/09/05/java-bytecode-enhancement.html。3:Spring Ioc源码解析 https://blog.youkuaiyun.com/zhanyu1/article/details/83023854。
2023-12-03 14:34:14
32
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人