技术杂谈
文章平均质量分 94
对细碎但却重要的知识点进行整理
Binary Oracle
一名热爱开源和技术的Coder , 开源框架spring committer , golang开源网络库netpoll committer; (脱产备战25考研中,停更一年)
展开
-
自己动手造一个状态机
大厂常用的状态机实现,还不赶紧学起来!原创 2024-01-22 17:03:28 · 1531 阅读 · 0 评论 -
GraphQL及元数据驱动架构在后端BFF中的实践
GraphQL及元数据驱动架构在后端BFF中的实践转载 2024-01-11 13:36:49 · 405 阅读 · 0 评论 -
GraphQL 在闲鱼数据聚合上的探索和实践
高效研发-闲鱼在数据聚合上的探索与实践转载 2024-01-11 00:21:59 · 309 阅读 · 0 评论 -
那些年听烂了的名词之“高可用“
那些年听烂了的名词之“高可用“原创 2024-01-22 17:03:50 · 1187 阅读 · 2 评论 -
经典限流算法设计与实现
经典限流算法转载 2023-10-26 17:18:25 · 396 阅读 · 0 评论 -
常见智力题汇总
常见智力题汇总原创 2023-11-30 23:14:54 · 388 阅读 · 0 评论 -
FastThreadLocal 快在哪里 ?
FastThreadLocal 快在哪里 ?原创 2023-10-07 22:07:36 · 478 阅读 · 0 评论 -
如何实现线程池之间的数据透传 ?
如何实现线程池之间的数据透传 ?原创 2023-09-22 21:17:30 · 634 阅读 · 0 评论 -
流量染色SDK设计的思考
流量染色SDK设计的思考原创 2023-09-21 16:37:07 · 978 阅读 · 0 评论 -
分布式多级缓存SDK设计的思考
分布式多级缓存SDK设计的思考原创 2023-09-19 23:25:41 · 623 阅读 · 2 评论 -
高性能队列——Disruptor
Disruptor通过精巧的无锁设计实现了在高并发情形下的高性能。在美团内部,很多高并发场景借鉴了Disruptor的设计,减少竞争的强度。其设计思想可以扩展到分布式场景,通过无锁设计,来提升服务性能。转载 2023-09-04 00:24:12 · 222 阅读 · 0 评论 -
海量数据处理问题归纳总结
海量数据处理问题归纳总结转载 2023-08-31 14:34:16 · 288 阅读 · 0 评论 -
设计模式之规约模式
规约模式原创 2023-05-23 23:56:50 · 468 阅读 · 0 评论 -
为什么我们需要防腐层?
为什么我们需要防腐层?转载 2023-05-21 11:47:03 · 445 阅读 · 0 评论 -
字典树(前缀树)
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种,典型应用是用于统计和排序大量相同的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是: 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓字符串的比较。有些参考书将堆直接定义为序列,但是,从逻辑结构上讲,还是将堆定义为完全二叉树更好。虽然堆的典型实现方法是数组,但从逻辑的角度上讲,堆实际上是一种树结构。Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。原创 2023-03-20 16:07:43 · 723 阅读 · 0 评论 -
innodb为什么选择B+ Tree而不是跳表,Redis为什么选择跳表而不是B+ Tree
innodb为什么选择B+ Tree而不是跳表,Redis为什么选择跳表而不是B+ Tree转载 2023-03-20 13:33:23 · 887 阅读 · 0 评论 -
C语言丨深入理解volatile关键字
volatile 常见的几个面试题volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如 果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。所以。转载 2023-03-05 13:21:34 · 2850 阅读 · 0 评论 -
高速缓存和主内存之间如何保持数据一致性
过程是这样子的:当有要写入的数据的时候,直接更新 Cache 中的数据(如果存在),同时这个这个数据所在的块(cpu是按块加载数据)会被标记成脏的,就是这个块中的数据和主内存中的是不一致的。如果要写入的块存放着别的内存地址的数据(这个时候这个 Cache 中的数据要被淘汰),再查看这个块是否标记了脏块,如果标记了就先把这个 Cache 块的数据同步到主内存中,如果没有标记成脏块,就直接更新 Cache 块,再把这个块标记成脏块!这个策略存在一个很明显的问题,就是不管缓存命中与否,都要写入到主内存中。转载 2023-03-05 11:45:10 · 826 阅读 · 0 评论 -
数据库缓存一致性问题
在上面的Cache Aside套路中,我们的应用代码需要维护两个数据存储,一个是缓存(Cache),一个是数据库(Repository)。而Read/Write Through套路是把更新数据库(Repository)的操作由缓存自己代理了,所以,对于应用层来说,就简单很多了。这时候,缓存保存的是A的数据(老数据),数据库保存的是B的数据(新数据),数据不一致了,脏数据出现啦。不管是延时双删还是Cache-Aside的先操作数据库再删除缓存,如果第二步的删除缓存失败呢,删除失败会导致脏数据哦~转载 2023-03-01 17:45:05 · 394 阅读 · 0 评论 -
HTTP协议知识体系核心重点梳理
非对称性加密存在的问题在于,在服务器将公钥通过网络通道传送给客户端的这个过程中,可能会被攻击者劫持,并向客户端发送一个伪造的公钥,从而客户端将会使用该伪造公钥对数据进行加密,并在公开信道中传输。4)客户端收到证书,校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示HTTPS警告信息,如果通过则继续;Http/1.1默认为持久连接。每个非空的数据块之前,会有一个16进制的数值,表示这个块的长度。原创 2023-02-22 19:18:25 · 1092 阅读 · 0 评论 -
TCP三次握手和四次挥手
TCP:Transmission Control Protocol翻译过来就是传输控制协议,TCP协议是一个面向连接的、可靠的、基于字节流的传输层协议RFC 793对TCP连接的定义:其大致意思是TCP连接是为了用于保证可靠性和流控制机制的,包括 Socket、序列号及窗口大小。其中Socket是由IP加端口组成的,序列号是用来解决乱序问题的,而窗口大小则是用来做流量控制的。转载 2023-02-18 23:23:04 · 246 阅读 · 0 评论 -
订单超时怎么处理?看看阿里的方案
如果对于超时精度比较高,超时时间在24小时内,且不会有峰值压力的场景,推荐使用RocketMQ的定时消息解决方案。在电商业务下,许多订单超时场景都在24小时以上,对于超时精度没有那么敏感,并且有海量订单需要批处理,推荐使用基于定时任务的跑批解决方案。转载 2023-02-16 22:10:34 · 482 阅读 · 0 评论 -
为什么我们的微服务中需要网关?
说起 Spring Cloud Gateway 的使用场景,我相信很多小伙伴都能够脱口而出认证二字,确实,在网关中完成认证操作,确实是 Gateway 的重要使用场景之一,然而并不是唯一的使用场景。在微服务中使用网关的好处可太多了,今天我们就来逐一分析一下。转载 2023-02-16 09:40:41 · 645 阅读 · 0 评论 -
微服务中的鉴权该怎么做?
所以,微服务中的认证,还是建议使用令牌的方式,可以选择 JWT 令牌,这也是目前使用较多的一种方案。但是熟悉 JWT 的小伙伴都知道,纯粹的无状态登录无法实现注销,这就很头大,所以在实际应用中,单纯的使用 JWT 是不行的,一般还是要结合 Redis 一起,将生成的 JWT 字符串在 Redis 上也保存一份,并设置过期时间,判断用户是否登录时,需要先去 Redis 上查看 JWT 字符串是否存在,存在的话再对 JWT 字符串做解析操作,如果能成功解析,就没问题,如果不能成功解析,就说明令牌不合法。转载 2023-02-15 23:28:35 · 459 阅读 · 0 评论 -
Seata分布式事务落地解决方案
Seata采用在更新前后都记录一份快照的方式,在事务一二阶段进行回滚前,通过after-image判断数据是否已经被修改了,如果是的话,那么此时记录相关异常,发送警告,通过人工介入处理。b)如果有分支事务失败,需要回滚。但是当我们把三件事情看做一个"业务",要满足保证“业务”的原子性,要么所有操作全部成功,要么全部失败,不允许出现部分成功部分失败的现象,这就是。对于已经空回滚的业务,之前被阻塞的try操作恢复,继续执行try,就永远不可能confirm或cancel ,事务一直处于中间状态,这就是。原创 2023-02-02 12:21:31 · 645 阅读 · 4 评论 -
分布式事务常见解决方案
和XA这种在资源层面实现的分布式事务,在2pc过程中一直持有资源锁,并且需要对应数据源支持XA协议不同,TCC是在业务层面实现的分布式事务,该过程中不会一直持有资源锁,但是每个微服务必须在业务层面实现try,confirm,cancel三个方法,代码侵入性高,并且相关接口还必须实现幂等性。阻塞问题: 分布式事务执行过程中,所有参与节点都是事务阻塞型的,因为需要等待所有参与者都响应后,才会继续进行下一步操作,因此阻塞时间会由最长的分支事务决定,锁定时间越长,对于数据库相关锁资源,连接资源占用也越长。原创 2023-01-31 23:12:28 · 381 阅读 · 0 评论 -
如何设计一个优惠卷系统
先考虑用户量很少的情况,商家要给所有人发站内信,则先遍历用户表,再按照用户表中的所有用户依次将站内信插入到 message 表中。所有用户登录后,首先查询 message_content 中的那些没有在 message 中有记录的数据,表示是未读的站内信。如商家创建了一批优惠券,共1000张,使用时间为2022-11-11 00:00:00 ~ 2022-11-11 23:59:59,规定只有数码类目商品才能使用,满100减50。确认执行业务操作,做真正提交,将第一步Try中冻结的资源,真正扣减。转载 2022-11-03 22:08:07 · 2174 阅读 · 3 评论 -
Java如何实现大文件分片上传,断点续传和秒传
通俗的说,你把要上传的东西上传,服务器会先做 MD5 校验,如果服务器上有同样的东西,它就直接给你个新地址,其实你下载的都是服务器上的同一个文件,想要不秒传,其实只要让 MD5 改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,你多加几个字,MD5 就变了,就不会秒传了.分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为 Part)来进行上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。原创 2022-10-30 22:09:35 · 4374 阅读 · 0 评论 -
神奇的MappedByteBuffer
MappedByteBuffer使用虚拟内存,因此分配(map)的内存大小不受JVM的-Xmx参数限制,但是也是有大小限制的。如果当文件超出1.5G限制时,可以通过position参数重新map文件后面的内容。MappedByteBuffer在处理大文件时的确性能很高,但也存在一些问题,如内存占用、文件关闭不确定,被其打开的文件只有在垃圾回收的才会被关闭,而且这个时间点是不确定的。原创 2022-10-29 11:44:33 · 1694 阅读 · 0 评论 -
Linux mmap原理
mmap是linux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数,但是并没有深入理解mmap在操作系统内部是如何实现的,原理是什么。linux段页式内存管理回顾mmap原理(一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域。原创 2022-10-29 10:56:37 · 2741 阅读 · 34 评论 -
Spring在多线程环境下如何确保事务一致性
如何实现Spring在多线程环境下的事物一致性呢?还不快学起来!!!原创 2022-10-20 21:09:55 · 10724 阅读 · 39 评论 -
字节码增强技术探索
Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以看出字节码对于Java生态的重要性。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图1所示。图1 Java运行示意图。转载 2022-10-18 17:23:48 · 282 阅读 · 0 评论 -
设计模式二三事
本文以三个实际场景为出发点,借助小明和老师两个虚拟的人物,试图以一种较为诙谐的“对话”方式来讲述设计模式的应用场景、优点和缺点。如果大家想要去系统性地了解设计模式,也可以通过市面上很多的教材进行学习,都介绍了经典的23种设计模式的结构和实现2022年3月11日。不过,很多教材的内容即便配合了大量的示例,但有时也会让人感到费解,主要原因在于:一方面,很多案例比较脱离实际的应用场景;另一方面,部分设计模式显然更适用于大型复杂的结构设计,而当其应用到简单的场景时,仿佛让代码变得更加繁琐、冗余。转载 2022-10-17 19:15:39 · 186 阅读 · 0 评论 -
设计模式在外卖营销业务中的实践
随着美团外卖业务的不断迭代与发展,外卖用户数量也在高速地增长。在这个过程中,外卖营销发挥了“中流砥柱”的作用,因为用户的快速增长离不开高效的营销策略。而由于市场环境和业务环境的多变,营销策略往往是复杂多变的,营销技术团队作为营销业务的支持部门,就需要快速高效地响应营销策略变更带来的需求变动。因此,设计并实现易于扩展和维护的营销系统,是美团外卖营销技术团队不懈追求的目标和必修的基本功。本文通过自顶向下的方式,来介绍设计模式如何帮助我们构建一套易扩展、易维护的营销系统。转载 2022-10-17 11:22:44 · 156 阅读 · 0 评论 -
Java 线程池详解
Executor框架是 Java5 之后引进的,在 Java 5 之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免 this 逃逸问题。补充:this 逃逸是指在构造函数返回之前其他线程就持有该对象的引用. 调用尚未构造完全的对象的方法可能引发令人疑惑的错误。Executor框架不仅包括了线程池的管理,还提供了线程工厂、队列以及拒绝策略等,Executor框架让并发编程变得更加简单。线程池实现类是。转载 2022-10-15 10:27:59 · 150 阅读 · 0 评论 -
图解 | 你管这破玩意叫线程池?
小宇:嗯好的,首先它的构造方法是这个样子滴{... // 省略一些参数校验}这些参数分别是:核心线程数:最大线程数:非核心线程的空闲时间:空闲时间的单位:任务队列(线程安全的阻塞队列):线程工厂:拒绝策略整个任务的提交流程是闪客:不错不错,这可是你自己总结的哟,现在还用我给你讲什么是线程池了么?小宇:啊天呢,我才发现这似乎就是我一直弄不清楚的线程池的参数和原理呢!闪客:没错,而且最后一版代码的构造方法,就是 Java 面试常考的最长的那个构造方法,参数名都没变。小宇:哇,太赞了!转载 2022-10-02 22:01:44 · 197 阅读 · 0 评论 -
你管这破玩意叫关注流
再具体的细节,假如公众号作者的发件箱是用 mysql 或 hbase 这种数据库存储的,那大 V 作者的发布文章,可以进一步放在 Redis 中存储,读者在拉取大 V 作者的数据时就变得更快了,这是更细微层面的。倘若你在架构设计中,始终能有 Trade-Off 这种思想围绕,不论是理解很多组件的设计、业务的架构,还是面试中回答面试官的问题,都会让人觉得你的思路至少是清晰的,和你的交流,是通畅的。作者就是一个个的公众号,用户就是可爱的你,而这个展示的关注流列表,就是我们手机微信上点开订阅号消息后的部分。转载 2022-09-30 23:08:25 · 216 阅读 · 0 评论 -
老板让只懂Java基本语法的我,基于AQS实现一个锁
是一个 JDK 源码中的一个。转载 2022-09-30 19:25:46 · 108 阅读 · 0 评论 -
JMM(Java 内存模型)详解
Java 是最早尝试提供内存模型的编程语言。由于早期内存模型存在一些缺陷(比如非常容易削弱编译器的优化能力),从 Java5 开始,Java 开始使用新的内存模型。一般来说,编程语言也可以直接复用操作系统层面的内存模型。不过,不同的操作系统内存模型不同。如果直接复用操作系统层面的内存模型,就可能会导致同样一套代码换了一个操作系统就无法执行了。Java 语言是跨平台的,它需要自己提供一套内存模型以屏蔽系统差异。这只是 JMM 存在的其中一个原因。转载 2022-09-29 16:30:54 · 502 阅读 · 0 评论 -
Java 并发常见面试题总结(下)
线程池为什么要用线程池?实现 Runnable 接口和 Callable 接口的区别执行 execute()方法和 submit()方法的区别是什么呢?如何创建线程池ThreadPoolExecutor 类分析`ThreadPoolExecutor`构造函数重要参数分析`ThreadPoolExecutor` 饱和策略一个简单的线程池 Demo线程池原理分析Atomic 原子类介绍一下 Atomic 原子类JUC 包中的原子类是哪 4 类?讲讲 AtomicInteger 的使用。转载 2022-09-29 14:31:44 · 260 阅读 · 0 评论