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

原创 【MySQL】 MRR
MRR,全称「Multi-Range Read Optimization」。先来了解下回表,回表是指,InnoDB在普通索引a上查到主键id的值后,再根据一个个主键id的值到主键索引上去查整行数据的过程。我们知道二级索引是有回表的过程的,由于二级索引上引用的主键值不一定是有序的,因此就有可能造成大量的随机 IO,如果回表前把主键值给它排一下序,那么在回表的时候就可以用顺序 IO 取代原本的随机 IO。简单说:MRR 通过把「随机磁盘读」,转化为「顺序磁盘读」,从而提高了索引查询的性能。
2022-09-12 21:28:10
886
3

原创 【MQ】Kafka如何保证幂等性
文章目录幂等性要解决的问题?Kafka 是怎么保证幂等性的?开启幂等性配置Kafka幂等性的局限性事务kafka默认情况下,提供的是至少一次的可靠性保障。即broker保障已提交的消息的发送,但是遇上某些意外情况,如:网络抖动,超时等问题,导致Producer没有收到broker返回的数据ack,则Producer会继续重试发送消息,从而导致消息重复发送。如果我们禁止Producer的失败重试发送功能,消息要么写入成功,要么写入失败,但绝不会重复发送。这样就是最多一次的消息保障模式。但对于消息组件,
2022-05-03 22:30:11
4722

