自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 简析nacos自己实现的raft协议

简析nacos自己实现的raft协议

2023-03-27 18:15:21 685 1

原创 nacos1.4.x代码主干简析

nacos代码流程分析

2023-03-27 11:40:52 399

原创 JVM整体结构

由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-Xms:设置堆的初始可用大小,默认物理内存的1/64。-Xmn:新生代大小。

2022-09-30 15:52:37 622

原创 JVM类加载及双亲委派机制

概念:加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。//初始化自定义类加载器,会先初始化父类ClassLoader,其中会把自定义类加载器的父加载器设置为应用程序类加载器AppClassLoader。= null) { //如果当前加载器父加载器不为空则委托父加载器加载该类。} else { //如果当前加载器父加载器为空则委托引导类加载器加载该类。类加载的过程主要又类加载器完成。

2022-09-21 16:58:26 294

原创 netty常用组件

由于TCP协议本身的机制(面向连接的可靠地协议-三次握手机制)客户端与服务器会维持一个连接(Channel),数据在连接不断开的情况下,可以持续不断地将多个数据包发往服务器,但是如果发送的网络数据包太小,那么他本身会启用Nagle算法(可配置是否启用)对较小的数据包进行合并(基于此,TCP的网络延迟要UDP的高些)然后再发送(超时或者包大小足够)。服务器在接收到数据库后,放到缓冲区中,如果消息没有被及时从缓存区取走,下次在取数据的时候可能就会出现一次取出多个数据包的情况,造成粘包现象。这项关联是永久性的。

2022-08-19 11:59:39 312

原创 网络通信编程基础,BIO,NIO

SelectionKey是一个抽象类,表示selectableChannel在Selector中注册的标识,其中有四种状态分别是OP_READ(读事件),OP_WRITE(写事件),OP_CONNECT(发起连接事件),OP_ACCEPT(接收连接事件)jvm在向socket缓冲区发送信息时,会在堆外重新开辟一块内存,将要发送的信息拷贝进去。这样做的原因是防止在gc的时候,改变堆内信息的位置。1减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)......

2022-07-29 11:37:53 124

原创 网络通信编程基础,BIO,NIO

SelectionKey是一个抽象类,表示selectableChannel在Selector中注册的标识,其中有四种状态分别是OP_READ(读事件),OP_WRITE(写事件),OP_CONNECT(发起连接事件),OP_ACCEPT(接收连接事件)这样做的原因是防止在gc的时候,改变堆内信息的位置。1减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作(可能使用多线程或者时间片的方式,根本感觉不到)在连接建立之后,在读到socket信息之前,线程也是一直在等待的,阻塞在那里。堆外内存的优点和缺点。...

2022-07-29 11:36:48 109

原创 网络通信及TCP/IP协议

新入职员工加入公司网络,他会通过ARP协议(数据链路层)进行广播,公司的DHCP服务器收到广播后会根据新员工的MAC地址分配IP。●数据报(datagram)IP中数据的单位。TCP是双全工(即客户端和服务端可以同时发送和接收请求),所以需要双方都确认关闭连接。●报文段(segment)TCP数据流中的信息,报文加上tcp包首部(20字节)●报文/消息(message)应用层传到传输层(tcp)的数据。●帧(frame)表示数据链路层中包的单位。TCP/IP中的数据术语。...

2022-07-26 14:47:46 582

原创 AQS之CyclicBarrier源码解析

我们在前面的reentrantlock,semaphore和countDownLatch中都能看到AQS的addWaiter()方法,是构建同步等待队列的双向链表的。first变为thread1所在的node节点,再次循环进入transferForSignal()方法,将thread1所在的node入队同步队列。我们看到先是通过cas操作将node(thread0)节点的waitStatus又-2变为0,然后看到了我们熟悉的enq()方法可知道,此时同步队列已经构建完成,thread0所在的节点入队。...

2022-07-15 17:34:24 283

原创 AQS之countDownLatch源码分析

CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。 进入await()方法发现acquireSharedInterruptibly()方法是传入固定参数1。 又是AQS这块熟悉的代码,先是try尝试,然后是do进行一些列入队和阻塞操作。从这个方法我们可以看到countDownLatch是共享锁。 闭锁的try方法相当简单,其state为我们创建闭锁时传入的值。返回-1,进入我们

2022-07-14 15:04:43 126

