自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 springboot配置扫描生效顺序

在多文件,多profile环境下,配置信息扫描加载顺序为「同一个文件,从上到下-》遇到include,递归扫描加载-〉spring.profiles.active多个环境,从左到右依次扫描加载」,后加载的总是覆盖先加载的。

2024-07-07 19:24:23 876

原创 什么时候考虑将mysql数据迁移到ES?

在模糊的影响中,ES查询效率高,尤其是最近组内在推慢sql治理,看到有些单张表已经存在索引数量近10个,表中字段确实比较多,一种治理方式是宽表拆分多个表,降低每个表查询的字段,每个表需要创建和维护索引数量也会降低。也在考虑是不是可以将数据同步到ES,部分查询场景走ES,宽表拆分导致数据比较分散,更新和查询起来更麻烦,使用ES数据完整性可以保证,相同数据使用不同的存储介质进行存储,更新和维护相比来说更简单。

2024-07-06 23:49:42 813 5

原创 接口请求网关超时排查和引发的思考

还以问题API为例:https://profile.noodles.com/user-mail-pub/api/user-mail/user-trash-mails,在API中profile.noodles.com为一级域名,公司从DNS厂商购买所得,首先根据一级域名,确定能够确定属于哪个公司,公司内部维护一个Web服务配置(例如Nginx、API网关),里面改请求要映射到的具体服务。一级域名mail.noodles.com下增加user-mail-pub。

2024-06-30 17:00:57 282

原创 酒店预定系统

酒店预定系统本身设计过程中会遇到售卖系统两个常见问题,第一个同一个房间同一日期被多个订单预定,或者预定和库存数据不一致,这些都会涉及到金钱,需要在系统涉及是被重点考虑。

2024-06-24 00:03:54 290

原创 记一次线上jVM调优

观察cpu使用率,峰值也在30%一下,应该不是cpu的影响,本身服务也确定不是计算密集型,符合认知,那就是可能是内存不够,内存不足,GC时STW单次时间过长或者频率过高,进而导致向外提供rpc超时,第一直觉是直接扩内存,直接翻倍,增加到16G,观察一天,依然有很多调用超时,并且对应超时时间短,内存占用率会有所波动,怀疑是有一些大对象,导致业务高峰期内存占用率过高,GC压力过大,GC的STW增加。40g,降本方向主要为减少实例数和CPU数,参考的一个标准是近7日cpu的一个使用率调整到30%。

2024-06-18 00:25:21 1046

原创 ChatGPT技术演进简介

chatGPT(chat generative pre-train transformer, 可以对话的预训练trasformer模型),目的:1、了解下chatGPT为什么突然火了2、了解下GPT 1.0、2.0、3.0、3.5 、4和4o区别和特性,只要在时间场景中对模型进行选择3、了解下未来大模型可能的演进方向和可能优化的点。

2024-05-21 09:50:13 255

原创 实时聊天系统设计

设计一个聊天系统最主要是保证消息能够及时可靠的从一端传入到另外一端,同时要支持对历史消息的查看。按照同时聊天人数聊天系统可以分,一对一(one on one)和群聊(group chat),按照消息传递的及时性,可以分为实时发送(real-time message)和延迟发送(delay message),当发送者和接收者都在线,希望消息能够实时发送,当接受者不在线,需要将消息先保存起来,等接收者上线之后再发送。可以将这两个分类角度进行结合,分析设计时需要考虑的点。

2024-05-05 22:51:43 447

原创 美团KV存储squirrel和Celler学习

Gossip协议是分布式环境中节点之间信息交换的算法,使用过程要考虑如何避免循环传递,例如使用版本号和时间戳,分布式Id或者设置生存时间。工作原理,每个节点定期与周围节点交换信息,信息交换可以是单向,也可以是双向,每次选择交换节点事随机选取的,每次交换信息后会更新自身信息,并将更新信息在后续交换中传播。优点、去中心化,扩展性强,因为每次只用和部分节点进行交换,即使在大的分布式环境中依然可以使用,容错性高,即使某个节点出现故障,整个集群的消息依然可以保持正常交流。

