自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

QQsilhonette的博客

无知者无畏

  • 博客(95)
  • 收藏
  • 关注

原创 常用算法模板

二分查找法主要是解决在“一堆数中找出指定的数”这类问题。想要应用二分查找法,这一堆数必须有以下特征:存储在数组中有序排列(无序的话二分用来猜答案的方法)

2023-11-14 11:26:47 68

原创 流媒体服务入门

SRS

2022-07-27 23:25:24 514 1

原创 FFmpeg入门

FFmpeg

2022-07-26 22:31:53 466

原创 Kubrenetes入门

1. 基础概念Pod/Pod控制器 Name/NameSpace Label/Label选择器 Service/Ingress1.1 Pod/Pod控制器PodPod是K8S里能够被运行的最小逻辑单元 1个Pod里面可以运行多个容器,被称为SideCar模式Pod控制器Pod控制器是Pod启动的一种模板,用来保证在K8S里启动的Pod应始终按照人们的预期运行(副本数、声明周期、健康状态检查) K8S内提供了众多的Pod控制器:Development, DaemonSet, Re

2021-12-02 23:55:53 352

原创 实现不可变类解决线程安全问题

举例:public class Location { private double x; private double y; public Location(double x, double y) { this.x = x; this.y = y; } public double getX() { return x;

2021-09-08 09:33:01 643

原创 Docker Compose入门使用教程

1. Docker Compose 介绍Docker Compose用来定义运行多个容器Compose重要概念:服务Service,容器,应用(Web、Redis、Mysql...)项目Project,一组关联的容器。Compose 使用的三个步骤: 使用 Dockerfile 定义应用程序的环境。 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 最后,执行 docker-compose up 命令

2021-08-14 00:20:43 497

原创 Docker入门使用教程

1. 安装/升级Docker客户端对于10.10.3以下的用户 推荐使用Docker ToolboxMac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-toolbox/对于10.10.3以上的用户 推荐使用Docker for MacMac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/2. 配置镜像加速器针对安装了Docker T

2021-08-13 23:21:51 181

原创 记录一次超时问题分析

一. 问题现象商品团队反馈,会员部分 dubbo 接口偶现超时异常,而且时间不规律,几乎每天都有,商品服务超时报错如下图:超时的接口平时耗时极短,平均耗时 4-5 毫秒。查看 dubbo 的接口配置,商品调用会员接口超时时间是一秒,失败策略是failfast,快速失败不会重试。会员共部署了8台机器,都是 Java 应用,Java 版本使用的是 JDK 8,都跑在 docker 容器中 。二. 问题分析开始以为只是简单的接口超时,着手排查。首先查看接口逻辑,只有简单的数据库调用,封装参

2021-05-25 09:46:16 179

原创 中台是什么?

1. 平台和中台的差异平台只是将部分通用的公共能力独立为共享平台,通过API或者数据对外提供公共共享服务,解决系统重复建设的问题。但是并没有企业内的其他平台或应用,实现页面、业务流程和数据从前端到后端的全面融合,并且没有将核心业务服务链路作为一个整体方案考虑,各平台任然是分离且独立的。中台提供的是一套企业级的整体解决方案,通过平台联通和数据融合为用户提供一致的体验,更敏捷地支撑前台一线业务。关键能力:对前台业务的快速响应能力;企业级复用能力;从前台、中台到后台的设计、研发、页面操作、流程

2021-05-12 15:58:15 623

原创 Redis不同数据类型使用案例

1、Hash举例:电商购物车,购物车id->1001 商品id->10088 数量->11)添加商品->HSETcart:1001 10088 12)增加数量->HINCRBY cart:1001 10088 13)商品总数->HLEN cart:10014)删除商品->HDEL cart:1001 100885)获取购物车所有商品-> HGETALL cart:1001优点:1)同类数据归类整合存储,方便数据管理2)相..

2021-05-10 18:00:28 151 1

原创 生产部署实践

