自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 用户历史浏览方案设计复盘

需求用户浏览资料后,保存用户3个月的浏览记录方案一数据库:mongodb分表存储分表规则:分表规则根据用户id存储结构:浏览一次资料记录一条主键ID用户ID资料ID浏览时间资料是否有效查询方式:根据用户ID,走分表规则找到对应表,查询所有资料ID定时器:(Day|Month)所有分表扫描浏览时间在3个月外的记录进行删除分析:简单,以记录维度存储在大量用户频繁浏览时,数据库压力巨大方案二数据库:redis存储(Day)、mongodb单表存储(Thre

2021-05-21 19:10:15 679

原创 idea安装LeetCode插件之保姆式服务

插件下载插件配置说明个别问题力扣账号密码登陆问题:很多小伙伴都是第三方登陆,这里找到力扣的账号密码方法,点击可看到账号,设置自己的密码红色无效文件问题:创建的模板文件需要在java环境下,以springboot项目为例,TemplatePath配置的路径必须在src/main/java下面,另外注意在模板中加上包路径,是固定的,具体看插件配置图...

2021-03-23 14:37:00 515 1

原创 Sentinel哨兵搭建及说明

环境搭建节点ip端口监听Redis节点Sentinel1192.168.211.14180017001Sentinel2192.168.211.14180027002Sentinel3192.168.211.14180037003拷贝 /usr/local/server/redis-cluster 下的单节点 redis 到 /usr/local/server/redis-cluster/sentinel/目录下,分别拷贝3分,命名为 senti

2021-01-15 09:26:33 542

原创 Redis集群配置

现在安装对应的应用软件一般都推荐使用Docker容器,我们这里也不例外,直接使用Docker容器进行安装,安装大概要分这几个步骤:1、创建redis-cluster.tmpl配置Redis信息【端口、是否开启集群等】2、创建redis.sh配置需要创建的redis信息3、添加网络,redis集群使用该网络4、执行redis.sh实现创建redis5、执行redis-cli创建集群配置Redis信息创建 redis-cluster.tmpl 配置Redis信息(redis.conf)#端口

2021-01-12 21:12:56 666

原创 redis版本特性介绍

Redis我们采用Redis6.0.5最新版本,它有很多新特性,我们这里对Redis每个版本的特性介绍一下:Redis2.6Redis2.6在2012年正是发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性如下:1)服务端支持Lua脚本。2)去掉虚拟内存相关功能。3)放开对客户端连接数的硬编码限制。4)键的过期时间支持毫秒。5)从节点支持只读功能。6)两个新的位图命令:bitcount和bitop。7)增强了redis-benchmark的功能:支持定制化的压测

2021-01-12 21:03:18 225

原创 TCP连接断开原理剖析

TCP连接三次握手TCP协议在双方建立连接的时候需要三次握手, 所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。以下为客户端主动发起连接的图解:其中比较重要的字段有:SYN(synchronous建立连接) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束)RST(reset重置) URG(urgent紧急)tips不要将确认序号Ack与标志位中的ACK搞混了。确认方Ack=发起方Seq+1,两端配对为

2021-01-07 21:26:28 854

原创 Netty之Hessian编解码

JDK序列化使⽤是⽐较⽅便,但是它的性能较差,序列化后的字节⼤⼩也⽐较⼤,所以⼀般在项⽬中不会使⽤⾃带的序列化,⽽是会采⽤第三⽅的序列化框架。我们以Hessian为例,演示下如何与Netty整合进⾏编解码处理。导⼊Hessian依赖:<dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.63</v

2021-01-06 14:13:57 505

原创 Netty的模型演进及快速入门