2024-05-04 14:27:51 1309

原创 复杂prompt组成

为了能够让gpt能精准回复,一是将问题尽可能描述清楚,帮助gpt理解问题,二是给出一些有效的筛选条件,帮助gpt去从海量知识中筛选可能用到的知识。对应以上两点也是一个好的prompt需要包含的内容,对应这两点进行细化可以得到通用prompt的组成。给出一个具体的数据结果,保证对gpt对输出格式说明理解不明确的情况下依然可以严格按照用户希望的格式输出结果。告诉正常思维可以这么想,但是不希望这么想的事,对一些两可的事情进行一些特殊限制。gpt是以什么样的视角思考提问,圈定需要调用的领域知识和思考问题范围。

2024-04-28 23:12:35 869

原创 key-value系统设计

一个key-value存储属于非关系型存储,为了保证高效的存储和读取,功能可以尽可能简单,主要的两个功能点put(key,value)/get(key),一个高可用和易扩展的k-v系统应该具备一下特点。

2024-04-15 22:35:18 830

原创 动态消息系统设计

1、对于单个用户来说,为了能够缩短自己查看内容的RT,当自己正在follewing的人创建一个post,应该在自己的feed流中插入一条post,对于有千万粉丝的大V来说,当自己发送一条post的时候,为了能够快速对所有自己关注的用户生成一个post,需要做热key处理吗,还是多线程就可以处理。针对极端场景,例如一个用户关注100w人,这100w人都是大v,实时生成自己的new feed流需要大量的过滤和计算,确实会比较耗时,可以考虑加入缓存、采取预生成策略和分页查询,会一定程度增加系统整体复杂度。

2024-04-15 21:53:37 417

原创 设计一个通知系统

比如设置了拒收,设置了拒收就不发送,可以通过thrid parth取尝试获取,如果可以精确获取到,存储一份可以避免无效信息的发送,减少第三方发送消息的费用。2、根据业务场景对消息发送进行幂等(message log)3、除了考虑通知系统的承载能力,进行水平扩展,更要考虑第三方服务有限流(mq),有失败重试机制(mq),保证通知最终能够触动到用户端。设计的系统支持不同类型消息的发送,例如push消息,sms消息和邮箱消息,能够支持千万级别的发送,保证消息推送的幂等性。对消息进行统一管理,统一发送消息格式。

2024-04-14 18:30:32 244

原创 一致性hash

为了快速将一个请求和对应服务器映射上,通常采用hash映射,hash空间的数量大于服务器数量情况下,服务器和hash空间是个一对多的关系,负载均衡问题转化为如何保证服务器和hash空间均匀分配,并且这种关系可以随着服务器数量变化自动动态调整,就有了hash环,hash环上有N个空间,并且将服务器均匀放在指定hash环上某一个位置上,对一个请求,首先计算请求请求在hash环上位置,然后顺时针查找第一遇到服务器即为要接收请求的服务器。

2024-03-21 01:11:17 382

原创 限流算法和实现

限流是控制通过的速度,在不同场景中含义略有不同,在网络传输中,限流是控制流量的速度,在http请求或者api调用中,限流指一段时间内允许请求的次数。在自己实现一个限流组件时,需要考虑限流场景,根据自己的需求制定限流规则,选择适合的限流算法,同时对限流情况进行监控,在可能的情况下,优先对自己的服务进行治理,尽量不限制客户端的请求。将时间线划分成固定的大小的时间间隔,每个间隔设定要处理请求的数量,没达到时间间隔内请求阈值,请求会被处理,超过阈值,会被限流。在滚动窗口过程中,不会出现单位时间内请求超过阈值。

2024-03-21 01:10:05 342

原创 Spring Boot中Web类型