1、RedisRedis cluster,10 台机器,5 台机器部署了 Redis 主实例,另外 5 台机器部署了 Redis 的从实 例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰 QPS 可能 可以达到每秒 5 万,5 台机器最多是 25 万读写请求每秒。机器是什么配置?32G 内存+ 8 核 CPU + 1T 磁盘,但是分配给 Redis 进程的是 10g 内存,一般线 上生产环境,Redis 的内存尽量不要超过 10g,超过 10g 可能会有问题。5 台机

2021-04-29 14:34:50 88

原创 Kafka优秀实践

1. Kafka工业级异常处理1)自定义异常体系底层模块应该把自己的异常抛出来,最最核心的上层流程控制逻辑来捕获所有的异常,根据异常进行对应的处理;严格、成熟的系统里,一定有一套异常体系,就是针对系统可能出现的一些问题,定义好一些预定义的异常类,看到一个异常类就知道在代码的那个地方大概发生了什么样的异常,写好异常信息。2)底层模块把自定义异常往上抛3)核心控制流程中对各种异常进行处理处理技巧1:直接抛出异常到最上层的调用地方处理技巧2:封装成一种错误码的状态,400处理技巧.

2021-04-24 17:30:12 159

原创 KafkaProducer内核原理

1. KafkaProducer核心组件1)Partitioner,用来决定你发送的每条消息是路由到Topic的哪个分区;2)MetaData,用来从broker集群去拉取元数据的,包含Topics(Topic->Partitions->Leader+Followers,ISR列表: 所有同partiton leader数据同步的Replica集合);默认5分钟会发送请求刷新元数据,在发送消息时,如果发现要写入的某个Topic对应的元数据不在本地,会发送请求到broker尝试拉取这个

2021-04-24 15:39:57 157

原创 DDD优秀实践及总结 Part Ⅴ——避免写流水账代码

1. 案例简介下单链路,假设我们在做一个checkout接口,需要做各种校验、查询商品信息、调用库存服务扣库存、然后生成订单:原始代码:@RestController@RequestMapping("/")public class CheckoutController { @Resource private ItemService itemService; @Resource private InventoryService invent

2021-04-22 11:41:43 396

原创 JVM性能优化怎么做

1. 一个新系统开发完毕之后如何设置JVM参数原则:尽可能让那个每次Young GC后存活对象远远小于Survivor区域,避免对象频繁进入老年代触发Full GC。2. 在压测之后合理调整JVM参数Eden区对象增长速率?Young GC频率?一次Young GC耗时?Young GC过后多少对象存活?老年代对象增长速率?Full GC频率多高?一次Full GC耗时?原则:尽量避免对象频繁进入老年代3. 线上系统监控和优化4. 线上频繁F...

2021-04-15 20:09:13 109

原创 JVM指令及使用

1. jstatjstat -gc PID 查看Java进程的内存和GC情况S0C:这是From Survivor区的大小S1C:这是To Survivor区的大小S0U:这是From Survivor区当前使用的内存大小S1U:这是To Survivor区当前使用的内存大小EC:这是Eden区的大小EU:这是Eden区当前使用的内存大小OC:这是老年代的大小OU:这是老年代当前使用的内存大小MC:这是方法区的大小MU:这是方法区的当前使用的内存大小Y..

2021-04-14 10:44:44 170 1

原创 G1回收器性能为什么比传统GC好

1. 每个Region大小是多大?region的大小必须是2的倍数,默认是堆的大小除以2048。也可以手动指定"-XX:G1HeapRegionSize"2. 可以设定GC停顿时间-XX:MaxGCPauseMills3. 大对象RegionG1提供了专门的Region来存放大对象,而不是让大对象进入老年代的Region中。而且一个对象如果太大,可能会横跨多个Region来存放。大对象Region既不属于新生代也不属于老年代,在新生代、老年代回收的时候,会顺带着大对象Region

2021-04-12 10:28:55 184

原创 频繁Full GC的几种常见原因

原因一:系统承载高并发请求,或者处理数据量过大,导致Young GC很贫乏,而且每次Young GC过后存活对象太多,内存分配不合理,Survivor区过小,导致对象频繁进入老年代,频繁触发Full GC。原因二:系统一次性加载过多数据进内存,搞出来很多大对象,导致频繁有大对象进入老年带,必然频繁触发Full GC。原因三:系统发生了内存泄漏,莫名其妙创建大量的对象,始终无法回收,一直占用在老年代里,必然频繁触发Full GC。原因四:Metaspace(永久代)因为加载类过多触发Full GC

2021-04-11 22:07:24 12509

原创 电商大促场景系统垃圾回收优化

1. 年轻代垃圾回收优化按照每个用户平均访问20次来计算,大致需要有500万日活用户,按照10%的付费转化率来计算,每天大概50万人会下订单,50万订单算集中在4个小时高峰期内,平均每秒就几十个订单。这时不需要对JVM多关注,内存无压力。1.1 大促场景的设定:可能在短短10分钟,瞬间会有50万订单,这样每秒会有接近1000的下单请求,按照3台来算,每台机器每秒需要抗300个下单请求,机器为4核8G,机器本身的CPU资源和内存资源是没有问题的。但是问题在于需要对JVM有限的内存资源进行合理.

2021-04-10 22:41:24 165

原创 微服务主流技术架构

1. 注册中心主流技术栈:Zookeeper、Eureka、Consul、NacosZookeeper:多用于Dubbo,leader+follower,leader写同步到follower,follower可以读。CP,leader崩溃的时候,为了保证数据一致性,要重新选举leader以及数据同步,集群可能会短暂不可用;Eureka:多用于Spring Cloud NetFlix,peer-to-peer,每个节点都能读都能写,异步复制。AP,不同的节点可能读到的数据不一样,任何节点宕机,..

2021-03-16 17:48:49 1087 1

原创 流量控制知识点

总体说明:Hystrix:关注点在于隔离和熔断为主的容错机制,超时或熔断可以快速失败,并提供fallback机制;Sentinel:多样化的流量控制、熔断降级、系统负载保护、实时监控和控制台。共同特性1)资源模型和执行模型上的对比:Hystrix强依赖隔离规则,因为Hystrix在执行时会解析Command的隔离规则来创建RxJava Scheduler并在其上调度执行;Sentinel只需要考虑这个代码是否需要保护,规则配置可以动态调整。2)隔离设计上的对比:Hystr..