原创 【线上问题排查】内存泄漏排查(模拟真实环境)
文章目录内存泄漏什么是内存泄漏?模拟内存泄漏排查过程内存泄漏什么是内存泄漏?内存泄露 Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。Memory Leak会最终会导致Out Of Memory!模拟内存泄漏写一段 ThreadLocal 模拟内存泄漏的代码。/** * <p> * 模拟ThreadLocal内存泄露导致OOM * JVM启动参数 -Xms20M -
2022-04-10 13:37:02
3170

原创 【Redis】Redis内存碎片和Pipeline管道
文章目录内存碎片内存碎片如何产生的?内存分配器怎么看是否有内存碎片?碎片率的意义?清理内存碎片低于4.0-RC3版本的Redis高于4.0-RC3版本的RedisPipeline管道为什么需要Pipeline原生批命令(mset, mget)与Pipeline对比Pipeline的优缺点一些疑问相关代码内存碎片内存碎片如何产生的?Redis内部有自己的内存分配器,默认是jemalloc,为了提高内存使用的效率,来对内存的申请和释放进行管理。而内存分配器按照固定大小分配内存,并不是完全按照程序申请
2022-03-19 16:52:32
621

原创 【大数据】亿级数据中判断一个数是否存在
文章目录问题描述解决方案BloomFilter(布隆过滤器)fpp布隆过滤器的特点布隆过滤器中的数据可不可以删除布隆过滤器应该设计为多大?布隆过滤器应该使用多少个哈希函数?布隆过滤器的时间复杂度和空间复杂度?Guava的布隆过滤器的实现BitMap问题描述在开发过程中,经常要判断一个元素是否在一个集合中。假设你现在要给项目添加IP黑名单功能,此时你手上有大约 1亿个恶意IP的数据集,有一个IP发起请求,你如何判断这个IP在不在你的黑名单中?类似这种问题用Java自己的Collection和Map很
2022-03-05 16:08:05
2397

原创 【并发】高并发下库存超卖问题如何解决?
文章目录出现场景解决方案数据库设置字段为无符号型悲观锁乐观锁通过redis队列解决分布式锁+分段缓存(推荐方案)Redis原子操作(Redis incr)+乐观锁LUA脚本保持库存原子性出现场景在并发的场景下,比如商城售卖商品中,一件商品的销售数量>库存数量的问题,称为超卖问题。主要原因是在并发场景下,请求几乎同时到达,对库存资源进行竞争,由于没有适当的并发控制策略导致的错误。例如简单的下单操作,通常我们会按照如下写法public ServerResponse createOrder(Integ
2022-03-01 23:25:08
2835
1

原创 【RabbitMQ】RabbitMQ如何做到保证消息100%不丢失?
文章目录写在前面如何保证消息100%不丢失生产端可靠性投递事务消息机制confirm消息确认机制消息持久化消息入库消费端可靠性投递ACK机制改为手动SpringBoot 提供的消息重试项目中使用RabbitMQ来作为消息队列,遇见过消息丢失的情况,特此记录一下。写在前面先来说下MQTT协议中的3种语义,这个非常重要。在MQTT协议中,给出了三种传递消息时能够提供的服务质量标准,这三种服务质量从低到高依次是:At most once:至多一次。消息在传递时,最多会被送达一次。也就是说,没什么消
2022-02-24 21:48:35
4542

原创 一文搞懂策略模式(优化策略模式完全消除if else)
注重版权,转载请注明原作者和原文链接作者:码农BookSea原文链接:https://blog.csdn.net/bookssea/article/details/107309591先看后赞,养成习惯。点赞收藏,人生辉煌。文章目录前言一、策略模式介绍二、策略模式应用(消除 if else)三、如何对策略模式进行优化总结前言策略模式是设计模式里面比较简单的设计模式,其特点简单又实用,是我最喜欢的模式之一。当初学策略模式是因为听说策略模式可以用来消除 if else语句。多重条件语句.
2021-05-19 22:32:48
1294
3
原创 【Redis】Redis类型(type)与编码(encoding)
Redis是一款开源的高性能key-value数据库,广泛应用于各种场景。在Redis中,数据类型(type)和编码(encoding)是非常重要的概念。本篇博客将详细介绍Redis支持的数据类型以及相应的编码方式和底层实现原理。
2023-03-20 15:51:30
219
原创 【Java】使用Optional优雅避免空指针异常
空指针异常(NullPointerException)可以说是Java程序员最容易遇到的问题了,影响说大不大,说小也不小。为了解决这个问题,Java 8 版本中推出了 Optional 类。Optional 类是一个容器对象,它可以包含或不包含非空值。使用 Optional 类可以有效地避免空指针异常的问题。在本篇博客中,我将向大家介绍 JDK Optional 类及其使用方法。
2023-03-20 15:32:00
136
原创 本地缓存无冕之王Caffeine Cache
这篇文章来介绍一个本地缓存框架:Caffeine Cache。被称为现代缓存之王。Spring Boot 1.x版本中的默认本地缓存是Guava Cache。在 Spring5 (SpringBoot 2.x) 后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件,这对于Caffeine来说是一个很大的肯定。
2023-02-25 20:25:16
236
原创 高并发系统设计之限流
这篇文章来讲讲限流,在高并发系统中限流是必不可少的,限流可以保证一部分的请求得到正常的响应,是一种自我保护的措施。限流可以保证使用有限的资源提供最大化的服务能力,按照预期流量提供服务,超过的部分将会拒绝服务、排队或等待、降级等处理。
2023-02-23 19:22:48
218
原创 高并发系统设计之负载均衡
当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台、几十台、几百台。此时我们就需要负载均衡,进行流量的转发。下面介绍几种负载均衡的方案。
2023-02-20 16:48:26
754
原创 线程私有变量ThreadLocal详解
我们从Thread类讲起,在 Thread类中有维护两个ThreadLocal.ThreadLocalMap对象,分别是:threadLocals和inheritableThreadLocals。
2023-02-14 17:58:32
350
原创 垃圾收集器必问系列—ZGC
ZGC有人称它为Zero GC,其实“Z”并非什么专业名词的缩写,这款收集器的名字就叫作Z Garbage Collector。根据OpenJDK官方网站的说明ZGC其实并没有什么特殊意义,就是一个名字而已。起初只是为了致敬ZFS 文件系统,表示ZGC与ZFS一样都是革命性的,是一个跨时代的产品。更像是一种崇拜命名法。所以ZGC就是要做革命性的与以往的垃圾回收器性能上有很大提高的GC
2023-01-29 08:42:59
197
原创 垃圾收集器必问系列—G1
Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式
2023-01-29 08:41:48
190
原创 垃圾收集器必问系列—CMS
CMS收集器是HotSpot虚拟机追求低停顿的第一次成功尝试,CMS 可以说是垃圾回收器的一个里程碑,其开启了 GC 回收器关注 GC 停顿时间的历史
2023-01-29 08:40:00
327
原创 聊聊GC是如何快速枚举根节点的
HotSpot使用的是可达性分析算法,该算法需要进行根节点枚举,查找根节点枚举的过程要做到高效并非一件容易的事情,现在Java应用越做越庞大,光是方法区的大小就常有数百上千兆,若要逐个检查以这里为起源的引用肯定得消耗不少时间。
2023-01-29 08:36:03
323
原创 面试官:JVM是如何判定对象已死的?
在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。
2023-01-29 08:33:51
3637
3
原创 【MQ】Kafka如何保证消息不丢失
文章目录Producer端保证消息不丢失Consumer端保证消息不丢失Broker端保证消息不丢失总结Producer端Consume端Broker端没时间的朋友建议直接看总结Kafka存在丢消息的问题,消息丢失会发生在Broker,Producer和Consumer三种。Producer端保证消息不丢失为了提升效率,减少IO,producer在发送数据时可以将多个请求进行合并后发送。被合并的请求发送之前缓存在本地buffer中。但是,buffer中的数据是危险的。一旦producer被
2022-05-03 12:30:14
1260
原创 【高并发】秒杀系统设计思路
文章目录秒杀场景的特点设计思路秒杀系统,就是在一个很短的时间内面对巨大的请求流量。秒杀场景的特点同一时间同时进行抢购,网站瞬时访问流量激增。访问请求数量远远大于库存数量,但是只有少部分用户能够秒杀成功。秒杀业务流程比较简单,一般就是下订单减库存设计思路数据预处理。系统启动时将商品信息存到缓存中,并用唯一id进行标识,将后续逻辑精简为维护用户与ID的关系。在秒杀之前,比如上午十点开始秒杀,很多用户可能在九点五十左右就开始访问自己心仪的秒杀商品,这样就会出现在秒杀之前用很多的并发量,所以
2022-04-30 22:44:07
1193
原创 【分布式】分布式事务基础概念(2PC,3PC,TCC)
文章目录XA协议两阶段提交协议(2PC)2PC 过程准备阶段提交阶段2PC总结三阶段提交协议(3PC)3PC过程阶段一 CanCommit阶段二 PreCommit阶段三 DoCommit3PC总结TCC(Try-Confirm-Cancel)流程设计要点TCC总结XA协议在讲分布式事务之前,必然需要先了解XA协议。XA是一个协议,由Oracle Tuxedo系统提出的XA分布式事务协议。XA协议定义了分布式事务参与方的两个角色:事务协调者(TM=Transaction Manager)资源管
2022-04-23 11:38:01
1021
原创 【计算机操作系统】高性能的奥秘——零拷贝
文章目录DMA技术的出现传统I/O存在的问题虚拟内存如何实现零拷贝mmap + writesendfile 方式带有 scatter/gather 的 sendfile方式splice 方式PageCache总结DMA技术的出现在没有 DMA 技术前,I/O 的过程是这样的:CPU 发出对应的指令给磁盘控制器,然后返回;磁盘控制器收到指令后,于是就开始准备数据,会把数据放入到磁盘控制器的内部缓冲区中,然后产生一个中断;CPU收到中断信号后,停下手头的工作,接着把磁盘控制器的缓冲区的数据一次一
2022-03-20 19:03:41
2803
1
原创 【Redis】Redis主从架构和哨兵模式
文章目录主从架构为什么需要Redis主从架构?搭建主从架构(一主二从)主从一致原理复制积压缓冲区全量复制增量复制在主从架构中出现了宕机的情况为什么主从库之间的复制不使用 AOF?哨兵模式哨兵节点通信主观下线和客观下线选举规则哨兵模式搭建主从架构为什么需要Redis主从架构?Redis 单点架构有以下问题造成服务雪崩:高并发场景下,Redis 单点故障了,导致请求到 Redis后都返回错误,或者请求都到数据库了,造成服务雪崩,这是不能接受的。不能进行快速转移:线上系统,Redis 单点故障了
2022-03-13 23:36:05
4561
原创 【项目场景】如何保证接口的幂等性?
文章目录什么是幂等性?什么情况会发生幂等性问题幂等性的解决方案唯一索引乐观锁悲观锁建防重表分布式锁状态机token机制具体实现步骤什么是幂等性?幂等性:任意多次执行所产生的影响均与一次执行的影响相同幂等性用在接口上可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统无法承受的损失,所以必须阻止这种现象的发生。比如下面这些情况,如果没有实现接口幂等性会有很严重的后果:支付接口,重复支付会导致多次扣钱订单接口,同一个订单可能会多次创
2022-02-26 20:08:55
2059
原创 【Redis】Redis跟MySQL的双写问题解决方案
文章目录写在前面三种读写缓存策略Cache-Aside Pattern(旁路缓存模式)Read-Through/Write-Through(读写穿透)Write Behind Pattern(异步缓存写入)旁路缓存模式解析Cache Aside Pattern 的一些疑问Cache Aside Pattern 的缺陷项目中有遇到这个问题,跟MySQL中的数据不一致,研究一番发现这里面细节并不简单,特此记录一下。写在前面严格意义上任何非原子操作都不可能保证一致性,除非用阻塞读写实现强一致性,所以缓存
2022-02-23 13:56:25
884
1
转载 @value注解怎么在静态变量上面使用
https://blog.csdn.net/wsjzzcbq/article/details/104737232
2022-02-16 16:38:32
265
原创 设计模式学习笔记(4)——适配器模式
文章目录为什么要用适配器模式?写法为什么要用适配器模式?可以把一个类的接口变换成客户端所期待的另一种接口,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。说白了就是为了让类之间能够一起工作,多增加了一个适配器类,解决兼容问题。写法采用对象适配器写法//目标接口public interface Target { void request();}//原有类public class ConcreteTarget implements Ta
2022-02-13 21:12:09
1308
原创 设计模式学习笔记(3)——观察者模式
文章目录为什么要用观察者模式?写法为什么要用观察者模式?当对一个对象的改变需要同时改变其它对象,而且并不知道具体有多少个对象待改变。举个例子:博客更新文章时,有哪些地方需要同步更新?1. 个人文章统计总数+12. 个人积分数+n3. 关注者消息推送+14. 分类推送添加..如果这些更新需要以插件形式加载或移除,就可以利用观察者模式。也就是后期再增加或移除相关功能模块,不需要太多工作。写法观察者模式自己写的话比较复杂,我们有现成的可以用就尽量不要重复造轮子。主要有2种实现方式:Gu
2022-02-10 19:44:30
383
转载 Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑
Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑
2022-02-10 09:53:44
348
转载 Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入失败的问题
【小家Spring】Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入失败的问题
2022-02-10 09:51:49
460
原创 设计模式学习笔记(2)——策略模式
文章目录为什么要用策略模式?写法为什么要用策略模式?多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如if…else 语句、switch…case 语句。写法标准的策略模式的写法,存在一些问题。这里直接上我觉得最优的策略模式的写法。public interface Test { void print(String name);}//实现类A@Service("testA")public class TestA implements Test{ @Over
2022-02-10 08:59:50
360
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人