Spring Boot中Web类型指的是什么?什么是WebMvc和WebFlux?Spring5.x之后为什么要引入WebFlux?springBoot内部是如何推理确定当前服务的Web类型?Spring boot中Web类型指的是webMvc、WebFlux和None三种类型。

2023-12-14 00:19:41 233

原创 spring.profiles生效顺序

相同配置项生效顺序遵循了就近原则,后加载覆盖之前加载的配置项。

2023-10-21 13:01:29 538

原创 Lock用法和加锁原理

note: 1)加锁语句lock.lock();catch语句中发生的,这两个部分可能发生的异常不影响finally执行。synchronized同步机制是依赖JVM实现,Lock主要依赖抽象队列同步器(AbstractQueuedSynchronier,AQS)实现的,AQS是一个双向链表,使用一个整型变量state表示对共享区域的加锁状态,对于每个尝试访问临界区的线程都会被封装成双向链表中的一个节点,主要通过tryacquired获取临界区访问权,通过tryrelease释放临界区访问权。

2023-05-09 22:45:35 498 1

原创 synchronized用法加锁原理

由于方法没有设置锁,两个线程都可以进入方法内,线程A进入代码块之后,线程B尝试进入代码块失败,因为线程A已经获得synchronized后括号内对象的锁,线程B只有在线程A退出同步代码块之后,释放对象锁,线程B才可以进入同步代码块,在此之前,线程B只能阻塞等待。一个类中定义一个静态同步方法,创建两个含有静态同步方法对象实例,开启两个线程,在线程A中,实例1调用静态同步方法,并在方法中睡眠5秒钟,同时实例2也调用静态同步方法。线程A进入同步代码块之后,线程B只有在线程A退出同步代码块之后才进入了同步代码块。

2023-05-01 22:54:50 1090

原创 mysql优化-减少查询回表次数和回表数据量

减少数据回表常见的三种方式分别是1)查询条件使用聚集索引;2)使用索引下推;3)使用索引覆盖。

2023-04-27 17:57:30 2487

原创 加密算法在链接防抓取和数据防篡改应用

分析单/双向加密算法优缺点和对应解决问题场景,思考进一步可改进点

2023-04-21 00:13:19 601

原创 如何使用读写屏障解决读写3色标记中漏标

在并发标记阶段,使用三色标记算法进行可达性分析性存在漏标问题,了解读写栅栏在解决该问题中具体应用有助于进一步加深并对发标记过程理解。停止业务线程,只运行垃圾回收线程(STW, stop-the-world)会导致单次垃圾回收时间过长,影响用户体验,使用三色标记法(Tri-color marking)进行并发标记,并发标记结束后,再进行STW,对并发标记过程中较少记录对象进行判断回收,缩短单次垃圾回收STW时间。

2022-10-23 20:21:30 615

原创 Charles安装和抓包原理

进行APP服务器开发,接口测试、bug定位,抓取移动端请求数据包在所难免,公司使用的Charles,后面有机会使用了其它软件再做对比。Charles并不是安装即可用,涉及一些参数配置,特此记录分享。

2022-10-06 21:53:22 507

原创 代码风格总结

编程风格

2022-09-18 18:39:52 582

原创 线程池使用总结

针对不同执行任务类型,给线程池核心线参数程设置不同的值,可以充分利用CPU资源,提高任务执行效率

2022-08-21 17:39:37 744

原创 使用本地缓存+全局缓存实现小型系统用户权限管理

缓存实现用户权限管理。

2022-07-26 00:17:41 125

原创 数据库批量插入和存在的问题

mysql批量操作和注意事项

2022-07-10 22:40:53 1097

原创 git简介和办公常用使用场景操作命令

目录场景1:将新创建项目提交到github托管场景2:修改最近的一次commit场景3:提交代码解决冲突场景4:切换一个新的分支&分支合并存在问题git作为开发中常用代码版本控制工具,本文主要列举实际开发工作中使用git进行项目管理的常见场景,开始之前,默认已经配置好了本地git和已经创建了github账号,有gitlab或者gerrit也是可以的,底层都是走的git协议,操作起来大同小异。演示Idea版本为IntelliJ IDEA 2022.1 (Community Edition),不同id