BIO模型Demopublic class BIOServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(6666); ExecutorService executorService = Executors.newCachedThreadPool(); while (true) { System.out.printl

2021-01-05 17:10:47 149 1

原创 lambda的函数式接口深入理解

Lambda表达式底层原理解析对含有lambda的类进行反编译省略。。。可以发现,代码中执行Lambda表达式的部分生成了一个静态私有函数。这个静态私有函数的函数干就是 Lambda表达式里面的内容。那么对于这个静态私有函数,在JDK8内部是如何实现调用的呢?可以查看 LambdaMetafactory 类,该类下有一个 metafactory方法,lambda表达式每一次在执行的时候都会进入到这个方法中,并且为lambda表达式创建一个内部类。综上所述,Lambda表达式在执行的时候,会调用L

2021-01-03 17:43:34 242

原创 日志平台搭建kafka+elk

整体架构企业实际实战中,elk是成熟且⼴泛使⽤的⽅案。进⼊elk前,部署kafka,作为统⼀⼊⼝和出⼝,假如⼤数据部⻔需要,⾃⼰连kafka即可。⽇志两种收集⽅式,⼀是吐(业务信息,kafka appender),⼆是抓(⽇志⽂件,filebeat)。主动吐更适合当前场景,kafka的另⼀头,⽇志平台订阅消息接收kafka启动#docker启动#启动zookeepermkdir -p /opt/data/zksingledocker run --name zookeeper -v

2020-12-29 10:53:13 651 1

原创 设计模式之状态模式

定义对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。优点1、封装了转换规则。2、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。3、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。缺点1、状态模式的使用必然会增加系统类和对象的个数。2、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代 码,否则无法切

2020-12-23 10:55:28 109

原创 设计模式之策略模式

定义策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装 到一系列的策略类里面,作为一个抽象策略类的子类。优点1、算法可以自由切换。2、避免使用多重条件判断。3、扩展性良好。缺点1、策略类会增多。2、所有策略类都需要对外暴露。案例结算价格计算,根据Vip不同等级进行运算用户在购买商品的时候,很多时候会根据Vip等级打不同折扣,这里也基于真实电商案例来实现VIP等级价格制:Vip0->普通价格Vip1->减5元

2020-12-23 10:49:04 91

原创 设计模式之装饰者模式

定义动态的向一个现有的对象添加新的功能,同时又不改变其结构。它属于结构型模式。优点装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。缺点多层装饰比较复杂。需求在订单提交的时候,订单价格和结算价格其实是两码事,订单价格是当前商品成交价格,而结算价格是用户最终需要支付的金额,最终支付的金额并不是一成不变,它也并不是商品成交价格,能改变结算价格的因素很多,比如满100减10元,VIP用户再减5块。装饰者模式价格运算实现思路分析1、创

2020-12-23 09:44:34 109

原创 设计模式之架构中的代理增强模式

流程分析模拟Spring的声明式事务控制,在业务层进行增强,我们可以按照如下步骤实现:1、创建增强类TransactionManager,在里面编写一个增强方法begin2、创建一个BeanProxy对象,用于给指定包下的对象创建代理3、每次ParseXml加载解析之后,调用BeanProxy给指定包下的对象创建代理业务层代理模式增强1)指定增强位置首先在spring.xml配置文件中配置一下增强的位置,before表示前置增强, package 表示指定包下的对象进行前置增强, ref 表

2020-12-22 10:24:48 335

原创 设计模式之架构中的观察者模式