原创 AQS之semaphore源码分析

一个简单的买票逻辑模拟。我们还是按照分析reentrantlock的debug方式来分析代码。 我们还是首先控制thread0进入上锁acquire()方法,传入的arg参数为1,进入tryAcquireShared(arg)方法 进入nonfairTryAcquireShared(int acquires)方法,此时,AQS中控制状态的state属性就是我们创建semaphore时初始化的数值(在非共享锁中,我们知道AQS的state为0时就需要阻塞线程了),最后返回rema

2022-07-13 16:48:41 110

原创 AQS之ReentrantLock源码解析

ReentrantLock加锁解锁的逻辑。公平和非公平,可重入锁的实现。并发场景下入队和出队的操作。一个简单的代码,我们打上断点,选择线程的模式,来看看线程内部是如何执行的。 两行代码。compareAndSetState(0, 1)通过cas运算将锁状态由0改为1setExclusiveOwnerThread(Thread.currentThread()) 将锁绑定到该线程,上锁完成。 通过上面两行逻辑完成上锁。此时thread0以执行完成,sum值为10000,但是暂未释放锁。我们

2022-06-23 18:22:06 105

原创 从普通查询商品到高并发查询商品的优化思路

version 0问题1:商品越来越多,redis承载越来越大version 1问题1解决思路:设置超时时间问题2:我们一般会在启动时初始化redis的产品库存,如果这样设置的话,可能发生在同一时间大量缓存失效的情况。version 2问题2解决思路:将redis的有效时间从固定时间变为可变时间。问题3:对于冷门商品可能半年都没有人浏览过,针对这一对能不能减少我们redis的存储呢...

2022-05-20 16:52:35 438

原创 redis实现分布式锁思路及redission分布式锁主流程分析