2021-03-16 17:47:57 157

原创 DDD优秀实践及总结——规范总结

1、尽量使用DP,将隐型概念显性化;2、将数据校验、错误处理、属于该DP的行为放到DP创建中;3、抽象Entity,Entity中包含了数据和行为;4、抽象第三方服务;5、抽象中间件;6、封装业务逻辑,使用DP封装跟Entity无关的无状态计算逻辑,使用Entity封装单对象的有状态行为;7、使用Domain Service封装多对象逻辑;8、Entity和数据模型不需要完全一致,且尽量使用DP;9、Repository接口名称不要使用底层预发,操作Entity对象,不操作底

2021-01-23 18:04:36 658

原创 DDD优秀实践及总结 Part Ⅳ——领域层设计

案例分析:如何用代码实现一个龙与魔法的游戏世界的(极简)规则?基础配置如下: 玩家(Player)可以是战士(Fighter)、法师(Mage)、龙骑(Dragoon) 怪物(Monster)可以是兽人(Orc)、精灵(Elf)、龙(Dragon),怪物有血量 武器(Weapon)可以是剑(Sword)、法杖(Staff),武器有攻击力 玩家可以装备一个武器,武器攻击可以是物理类型(0),火(1),冰(2)等,武器类型决定伤害类型 攻击规则如下: 兽人对

2021-01-23 16:32:40 346

原创 DDD优秀实践及总结 Part Ⅱ——应用架构

Part Ⅱ. 应用架构好的应用架构目标:独立于框架、独立于UI、独立于底层数据源、独立于外部依赖、可测试。案例分析案例:用户可以通过银行网页转账给另一个账号,支持跨币种转账。同时因为监管和对账需求,需要记录本次转账活动。需求拆解:1)从MySql数据库中找到转出和转入的账户,选择用 MyBatis 的 mapper 实现 DAO;2)从 Yahoo(或其他渠道)提供的汇率服务获取转账的汇率信息(底层是 http 开放接口);3)计算需要转出的金额,确保账户有足够余额,并且没超出