上篇虽然已经实现了MVC模型对应功能,但是每次调用对象都是创建了新对象,我们可以对这里进行优化,让每次调用的对象是单利对象,这时候我们就需要初始化的时候把对象创建好了,但是对象和对象之间又存在依赖关系,我们可以在配置文件中配置这种关系。这里我们可以使用观察者模式和单利模式流程分析我们编写一个类似Spring的MVC框架,这里采用观察者模式实现监听文件加载,实现步骤如下:1、编写BaseInit类,并继承HttpServlet2、重写HttpServlet中的init(ServletConfig c

2020-12-21 21:59:48 190 2

原创 设计模式之架构中的适配者模式

定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。优点:1、可以让任何两个没有关联的类一起运行。2、提高了类的复用。3、灵活性好缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。以自定义Spring架构来说明适配器视图渲染做视图解析的时候,有不同的解析方式,比如有直接输入json数据、重定向、转发、输出

2020-12-21 21:44:23 152

原创 设计模式之代理模式

JDK动态代理1、被代理的类必须实现一个接口2、创建代理对象的时候,用JDK代理需要实现InvocationHandler3、代理过程在invoke中实现接口public interface LandlordService { void rentingPay(String name);}被代理对象public class Landlord implements LandlordService{ /**** * @param name */ @Override public vo

2020-12-21 21:08:47 131 1

原创 Docker Compose搭建Redis哨兵集群

集群模式1、主从2、哨兵3、cluster基础环境准备1、Docker Engine2、Docker Compose基础目录介绍(/usr/local/redis)mkdir /usr/local/redis创建Redis主从资源编排文件创建redis集群的docker-compose设置一个主容器和两个从容器,并在启动时设置密码。由于是docker容器内环境,主从需要相互通信,所以给它们配置网络,同时也是为了下面哨兵能够ping通集群做准备version: '3.7'se

2020-12-17 21:37:27 184

原创 GC常用参数

堆栈设置-Xss:每个线程的栈大小-Xms:初始堆大小,默认物理内存的1/64-Xmx:最大堆大小,默认物理内存的1/4-Xmn:新生代大小-XX:NewSize:设置新生代初始大小-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。-XX:MetaspaceSize:设置元空间大小-XX:MaxMetaspaceSize:设置元空间最大允许大

2020-12-08 09:37:13 222

原创 Flink接入体系

Flink接入体系Flink ConnertorsJDBC(读/写)pom <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-jdbc_2.11</artifactId> <version>1.11.2</version>

2020-12-08 09:25:48 292

原创 实时计算Flink

应用场景智能推荐1、小红书推荐系统实时数仓什么是实时数仓数据仓库(Data Warehouse),可简写为DW或DWH,是一个庞大的数据存储集合,通过对各种业务数据进行筛选与整合,生成企业的分析性报告和各类报表,为企业的决策提供支持。实时仓库是基于Storm/Spark(Streaming)/Flink等实时处理框架,构建的具备实时性特征的数据仓库。阿里巴巴菜鸟网络实时数仓设计:数仓分层处理架构(流式ETL):ODS -> DWD -> DWS -> ADSO

2020-12-07 19:39:22 626

原创 redis集群部署及原理

实例需要先启动redis实例,注意端口,8081-8083#创建3个新文件夹! cd /opt/nosql/redis/redis/conf mkdir 1 2 3 #拷贝conf文件到各自文件夹,2和3端口设置不同,其他一致 port 8081 cluster-enabled yes #启动注意!切换到自己目录下再执行,因为集群启动需要在当前目录生成nodes.conf文件,否则冲突! cd 1 redis-server redis.conf集群#replicas表示副本数 re

2020-12-07 13:48:28 225 1

原创 Sharding-JDBC一些配置详解4.x

快速入门说明:单库商品表水平分片,分片规则%2#端口号server.port=56000#实例名称spring.application.name= sharding_quick#表示后发现的bean会覆盖之前相同名称的beanspring.main.allow-bean-definition-overriding=true#该配置项就是指将带有下划线的表字段映射为驼峰格式的实体类属性mybatis.configuration.map-underscore-to-camel-case=tru

2020-11-30 09:52:49 1714

原创 分库分表中间件

分库分表的中间件很多,但是可以归结为两大类型:CLIENT模式PROXY模式1、CLIENT模式:代表有阿里的TDDL,开源社区的sharding-jdbc(sharding-jdbc的3.x版本即sharding-sphere已经支持了proxy模式)。架构如下:2、PROXY模式:代表有阿里的cobar,民间组织的MyCAT。架构如下:3、比对从以上两种模式可以看出sharding-jdbc作为一个组件集成在应用内,而mycat则作为一个独立的应用需要单独部署。但是,无论是

2020-11-26 09:01:19 5230

原创 Fork/Join

概念ForkJoin是由JDK1.7后提供多线并发处理框架。ForkJoinPool由Java大师Doug Lea主持编写,处理逻辑大概分为两步。1.任务分割:Fork(分岔),先把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割。2.合并结果:join,分割后的子任务被多个线程执行后,再合并结果,得到最终的完整输出。组成ForkJoinTask:主要提供fork和join两个方法用于任务拆分与合并;多数使用RecursiveAction(无返回值的任务)和Recursi

2020-11-24 21:51:18 429

原创 平滑扩容方案

双写方案可通过canal或mq做实现。增加新库数据迁移:避免增量影响, 先断开主从,再导入(耗时较长), 同步完成并做校验增量同步:监听Canal,并开启主从同步切换新库修复切换异常数据(canal未同步但已切换至新库的请求), 通过定制程序读取异常日志做处理...

2020-11-24 09:11:37 614 2

原创 MySQL体系架构及引擎

MySQL体系架构整个MySQL Server由以下组成Connection Pool : 连接池组件Management Services & Utilities : 管理服务和工具组件SQL Interface : SQL接口组件Parser : 查询分析器组件Optimizer : 优化器组件Caches & Buffers : 缓冲池组件Pluggable Storage Engines : 存储引擎File System : 文件系统连接层最上层是一些

2020-11-23 09:24:17 80

原创 基于AQS自己实现锁

最大允许指定数量的线程并行运作。其他排队等候import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class MyLock extends AbstractQueuedSynchronizer { public MyLock(int count){ setState(count); } @Override protected int tryAcquireShared(int arg) { for

2020-11-20 09:17:20 128

原创 数据库体系架构mysql

数据库体系架构可用性设计A、单点在最原始的架构中,是单一数据库,一旦数据库宕机之后,整个服务都不可用,不存在高可用。B. 主从复制解决高可用的思路,就是冗余、复制;在这种主从的架构中,即使Master节点挂掉,还有Slave节点,整个数据库的数据依赖存在,但是在这种架构中,无法保证读、写的高可用,而且会存在一致性问题。C. "读"高可用为保证读的高可用,可以对读(从)库进行冗余,但是冗余读库,也会存在副作用: 读写有延时,可能存在不一致。在上图中确实是保证了"读"高可用,但是写节点依

2020-11-19 17:11:54 339 1

原创 多线程源码流程图剖析

注意点:1)线程池是如何保证线程不被销毁的呢?答案:如果队列中没有任务时,核心线程会一直阻塞在获取任务的方法,直到返回任务。而任务执行完后,又会进 入下一轮 work.runWork()中循环验证:秘密就藏在核心源码里 ThreadPoolExecutor.getTask()2)那么线程池中的线程会处于什么状态?答案:TIMED_WAITING,RUNNABLE,WAITING验证:起一个线程池,放置一个任务sleep,debug查看结束前后的状态3)核心线程与非核心线程有区别吗?答案:没.

2020-11-17 09:36:16 2039 1

原创 线程状态

线程概念线程创建方式1)、继承Thread2)、实现Runnable线程状态

