自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 实现一个mybatis

需求分析执行sql对结果集进行友好封装使用简单性能优化代码设计代码架构代码执行流程代码精剪初始化@Componentpublic class MybatisInit implements ApplicationContextAware{ @Value("${mybatis.mapperPackage}") private String mapperPackage; @PostConstruct public void init() throw

2020-11-08 15:40:12 159

原创 你还在写controller吗?

传统的三层架构controller 控制层service 业务层dal 数据访问层目前常见的web开发基本是这个架构,其中比重最大的是service层,dal层基本依赖于mybatis等框架解放了出来,其实controller层对于我们来说意义也是不大的,所以本期打算实现一个类似网关的框架。好处提升效率,解放controller统一入口,便于规范框架设计代码实现自定义注解Target({ElementType.METHOD,ElementType.TYPE})@Reten

2020-10-29 20:08:09 266 1

原创 实现一个简单的rpc框架——simple-rpc

代码链接https://github.com/yutian1999/simple-rpcrpc-server rpc服务端 服务的提供者依赖此模块rpc-client rpc客户端 服务的调用者依赖此模块rpc-common 公共模块demoprovider-demo 服务提供者示例consumer-demo 服务调用者示例技术分析rpc远程调用的本质是对引用的依赖进行代理底层偷偷进行远程调用。技术依赖netty (通信,进行远程调用cglb (代理,对本地方法调用代理

2020-10-25 21:36:20 310 1

原创 myCache 2.0——主从模式

代码地址https://github.com/yutian1999/my-cache升级功能支持主从模式通过主从不同节点实现读写分离,进而支持更高的并发依赖技术webSocketnetty基于netty实现的webSocket用于master节点与salve节点实现通信设计与实现同步的两种机制同步命令传播master节点作为服务端,salve节点作为客户端,salve节点向master节点发起连接,master节点向salve节点传输数据。maste

2020-10-18 17:04:45 437 1

原创 基于webSocket实现一个简单的im系统

实现功能im系统代码地址https://github.com/yutian1999/my-chat/tree/master选用技术webSocket为什么使用webSocket?webSocket协议支持服务端像客户端推送消息http协议是一次请求一次响应,如果想要基于http协议实现只能客户端轮训,无论是性能还是实现上都远不及webSocket依赖技术Spring-boot webSocket <dependency> <groupId&

2020-10-13 21:48:45 581 1

原创 实现一个mini版的redis——myCache

应用场景小型应用(更轻量级)分布式系统中全局缓存支持分布式锁支持过期时间架构设计架构设计是期望客户端与服务端的调用方式的,因为服务端单独部署有以下三种好处不与应用jvm耦合,可用于分布式系统过期策略采用定期删除和惰性删除两种(如果服务端不单独部署就只能实现惰性删除,即get key时判断是否过期并进行是否删除操作)服务端单独部署支持持久化同时考虑到本身my-cache是用于小型服务的,也提供jar包方便本地调用,使用这种方式的唯一处好是我们提供了过期时间的功能。代码结构

2020-10-12 20:05:08 280

原创 记一次写框架的心路历程

背景周五的时候,我的主管把我叫过去说有一个需求很急,采用传统的开发模式可能来不及,他说他打算开发一个框架来快速集成,当然把我叫过去的目的是和他一起开发,他给我的任务是,让我开发一个轻量级的mybatis,大致要求如下两点:不要xml文件要有缓存老实讲我之前是没有开发过框架的,并且mybatis我虽然用的是很溜,但是源码我确实没有看过,而且只有一天时间,难度对我来说是挺大的。于是我继续和我的老大沟通,他具体是要干什么,他说就是能执行sql就好,突然一道灵光乍现,既然这样我们用JDBC不就好了,老

2020-06-08 00:23:35 223

原创 锁降级

前言上篇文章写了synchronized的锁升级,本文主要来写下java中的锁降级,其实在很多书中和博客里的观点都是没有锁降级这一说的,但是java中确实有锁降级的场景。锁降级锁降级发生在读写锁中,写锁降级读锁的过程。读写锁ReentrantReadWriteLock读写锁,既可以获取读锁,也可以获取写锁需要明确的是:写锁是独占锁,所谓独占即为独自占有,别的线程既不能获取到该...

2020-05-05 16:13:25 529

原创 synchronized锁升级及demo验证

synchronized锁我们都知道在jdk 1.5时,synchronized锁是一个重量级锁,缺点如下:每次获取和释放锁都会带来用户态和内核态的切换,从而增加系统的性能开销 在锁竞争激烈的情况下,synchronized同步锁的性能很糟糕在JDK 1.5,在单线程重复申请锁的情况下,synchronized锁性能要比Lock的性能差很多在jdk 1.6时对synchronized进...

2020-04-19 22:37:25 124

原创 线程通信的四种方式

线程之间为什么要通信?通信的目的是为了更好的协作,线程无论是交替式执行,还是接力式执行,都需要进行通信告知。那么java线程是如何通信的呢,大致有以下四种方式。Java线程的通信方式volatile等待/通知机制join方式threadLocalvolatile关键字方式volatile有两大特性,一是可见性,二是有序性,禁止指令重排序,其中可见性就是可以让线程之间进行通信。...

2020-04-12 23:34:20 3471

原创 double-check的单例模式安全吗?

今天是清明长假的第二天,清明也是国内疫情好转的首个假期,因为疫情在家憋坏了的小可爱们也是撒了欢的想往外跑,恰值风和日丽,邀三五好友爬山郊游,作为以记之。跟着小姐姐去爬山上山乱入别的户外社团,大概是看社团小姐姐比较多山路再险也难不住环岛小马哥路上的野花相比粉的,我更爱这娇艳艳的红色山脚风景山腰风景...

2020-04-08 23:30:36 504

原创 线程池参数调优

ThreadPoolExecutorThreadPoolExecutor构造函数的五大参数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ...

2020-03-29 18:00:24 1486

原创 手写AQS锁解决秒杀超卖

业务场景电商活动的秒杀场景,在并发过来的时候很容易出现库存扣超的情况,一个很简单的例子是,两个线程同时拿到了库存为1的数据,同时扣减库存,那么库存就会变为负的。所以要解决这个问题还是要让请求串行,串行的最好方式就是加锁,今天我们要探讨的是AQS的锁实现。AQS锁的三大核心自旋lockSupportCAS自旋获取锁失败的线程会通过自旋的方式重复获取锁,自旋也可以理解为死循环。l...

2020-03-09 19:18:04 430 1

原创 数据库表设计之慷慨是不明智的

今天没事的时候翻了翻《高性能的mysql》,看了一个很简单的章节,但是也让我收获了一个不小惊喜。看的是mysql的数据类型,可能大家会觉得可笑,mysql的数据类型有什么好看的?下面我就来讲解一下我的发现。char 和 varchar究竟该如何选用?这个问题大家猛然一看很简单,但是仔细一想会发现并不知道该怎么选用,因为我们大部分的时候都会选择varchar,我甚至去看了我们的数据库的表设计,其...

2020-03-05 21:04:02 134

原创 redis分布式锁可靠吗

写在前面的话2020年2月22日来杭,杭州天气不错,晴空万里,气温回暖,疫情彷佛散去,而我开始了既定的跳槽,投简历,刷面试片刻未敢停留。一周下来也差不多面了10来家公司,反馈还行,但是并没有想象中的那么好,总体来看杭州互联网既没有那么好,也没有想象的那么槽。所以小伙伴们适度焦虑就OK,重要的还是提升自己的硬实力。下面来讲几个面试碰到的有意思的问题吧。如何确定分布式锁的...

2020-03-04 21:32:29 448

原创 一文搞定联合索引

联合索引上文讲解了索引的底层结构,但是留了一个尾巴,就是没有去讲复合索引。今天来继续梳理复合索引,所谓复合索引即是由多个字段组成的一条索引。例如下表CREATE TABLE `test` ( `id` int(4) NOT NULL AUTO_INCREMENT, `a` varchar(10) NOT NULL, `b` varchar(10) NOT NULL, `c` ...

2020-03-02 21:37:24 481

原创 mysql B+树索引

索引索引是什么?索引是一种数据结构,是一种能够帮助我们快速定位到数据的数据结构。最长常见的数据结构有数组、链表、二叉树、红黑树。数组我们如何定值查询?只能遍历比较了,最差的情况下要遍历所有元素,时间复杂度O(n)。链表如何定值查找元素?那就更只能靠遍历每一个节点来实现了,时间复杂度O(n)。二叉树如何查找元素?从根节点向下遍历,就查找二叉树来说,时间复杂度是O(log n)。但是二叉树有...

2020-03-01 21:59:53 321

原创 mysql事务隔离机制

前言今天面试竟然在事务的隔离机制上栽了跟头,虽然面试官说不影响正常的面试,但是我还是想抽死自己,之前什么AICD、脏读、虚度、幻读天天挂在嘴边的,今天竟然捋不清了。世间铁一般的道理,不用就会忘记,在此体现的淋漓尽致。索性再来梳理一下吧。事务的特性1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的...

2020-02-27 22:09:16 143

原创 求二叉树最小值

题求二叉树节点中的最小值。如上图的最小值应该是5.分析这道题我们先分析一下一个最小的二叉树的最小值怎么求解决方法Math.min(Math.min(node.val,node.left.val),node.right.node)然后我们再来看一颗参天大树如何求解,递归代码实现 /** * * @param node * @return ...

2020-02-24 23:36:11 5217 1

原创 移动支付清算平台介绍

移动支付移动支付是指移动客户端利用手机等电子产品来进行电子货币支付,移动支付将互联网、终端设备、金融机构有效地联合起来,形成了一个新型的支付体系,并且移动支付不仅仅能够进行货币支付,还可以缴纳话费、燃气、水电等生活费用。移动支付开创了新的支付方式,使电子货币开始普及。上面的定义摘自百度百科,简而言之移动支付就是以电子设备替代货币支付的一种新型支付方式。移动支付的演变历程移动支付由最开...

2020-02-23 21:29:38 872

原创 自研每秒生成100万全局唯一id算法

背景系统tps是3000,采用分布式部署,业务单号需要全局唯一,例如订单号。常见的分布式全局id的方案网上有很多种,大致有以下几种:UUIDredis原子性自增zookeeper节点目录SnowFlake(雪花算法)国内大厂基于雪花算法的算法,如美团的leaf以上解决方案大致分为三类UUID中间件(redis、zk)类雪花算法UUIDuuid实现较为简单,但是无规律...

2020-02-23 17:27:20 668 1

原创 手撕leetcode153题

题目假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1示例 2:输入: [4,5,6,7,0,1,2]输出: 0分析需要注意的是这个数组最开始是有序的,如{1,2,3,4,5...

2020-02-18 20:54:10 206

原创 leetcode152题之动态规划

动态规划动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decisionprocess)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistepdecision process)的优化问题时,提出了著名的最优化原理(principle ofoptimality),把多阶段过程转化为一系列单阶段问...

2020-02-17 22:11:03 113

原创 二叉树

树在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:①每个节点有零个或多个子节点;②没有父节点的节点称为根节点;③每一个非根节点有且只有一个父节点;④除了根节...

2020-02-16 22:44:37 245

原创 leetcode刷题两个有序数列合并成一个有序数列

前言这次之所以没有指定某一个题,是因为今天想同时写两道题,分别是链表和数组的合并。即:两个有序链表合并成一个有序链表两个有序数组合并成一个有序数组数据合并题1将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->3, 2->3->4输出:1->2->2->3->3-...

2020-02-12 22:42:23 1918

原创 leetcode第141题链表有无环

题目给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos = 0输出:tru...

2020-02-11 00:28:52 105

原创 java 链表基础详解

拨开链表迷雾链表是基础的数据结构之一,和数组一样基础,提到链表我们总会联想到数组结构,最顺嘴的一句话便是数组适合查询,链表适合插入,但是这句话其实说的太过于简单,以至于就不是那么准确了,我们来细细分析下这句话。数组适合查询?数组适合查询这句话其实准确说应该是数组基于下标查询效率较高,时间复杂度是O(1),如果用其值去数组中查询,效率也是不高的,时间复杂度和链表一样,是O(n),所以我们在使用...

2020-02-09 20:05:58 2560 3

原创 类加载机制

类的生命周期一个类从被加载到内存中开始,他的生命周期包括以下几个阶段:加载验证准备解析初始化使用卸载上面七个过程中,加载、验证、准备、初始化的顺序是确定的,但是解析和使用由于要支持java语言的运行时绑定,所以顺序不能确定。类加载时机类是什么时候开始加载的?虚拟机并没有明确规定,可以由虚拟机自行实现,但是在类初始化前类必须被加载,虚拟机明确规定了有且只有5种情况必须进行...

2020-02-01 19:27:53 114

原创 装饰器模式和代理模式浅析

前言今年大年初四,在家窝着第五天了,无聊至极,今天就来写一下设计模式吧。设计模式是大师们编码经验的总结,没有什么神的,今天来写一下装饰者模式和代理模式吧。代理模式和装饰者模式本质上是很像的,都是对一个类的扩展。第一个类扩展的有以下三种途径:继承有子类重写方法进行扩展装饰者模式代理模式装饰者模式装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又...

2020-01-28 16:12:30 180

原创 开发实用linux命令

前言今天是大年初二,今年新型冠状病毒肆虐,在家宅了3天了,实在无聊,索性总结下知识。今天来梳理下实用的linux命令,注意是实用!非常实用!这些命令是我处理线上问题经常用到的。实用的linux命令日志查询 cat tmp.logcat filename 查询整个文件,但是有时候线上日志文件会很大,这样打开整个文件会很耗时而且无法精准定位到想要的日志信息。比如你想看下项目启动时的日志,可...

2020-01-26 15:59:25 95

原创 非阻塞线程编程之美

背景今天年后最后一天了,是不是很羡慕?不要羡慕,虽然是最后一天了,但是我依然在code的路上,只不过没有在写业务代码了,而是在写一些自己感兴趣的东西,前几天翻了翻多线程的东西,感觉还是又有新的收获的,于是今天又抽空看了下。线程阻塞我们都知道多线程可以提高系统处理业务的能力,但是我们有没有考虑过,很多时候我们编写的多线程代码是阻塞的,尤其是主线程大部分需要阻塞,比如我们常用的join,还有fu...

2020-01-16 16:39:59 161

原创 Java Nio

Java Nio简介java Nio指的是java在1.4版本后推出的new io,nio的主要特性提升是io操作不再是阻塞的了,通常io我们会分为文件io和网络io,对于文件io操作nio还是阻塞的,但是对于socket的操作则不是阻塞的了。由于oio(旧io)是阻塞的所以是无法在单线程内实现并发的,只能依赖一个io操作一个线程的方式来实现并发,但是线程的开销对于系统来说是太大了,而nio的...

2020-01-14 21:37:48 79

原创 java多线程浅析之sleep、wait、join详解

前言年末业务需求不是很忙了,下班没事重新研究了下多线程相关的知识,感觉对java多线程又有了一个新的认识,所以打算写篇博客总结下。线程的五种状态新建(NEW):新创建了一个线程对象。可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权运行(RUNNI...

2020-01-10 21:12:46 1272 1

原创 一文详解jvm知识

#### 内存分布

2020-01-09 20:40:38 192

原创 redis集群

前言上篇文章梳理了redis的哨兵,截止到目前redis的原理已经梳理了四篇文章,键的过期策略、持久化、主从复制和redis哨兵,今天接着来梳理redis集群模式,之前我们谈到了主从复制是为了提高并发,哨兵模式是为了高可用,那么redis集群的意义是什么呢?这里我们先不谈redis集群的意义,我们来想象我们自己的业务系统的集群部署。如上图所示一个简单的集群部署方式,在单机无法满足我们并发需求...

2020-01-04 19:40:44 132

原创 redis哨兵

前言上一篇文章梳理了redis的主从复制,今天来继续梳理redis的另一个功能哨兵,如果说redis的主从复制是基于高并发的设计理念,那么sentinel(哨兵)则是基于高可用的,我们知道redis主从架构模式是为了实现读写分离,从而能够支持更高的并发,那么哨兵则为了保证redis的可用性的一个监控服务器,哨兵不支持redis服务器的类似数据库的功能,而是充当主从服务器的护卫的角色,在发现主从服...

2020-01-01 21:44:12 194 1

原创 redis主从复制

前言前两篇文章分别梳理了redis的键过期策略和redis的持久化技术,今天接着来梳理redis的相关知识,今天梳理的内容是主从复制。梳理之前,我们首先来思考一个问题,主从复制的意义在哪里?其实redis的主从和我们数据库的主从是一样的,我个人的理解主从的目的是读写分离,而读写分离的目的可以提高系统的TPS。无论对于mysql数据库还是redis来说,读的操作都会比写的操作多,而写的操作又常常会...

2019-12-26 20:28:32 207

原创 redis持久化

前言上一篇文章介绍了redis的过期策略,介绍完策略后,我们也提到了redis的持久化是如何处理过期键的,本文我们会关注redis的持久化技术。在介绍redis持久化技术前,我们先来思考一个问题,redis为何要实现持久化?我们知道redis大部分是用作缓存的技术的,但是其实redis其实还有很多是作为数据库功能的,比如电商里的最近一周浏览列表的展示,对于这些数据我觉得确实没有存在mysql数...

2019-12-22 20:54:58 118

原创 redis键过期键略

前言最近又开始看书了,最近在看关于redis的书,之前就提到了看书不梳理基本上看完之后只是开了个眼界,书中的知识留在脑海里的基本没有,所以后来再看书我就会梳理成文章记录下来,一方面可以分享出去,一方面可以作为自己的笔记。redis过期时间的实现用过redis的人都知道redis有key过期的功能,这个功能也是深受很多开发人员的青睐。那么你知道redis是如何实现这一功能的吗?其实redis为...

2019-12-21 20:21:22 141

原创 spring-boot定时任务不执行

问题基于Spring-boot实现一个定时任务,发现任务不执行。代码实现@Componentpublic class JobTest { private static final Logger logger = LoggerFactory.getLogger(JobTest.class); @Scheduled(cron = "* * * * * ?") pu...

2019-12-20 10:12:26 1949

空空如也

空空如也

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

TA关注的人

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