2021-01-22 14:59:26 249

原创 秒杀场景实现思路

秒杀场景的特点是高并发,而高并发带来的问题就是会对服务器造成很大的压力,所以如何缓解这些压力和提高QPS就是秒杀优化所要解决的重点问题。主要的措施就是通过redis实现缓存来减少数据库的压力,通过消息队列完成异步下单,来提升用户的体验以及削峰降流。实现的思路是:1、首先在秒杀前先进行预热,将商品的库存加载到redis上;2、秒杀开始,后端收到请求后,redis预减库存,如果库存已经没有了,...

2021-01-20 16:24:49 1303

原创 前端知识点1

ES6...扩展运算符:将一个数组转为用逗号分隔的参数序列。 1)合并数组:// ES5[1, 2].concat(more)// ES6[1, 2, ...more] 2)解构赋值:// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = list //解构只能位于最后 3)函数多个返...

2021-01-20 16:22:03 87

原创 前端知识点2

8、事件机制,如何反转捕获和冒泡,addEventListener:event:必须。字符串,指定事件名。注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。function:必须。指定要事件触发时执行的函数。当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对...

2021-01-20 16:21:28 49

原创 Java面试题四:Spring全家桶

四、Spring基本概念1、IOC/DI。答:1)对象的属性由自己创建,为正向流程,而由Spring创建,为控制反转;2)依赖注入为实现IOC的一种方式,通过配置文件或注解包含的依赖关系创建和注入对象;3)正向流程导致了对象和对象之间的高耦合,IOC可以解决对象耦合的问题。2、Context&Bean。答:1)所有由Spring创建,管理,用于依赖注入的对象,称为...

2021-01-20 16:20:56 145

原创 Java面试题一:Java基础

一、Java基础集合类:1、HashMap的put方法的具体流程?答:判断空间是否足够->不够则扩容->判断key是否存在->存在则插入链表->链表数如果超过8->转为红黑树。2、HashMap的扩容操作是怎么实现的?答:当kv达到扩容的阈值,以2倍扩容,将原表中的对象重新计算位置,并拷贝到新的表。3、HashMap是怎么解决哈希冲突的?答:...

2021-01-20 16:20:43 157

原创 Java面试题二:JVM

二、JVM其它1、JVM内存模型。答:1)栈:用来存储局部变量、操作栈、动态链接、方法出口等,调用方法时执行入栈,方法返回时执行出栈;2)本地方法栈:保存native方法信息;3)程序计数器:保存当前线程执行的字节码位置,执行native方法时为空;4)堆:被线程共享,存放所有的对象实例;5)方法区(非堆区):用来存放已被虚拟机加载的类信息,常量,静态变量,即时编译优化后...

2021-01-20 16:20:03 170

原创 Java面试题三:并发与多线程

三、并发与多线程锁1、Java内存模型。答:内存模型用于保证时间片导致原子性问题、多核多线程缓存一致性问题、处理器优化有序性问题。Java内存模型规定所有变量都存储在主内存中,每条线程有自己的工作内存,其中保存了主内存中变量的副本拷贝,工作线程对变量的操作必须在工作内存中进行。synchronized提供了monitorenter和monitorexit来保证原子性;使用volatile...

2021-01-20 16:19:56 239

原创 Java面试题五:缓存

六、缓存1、Memcached。答:特点是多线程、异步IO、KV存储、内存存储没有持久化、采用LRU(Least Recent Used)淘汰算法。内存管理(Slab结构):内存按照1MB的大小分页,页中的内存分割为具有相同大小的内存块。一个新的记录到来时,Memcached根据记录的大小选择存储的Slab类型,如果没有该类型空闲的Slab块,会创建一个新的页。当记录大小发生变化时,存...

2021-01-20 16:19:16 306

原创 Java面试题六:消息队列与数据库