2022-05-03 13:11:37 769

原创 范型类如何实现上下转型

目录1 Java上转型和下转型2 范型中上下转型2.1 <? extends T> 实现上转型2.2 <? super T>实现下转型3 协变、逆变1 Java上转型和下转型Java上转型: 子类引用的对象转为父类,可以实现自动转型;Java下转型: 父亲类引用的对象转为子类,需要进行强制转换。首先JDK中的数组也是范型,可以进行类似向上的转型,例如:Animal[] animals = new Animal[10] ; animals. = new Dog[10];//

2022-04-30 19:02:07 597

原创 内部类和静态内部类区别和使用场景

目录1 、实现方式和使用的区别内部类实现和使用静态内部类实现和使用2、适用场景差异3、 HashMap中Node设计为嵌套类分析在实现一个完成功能时,可能需要几个类协调辅助才能更优雅的完成,但对使用人员来说,一个完成对对应一个类,方便理解和使用,此时使用内部类仔合适不过,增加了聚合性,对外屏蔽了具体实现细节。那内部类和静态内部类(嵌套勒)区分又是出于什么样的考虑呢?1 、实现方式和使用的区别内部类实现和使用public class City { private String cityName

2022-04-30 16:08:45 371

原创 函数式接口中范型的类型擦除时机

目录问题描述:分析:范型和函数式接口极大增加了Java代码程序灵活性,二者被广泛使用在各种框架中。范型函数中方法可以根据实际需要,接受和返回不同类型值,并且可以在编译时就进行类型检查,在运行之前进行类型擦出,避免使用上转型发生运行时类型转化异常。函数式接口在不同场景中实现不同逻辑提高程序灵活性。问题描述:类1:普通范型接口public interface RpcClient<K extends ServiceClient> extends CacheAware<String,

2022-04-22 23:16:48 424

原创 Java空指针异常和解决办法

目录问题描述:尝试1:尝试2:使用Optional防止出现空指针异常引用问题描述:public class Main20220419 { public static void main(String[] args) { String id = null; Item item = ItemService.getItemById(id); System.out.println(item.name); } private static c

2022-04-19 21:49:37 7610

原创 如何保证MQ消息有序性?

目录生产端控制消息有序消费端控制消息有序总结Reference消息的有序性指的是一个生产者生产的消息被消费时刻生产顺序一致,例如使用binlog+mq进行数据同步的时候,对于单条记录的增加、和修改和删除应该保持有序,消费消息时如果消息变成删除、修改和删除,则导致同步数据不一致。对于最简单的消息模型,一个生产者+一个消息队列+一个消费者,由于队列具有先进先出(FIFO,first in first out)特性,这样的消息模型消息时有序的。消息从生产到消费有两个传输阶段,第一个阶段是从生产者到消息队列,

2022-03-22 15:35:14 10324

原创 深度分页问题分析和优化

目录数据集深度分页存在的问题深度分页优化数据集test_db下载 :https://gitee.com/lzjcnb/test_db数据集安装:mysql -uroot -p -t < employees.sql深度分页存在的问题查询表employess表结果集中第[N,N+m]跳记录,先查看下数据集大小:分别查询[10000,10003]三条记录和[100000,100003]三条记录,并观察执行时间。mysql> select * from employees limit 1

2022-03-12 16:52:01 8819 6

原创 为什么要创建联合索引

多个单列索引联合使用,同样可以达到联合索引的功能,并且联合索引还会有索引失效的情况,禁不住一探为什么还要创建联合索引?总结下来有4个优点,分别时降低维护索引的开销、使用索引下推减少回表查询记录数、使用索引覆盖减少回表以及减少避免死锁频率。联合索引数据结构联合索引创建索引,非叶子节点只会存储联合索引的第一个关键字,叶子节点存储联合索引的所有字段值+集索引索引Id,查询的时候,先比较第一个关键字,第一个关键字相同 ,比较第二个关键字,第一个关键字,则按照后面的关键字排序,后面关键只时局部有序。联合索引进

2022-03-06 22:49:36 3740 2

原创 为什么选择B+树作为Innodb索引数据结构

目录数组hash表二叉搜索树平衡二叉树和红黑树B-Tree/B+Tree数据物理存储方式可分为顺序存储和链式存储,数据逻辑存储方式可以分为线性和非线程。为什么要从众多组合中选择链接结构的B+树作为innodb索引,一个好的索引不仅查询效率高,同时在数据更新的过程中需要对索引进行维护,还需要保证索引维护成本不能太高,B+Tree很好的满足了这两点。数组有序数组使用二分查找时间复杂度未lgN,对查找到的元素,直接进行更新时和删除(设置为null避免后面移动),对查找、更新和删除来说,数组作为索引性能还不错

2022-03-06 21:37:42 821

原创 Spring循环依赖解决思路

目录jvm类加载循环依赖Spring的IoC容器如何解决循环依赖问题引出Spring循环依赖解决办法总结jvm类加载循环依赖一个Java对象创建分为实例化和初始化两步,例如Person person = new Person();可以拆解为两步:第一步:Person person;//类Person的引用,存储在栈中,用来指向Person在堆中创建的对象,可以理解为Person对象在堆中描述符,会触发Person类加载和类变量的初始化第二步:person = new Person();//类Pers

2022-02-24 01:02:09 518

原创 Spring中事务

目录编程方式管理事务声明方式管理事务基于xml声明事务实现基于注解声明式事务实现事务失效情况Spring提供编程和声明两种方式的事务管理。spring事务本质式对数据库事务的进一步封装,spring事务还新增了事务传播机制,二者作用都是为了保证在并发情况下的CURD安全。事务的实现需要锁的支持,过多的使用事务会影响整个系统的并发性,尤其使用高级别的事务隔离级别。编程方式管理事务第一步:添加事务依赖包<dependency> <groupId>org.s

2022-02-21 01:47:41 568

原创 Spring AOP中的动态代理技术

目录问题引入静态代理两种动态代理技术基于接口的动态代理基于类的动态代理总结AOP面向切面编程(Aspect-oriented programming,AOP)是spring 中另外一种编程思想,作用是可以在不修改原业务代码的情况下,在类调用关系之间新增加一些操作,优点,将新增的代码和原有业务代码解耦,方便对新增代码的后续维护。代理技术是对AOP思想实现的一种方式。问题引入根据代理类创建的时机分为静态代理和动态代理,静态代理在程序运行之前由用户提前定义好,动态代理在程序运行过程中进行创建和加载。静

2022-02-19 01:45:47 604 2

原创 spring IoC容器概念说明

这里写目录标题bean注册方式bean注入方式bean的两种状态bean两种加载方式控制反转(Inverse of Control,IoC)和依赖注入(Dependency Injection)是Spring中一个重要设计思想,控制指对象创建的控制,反转指将对象创建控制权转交给了IoC容器。依赖注入指对已经注册到IoC容器中的bean对象,在bean对象的地方,IoC主动将容器中创建好对象赋值该对象。IoC容器底层通过一个Map所有注册bean对象,key类型是String,存储注入类的全限定名,valu

2022-02-18 00:52:43 440

原创 Java 异常概念介绍和使用

***年龄合法性异常类,继承了受检查异常,在抛出和捕捉该异常的地方都要进行声明super(msg);} } * * * 手机号合法性异常,继承运行时异常,可以不用捕捉,jVM会自动捕捉 * / class InvalidPhoneException extends RuntimeException {super(msg);} } 两个测试类 public class User {return age;

2022-02-08 01:33:26 602

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除