首先,我们来看一段问题比较明显的代码。 /** * 存在并发问题 * @param productId * @return */ private String reduceStock1(String productId) { Integer stock = Integer.parseInt(redisTemplate.opsForValue().get(productId)); if(stock>0){

2022-05-19 15:01:09 891

原创 kubernetes(k8s)集群搭建

搭建K8S集群,准备三台2核4g的虚拟机,操作系统选择centos7以上,安装好doker。三台机器前置准备关闭防火墙systemctl stop firewalldsystemctl disable firewalld关闭selinuxsed -i 's/enforcing/disabled/' /etc/selinux/config关闭swapvim /etc/fstab注释掉swap这...

2022-05-11 16:24:46 345

原创 订单交易简析

1.订单交易流程分析订单交易作为涉及到钱的部分势必要谨慎,我们来大体分析一下其中的流程。检查(把不必要的请求第一时间挡回去) 检查本地缓存是否售罄 校验是否有权限购买 判断redis库存是否充足 检查是否排队当中 .... ... 获取产品信息 验证秒杀或活动时间是否超时 获取会员信息 获取会员地址 预减库存 生成下单商品信息 库存处理下面主要分析一下最重要的1,6和8项。2.检查在检查中最主要的就是检查我们r...

2022-04-28 15:12:20 353

原创 高并发下后端的两级缓存

对于高并发我们以最常见最具代表性的商城商品详情页为例,来看看我们如何从最简单的crud进行优化的。1.直接访问数据库 我们直接访问数据库。public PmsProductParam getProductInfo1(Long id) { PmsProductParam productInfo = portalProductDao.getProductInfo(id); if (null == productInfo) { r...

2022-04-26 16:31:48 712

原创 【无标题】

安装1.获取安装包wget https://fastdl.mongodb.org/linux/m2ongodb-linux-x86_64-rhel70-4.4.2.tgz2.进行解压tar -xvzf mongodb-linux-x86_64-rhel70-4.4.2.tgz3.添加到系统执行路径( ~/.bashrc)export PATH=$PATH:<你机器MongoDB bin目录,如:/usr/local/mongodb/mongodb-linux-x.

2022-04-26 09:56:38 90

原创 InitializingBean接口及示例

定义InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。示例全量数据加载到布隆过滤器中@Slf4j@Configurationpublic class BloomFilterConfig implements InitializingBean{ @Autowired private PmsProductService product..

2021-12-14 17:20:29 434

原创 @PostConstruct注解及用处示例

注解解释@PostConstruct注解在方法上,表示此方法是在Spring实例化该Bean之后马上执行此方法,之后才会去实例化其他Bean 一个Bean中@PostConstruct注解的方法可以有多个。 @PostConstruct该注解被用来修饰一个非静态的void()方法。 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。用处@PostConstruct注解Bean中的某些方法,可以用在服务器启动时的做一些初始化工

2021-12-14 16:52:15 1393

原创 NIO示例

NIO(Non Blocking IO)同步非阻塞,服务器实现模式为一个线程可以处理多个请求(连接),客户端发送的连接请求都会注册到多路复用器selector上,多路复用器轮询到连接有IO请求就进行处理,JDK1.4开始引入。相较于传统BIO来说最直观的理解就是不阻塞了,我们直接来个简易NIO来看一下package com.tuling.nio;import java.io.IOException;import java.net.InetSocketAddress;impo

2021-12-03 12:07:41 149

原创 mongoDB复制集及分片集群

mongoDb复制集它主要提供两个方面的功能1. 数据写入主节点(Primary)时将数据复制到另一个副本节(Secondary)点上2. 主节点发生故障时自动选举出一个新的替代节点典型复制集结构一个典型的复制集由三个或三个以上具有投票权的节点组成,其中一个主节点(Primary):接收写入操作,读操作和选举时投票,两个或多个从节点(Secondary):复制主节点上的新数据和选举时投票数据是如何复制的当一个修改操作,无论是插入,更新或删除,到达主节点时

2021-12-01 18:19:07 2453

原创 mongoDB快速入门

安装1.获取安装包wget https://fastdl.mongodb.org/linux/m2ongodb-linux-x86_64-rhel70-4.4.2.tgz2.进行解压tar -xvzf mongodb-linux-x86_64-rhel70-4.4.2.tgz3.添加到系统执行路径( ~/.bashrc)export PATH=$PATH:<你机器MongoDB bin目录,如:/usr/local/mongodb/mongodb-linux-x.

2021-12-01 11:58:50 959

原创 zookeeper的安装与特性

一.zk的安装Step1:配置JAVA环境,检验环境:java -versionStep2: 下载解压 zookeeperwget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gztar -zxvf apache-zooke...

2021-10-29 15:35:37 935

原创 mysql索引优化

建表语句,同时插入10万条数据CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄', `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位', `hir

2021-10-29 10:00:23 167

原创 explain详解

首先是我们用到了三张示例表,film,actor,film_actorDROPTABLEIFEXISTS`actor`; CREATETABLE`actor`( `id`int(11)NOTNULL, `name`varchar(45)DEFAULTNULL, `update_time`datetimeDEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8; IN...

2021-10-27 09:00:00 62

原创 redis缓存设计与性能优化

一.缓存设计 1.缓存穿透缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中。缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。造成缓存穿透的基本原因有两个:第一, 自身业务代码或者数据出现问题。第二, 一些恶意攻击、 爬虫等造成大量空命中。缓存穿透问题解决方案:...

2021-10-25 15:24:08 295

原创 Nginx安装

1.Nginx是由c编写,所以首先需要安装Nginx的运行环境yum install -y pcre-devel openssl-devel gcc curl2.下载到/usr/local文件夹下wget https://openresty.org/download/openresty-1.17.8.2.tar.gz3.解压tar -zxvf openresty-1.17.8.2.tar.gz4.进入解压文件夹执行安装命令...

2021-10-22 14:58:34 55

原创 redis高可用集群搭建和详解

一.搭建redis集群需要至少三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,这里用三台机器部署6个redis实例,每台机器一主一从。第一步:在第一台机器的/usr/local(redis的同级目录)下创建文件夹redis-cluster,然后在其下面分别创建2个文件夾如下(1)mkdir -p /usr/local/re...

2021-10-21 21:10:52 1103

原创 StringRedisTemplate和RedisTemplate与redis方法对照表

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的api。在RedisTemplate中提供了几个常用的接口方法的使用,分别是:private ValueOperations<K, V> valueOps;private HashOperations<K, V> hashOps;private ListOperations<K, V> listOps;private Se...

2021-10-20 15:13:39 319

原创 redis的主从和哨兵架构

一.主从架构 主从架构搭建 1.复制一份redis.conf文件cp redis.conf /usr/local/redis-5.0.3/redis-6380.conf 2.修改相关配置port 6380...

2021-10-20 15:05:54 78

原创 redis持久化

RDB快照在默认情况下, Redis 将内存数据库快照保存在名字为dump.rdb的二进制文件中。可以对 Redis 进行设置, 让它在“N秒内数据集至少有M个改动”这一条件被满足时, 自动保存一次数据集。 上面的配置就表示900秒内写入一次,300秒内写入10次以及60秒内写入1万次均会触发快照条件。(redis触发配置文件的快照都是执行bgsave)文件保存在哪里呢? dbfilename就是设...

2021-10-20 10:23:20 77

原创 redis核心数据结构

string 字符串 1.单值缓存SET key valueGET key 2.对象缓存 1)最常见的就是将对象转成json存入SET user:1(userId) value(json格式数据) 2) 将对象的属性分开来存储,对于一个对象有几十个属性,但只有一两个属性经常修改,就比较适合这种方式...

2021-10-19 17:17:23 159

原创 redis的安装

安装gccyum install gcc把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下,并解压wget http://download.redis.io/releases/redis-5.0.3.tar.gztar xzf redis-5.0.3.tar.gzcd redis-5.0.3进入到解压好的redis-5.0.3目录下,进行编译与安装make修改redis.conf中的配置daemonize yes #后台启动protec

2021-10-19 09:03:35 66

原创 设计模式之观察者模式

模式定义定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新应用场景当更改一个对象的状态可能需要更改其他对象,并且实际的对象集事先未知或动态更改时,请使用观察者模式。优点1.符合开闭原则2.可以在运行时建立对象之间的关系示例:public class ObserverTest { public static void main(String[] args) { Subject subj

2021-10-18 14:45:55 72

原创 设计模式之模板方法模式

模式定义定义一个操作的算法骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤应用场景1.当你想让客户端只扩展算法的特定步骤,而不是整个算法或其结构时,请使用Template Method模式。2.当你有几个类包含几乎相同的算法,但有一些细微的差异时,请使用此模式。优点1.你可以让客户端只覆盖大型算法的某些部分,从而减少算法其他部分发生的更改对它们的影响。2.你可以将重复的代码拖放到超类中。举例:publ

2021-10-18 14:18:52 201

原创 设计模式之策略模式

模式定义定义了算法族,分别封装起来,让它们之间可以互相替换,此模式的变化独立于算法的使用者。优点1.可以将算法的实现细节与使用它的代码隔离开来。2.符合开闭原则应用场景1.当你有很多类似的类,但它们执行某些行为的方式不同时,请使用此策略。2.使用该模式将类的业务逻辑与算法的实现细节隔离开来,这些算法在逻辑上下文中可能不那么重要。3.当你的类具有大量的条件运算符,并且在同一算法的不同变体之间切换时,请使用此模式。举例:比如说我们开发一个植物大战僵尸,最开始只有普通僵尸和旗手僵尸

2021-10-18 11:50:36 75

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

模式定义在不改变原有对象的基础上,将功能附加到对象上应用场景扩展一个类的功能或给一个类添加附加职责优点1.不改变原有对象的情况下给一个对象扩展功能2.使用不同的组合可以实现不同的效果3.符合开闭原则示例:我们创建一个拍照接口进行实现,实现后我们需要新加一个美颜效果public class DecoratorTest { public static void main(String[] args) { Component component = new

2021-10-12 17:23:03 60

原创 设计模式之适配器模式

模式定义将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作应用场景1.当你希望使用某些现有类,但其接口与您的其他代码不兼容时,请使用适配器类。2.当你希望重用几个现有的子类,这些子类缺少一些不能添加到超类中的公共功能时,请使用该模式。优点1.符合单一职责原则2.符合开闭原则对象适配器模式public class AdapterTest1 { public static void main(String[

2021-10-12 16:04:26 63

原创 设计模式之享元模式

模式定义运用共享技术有效地支持大量细粒度的对象优点如果系统有大量类似的对象,可以节省大量的内存及CPU资源举例比如说坦克大战小游戏中的墙或者草丛,每一个墙或者草丛都是一样的,如果我们大量创建对象的话内存占用不可想想。这时候就可以用到享元模式。首先,我们来定义墙或者树,class Tree{ private final String name; private final String data; public Tree(String name, String

2021-10-12 15:08:25 64

空空如也

空空如也

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

TA关注的人

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