七、消息队列1、消息队列的使用场景。答:应用解耦、服务通信、异步任务、削峰填谷、消息广播。2、Kafka架构。答:Kafka集群由多个server组成,每个server成为一个Broker,为消息代理;Kafka中的消息是按topic进行划分的,一个topic就是一个queue;为了提高并行能力,Kafka为每个topic维护了分布式的Partition日志文件。3、Kafka...

2021-01-20 16:18:46 642 1

原创 DDD优秀实践及总结 Part Ⅰ——Domain Primitive

Part Ⅰ.Domain Primitive (DP)原则一:将隐形概念显性化(Make Implicit Concepts Explicit)案例:一个新应用在全国通过 地推业务员 做推广,需要做一个用户注册系统,同时希望在用户注册后能够通过用户电话(先假设仅限座机)的地域(区号)对业务员发奖金。原始代码:public class User { Long userId; String name; String phone; String address;.

2021-01-20 16:09:31 470

原创 《亿级流量网站核心技术》读书笔记

1、高并发原则无状态、拆分、服务化、消息队列、数据异构、缓存银弹、并发化。数据异构:订单分库分表一般按照订单ID进行划分,如果要查询某个用户的订单列表,需要聚合多个表的数据后才能返回,导致订单表读性能很低。此时可以按照用户ID进行分库分表,异构一套用户订单表。数据闭环:商品详情页,因为数据来源太多,影响服务稳定性的因素就非常多,最好的办法就是把使用到的数据进行异构存储,形成数据闭环。步骤:数据异构(通过MQ机制接收数据变更存储到合适的存储引擎,如:redis)->数据聚合(可选)->

2020-11-28 11:32:53 289 1

原创 my-statemachine和my-rulemachine一些值得借鉴的代码和思想

1、基本模型my-statemachine使用一个工厂(factory)创建一个状态机的构造器(builder),builder包含5个要素:起始状态(from)、目标状态(to)、触发事件(on)、条件判断(when)、执行动作(perform),再使用builder构建一个状态机实例,传入起始状态、触发事件、相关参数(非必要)启动状态机。public void testExternalNormal() { StateMachineBuilder<States, Eve

2020-10-12 16:03:53 137

原创 分库分表知识点

1、什么要分库分表?一般一个表的数据最好控制在200万以内,一个库最多支撑并发2000,并发最好保持在1000。# 分库分表前 分库分表后 并发支撑情况 MySQL 单机部署,扛不住高并发 MySQL从单机到多机,能承受的并发增加了多倍 磁盘使用情况 MySQL 单机磁盘容量几乎撑满 拆分为多个库,数据库服务器磁盘使用率大大降低 SQL 执行性能 单表数据量太大,SQL 越跑越慢 单表数据量减少,SQL 执行效率明显提升 2、不同.

2020-09-16 17:24:36 181

原创 消息队列知识点

1、为什么要用消息队列好处:解耦、异步、削峰;缺点:系统可用性降低、系统复杂度高、一致性问题。2、Kafka、RabbitMQ、RocketMQ 有什么优缺点?特性 RabbitMQ RocketMQ Kafka 单机吞吐量 万级 10 万级,支撑高吞吐 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景 topic 数量对吞吐量的影响 topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 .

2020-09-15 16:40:39 113

原创 通过test用例分析COLA statemachine源码

外部状态转移的test用例:@Test public void testExternalNormal(){ // 第一步:生成一个状态机builder StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create(); // 第二步:设置一个外部状态转移类型的builder,并设置from\to\on\when\perf

2020-09-11 17:21:00 1833

原创 分布式锁知识点

1、基于redis的最简单的分布式锁// 获取锁// NX是指如果key不存在就成功,key存在返回false,PX可以指定过期时间SET anyLock unique_value NX PX 30000// 释放锁:通过执行一段lua脚本// 释放锁涉及到两条指令,这两条指令不是原子性的// 需要用到redis的lua脚本支持特性,redis执行lua脚本是原子性的if redis.call("get",KEYS[1])== ARGV[1] then return red

2020-09-09 16:15:06 195

空空如也

空空如也

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

TA关注的人

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