2020-11-17 08:57:39 100 1

原创 服务集群任务重复解决方案之ZK节点选举

package com.wangj.utils;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.leader.LeaderSelector;import org.apache.curator.framework.recipes.lead

2020-11-16 22:24:36 301

原创 虚拟交易架构之延迟交易

业务架构体系通过图可以看出在功能架构上跟传统的实体电商业务功能上有些是重合的,但也有自己特殊的功能架构,主要体现在虚拟业务技术实现上的一些特点,比如以话费充值为例,在技术实现上我们就需要考虑以下的一些特殊的业务场景:余额/押金导致的供应商轮转接口调用失败之后的重试重试次数的阈值限定,超过后的退款等业务对接成功,接口回调的后续业务处理主动的状态检查,接口回调的补偿在这些业务场景的实现过程中衍生出了虚拟交易特殊的策略系统:延迟任务系统延迟任务系统架构延迟任务:顾明思议,我们把需要延迟

2020-11-16 22:00:52 459

原创 mysql集群双主双从+Mycat读写分离

数据库集群架构订单数据特点:写并发量大于读并发量如何提高我们写数据的能力,给用户良好的用户体验,就是我们需要研究的目标!设计方向:1、多个节点进行数据写入2、进行读写分离操作,提高单节点写数据的并发能力3、要保证每一个写入节点的高可用,当主节点出现问题以后,从节点立马升级为主节点基于以上几点的设计思路,我们所设计出来的订单数据库的架构如下所示:MySql 主从复制主从复制简介就是有两个数据库服务器,一个是主(master)数据库服务器,另一个是从(slave)数据库服务器。当主(mas

2020-11-15 22:54:04 435

原创 kafka搭建Docker版

1、拉取镜像docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka 2、创建容器docker run -di --network=docker-network --ip=172.19.0.60 --name=zk_01 -p 2181:2181 --privileged=true wurstmeister/zookeeper /bin/bashdocker run -di --network=host --name=

2020-11-10 21:01:12 152

原创 kafka架构及各个组件

kafka架构Producer生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。Consumer消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。Topic在Kafka中,使用一个类别属性来划分数据的所属类,划分数据的这个类称为topic。如果把Kafk

2020-11-10 20:56:36 1951 1

原创 RabbitMQ集群搭建docker版

创建容器1、拉取镜像docker pull rabbitmq:3.6.10-management2、创建容器docker run -di --network=docker-network --ip=172.19.0.50 --hostname=rabbitmq-node01 --name=rabbitmq_01 -p 15673:15672 -p 5673:5672 --privileged=true -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitm

2020-11-09 22:55:02 156 1

原创 Nginx的限流策略

Nginx 的限流主要是两种方式:限制访问频率和限制并发连接数。Nginx 按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。Nginx 官方版本限制 IP 的连接和并发分别有两个模块:1、limit_req_zone:用来限制单位时间内的请求数,即速率限制 , 采用的漏桶算法 “leaky bucket”。2、limit_conn_zone:用来限制同一时间连接数,即并发限制。limit_req_zone使用语法:limit_req_zone key.

2020-11-09 09:43:43 4354 2

原创 分布式事务>前世今生>方案

事务的概念事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。从而确保了数据的准确与安全本地事务(回顾)事务的四大特性1)原子性原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。2)一致性事务必须使数据库从一个一致性状态变换到另外一个一致性状态。例如转账前A有1000,B有1000。转账后A+B也得是2000。3)隔离性事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,每个事务不能被其他事务的操作数据

2020-09-21 21:56:36 144

原创 Nacos安装、启动、注册发现、配置管理

Nacos安装与启动Nacos简介Nacos(Dynamic Naming and Configuration Service) 是阿里巴巴2018年7月开源的项目,致力于 发现、配置和管理微服务。Nacos版本介绍https://github.com/alibaba/nacos/releasesNacos目前最新版本为:nacos-server-1.3.1(最新稳定版)项目启动依赖JDK,记得先安装,配置JAVA_HOMENacos配置高可用构建docker 方式//下载镜像

2020-09-15 16:08:25 958

空空如也

空空如也

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

TA关注的人

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