自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 资源 (1)
  • 收藏
  • 关注

原创 【多线程实战】-多线程实战系列文章汇总

多线程实战系列文章汇总

2020-11-08 00:07:24 215

原创 手把手教你去除项目中的重复代码(一)---注解+反射处理接口通用逻辑

通过注解+反射的模式实现接口通用逻辑的处理。同时针对不同的参数类型还是使用了策略枚举的模式来优化代码。

2020-11-01 13:15:10 740 1

原创 【Redis项目实战 一】缓存穿透,缓存击穿分析以及实际代码解决方案

缓存穿透、热点缓存失效、以及缓存更新时一致性问题分析以及解决方案

2020-09-12 20:45:04 490

原创 缓存一致性保障方案

读写策略写:1)更新DB。2)databus监听变更3)查询主库。4)更新缓存。读:读取缓存,缓存读取不到直接返回不存在或者走DB(根据缓存类型来确定,关键信息或者低频缓存可以在缓存中不存在时降级走DB)。一致性保障:1)60s实时检查数据修复。2)JOB增量区间检查修复。3)JOB每晚全量覆盖更新。问答:问题一:监听到DTS消息后更新缓存不加锁是否会造成数据不一致?通过将DTS的分片字段指定为缓存的key,这样DTS发送的数据将严格按照Binlog的事件顺序进行发送,最后在通

2021-09-15 20:17:47 170

原创 手把手教你去除项目中的重复代码(三)---模板+策略模式消除 if…else 和重复代码

一. 前言  在实际业务开发中,常常面临多个条件判断的情况,如果不加思索就写代码,很容易出现一堆if else 的代码,导致代码逻辑不清晰,可阅读性很差。我们经藏会在项目中见到大片大片的if else,给后来人带来很大的理解成本。  过多的if else ,这是很明显的坏代码的味道,这时就应该考虑自己的设计是否合理,有没有更好的表达方式了。二. 实战下面是一个最常见的不同等级的用户采用不同的处理方法的例子普通用户需要收取运费,运费是商品价格的 10%,无商品折扣;VIP 用户同样需要收取商品价

2020-11-01 16:17:14 766

原创 手把手教你去除项目中的重复代码(二)---注解+反射实现通用的日志打印功能

上篇介绍了通过注解+反射来去除接口中通用的处理逻辑,今天继续时用这个方式,实现通用的日志监控功能。一.实现首先,定义一个自定义注解 Metrics,打上了该注解的方法可以实现各种监控功能:@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})public @interface Metrics { /** * 在方法成功执行后打点,记录方法的执行时间发送到指标系统,默认开

2020-11-01 14:54:26 298

原创 【Spring】注解(AOP)不生效原因分析以及解决方案

一 问题我们在是用spring的注解时,稍不注意就很有可能会遇到注解没有生效的情况,比如下面这段代码import org.springframework.stereotype.Component; @Componentpublic class HelloService { @Transactional public void sayHi(String msg) { //数据库操作 doSomethingInDB(); Sy

2020-10-27 21:05:28 12439 2

原创 【Redis项目实战 二】缓存更新一致性分析以及实际代码解决方案

一. 前言  上篇文章【Redis项目实战 一】缓存穿透,缓存击穿分析以及实际代码解决方案介绍了缓存穿透以及缓存击穿的应对方式。缓存更新时要注意的问题主要是缓存数据与DB中数据的一致性问题,这篇文章我们来说下缓存更新是需要注意的事项。二. 缓存更新的常用方式以及优缺点1.Read/Write Through模式以缓存订单为例,在查询订单数据的时候,先去缓存中查询,如果命中缓存那就直接返回订单数据。如果没有命中,那就去数据库中查询,得到查询结果之后把订单数据写入缓存,然后返回。在更新订单数据的时候,

2020-10-11 13:05:31 358

原创 【多线程实战 六】-线程池的常见问题以及使用的注意事项

本篇文章主要介绍 线程池使用时的相关知识。通过阅读你会有如下收获:1. 为什么不建议使用Executors快捷的工具方法创建线程池?2. 不同类型的任务混用同一个线程池有什么不良后果?3. 有依赖关系的任务使用同一个线程池有什么不良后果?4.线程池中任务的异常应该怎么处理?

2020-09-12 12:42:50 1121

原创 【多线程实战 五】-通过COW实现一个RPC框架中的路由表

本篇文章主要介绍 写时复制(COW)相关知识。通过阅读你会有如下收获:1. 什么是 写时复制的思想?2. 如何通过CopyOnWriteArraySet来实现一个RPC框架中的路由表 ?3. Java中使用COW的工具类应该注意哪些问题 ?

2020-06-27 19:31:59 306

原创 【多线程实战 四】-使用读写锁实现一个本地缓存

本篇文章主要介绍读写锁ReentrantReadWriteLock相关知识。通过阅读你会有如下收获:1. 什么是 ReentrantReadWriteLock?2. 如何通过ReentrantReadWriteLock实现一个本地缓存服务?3. ReentrantReadWriteLock简单总结

2020-06-27 18:17:25 470

原创 【多线程实战 三】-通过CyclicBarrier来优化对账程序的执行效率

本篇文章主要介绍CountDownLatch 相关知识。通过阅读你会有如下收获:1. 什么是 CyclicBarrier ?2. 如何通过CyclicBarrier 来优化对账程序 ?3. CyclicBarrier 与CountDownLatch的区别 ?

2020-06-21 18:51:03 403

原创 【多线程实战 一】-通过AQS实现一个自定义同步锁

本篇文章主要介绍AQS相关知识。通过阅读你会有如下收获: 1. 什么是 AQS ? 2. 如何通过AQS实现一个自定义的锁? 3. ReentrantLock如何实现 可重入以及公平/非公平锁?

2020-06-21 12:41:56 299

原创 【设计模式实战】-使用装饰器模式优化复杂的商品价格的计算

一 . 装饰器模式简单的介绍    装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。  JDK中I/O相关的接口就是基于这种设计模式实现的。需要注意的是I/O中通过FilterInputStream类来实现了InputStream 所有的默认方法,这样其

2020-06-20 21:03:21 1068

原创 【多线程实战 二】-同步工具类CountDownLatch实现一个程序启动检查服务

本篇文章主要介绍CountDownLatch 相关知识。通过阅读你会有如下收获:1. 什么是 CountDownLatch ?2. 如何通过CountDownLatch实现一个程序启动检查服务?3. CountDownLatch源码如何实现的

2019-12-23 10:13:10 214

原创 【多线程】AQS以及线程状态转换

在介绍本接之前需要首先了解下AQS中队同步器的实现以及Condition对应的实现。一 AQS 队列同步器同步队列同步器依赖内部的一个FIFO双向队列来管理同步状态,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构成一个Node节点加入到同步队列中。同时阻塞当前线程,当同步状态释放时,会将那首节点中的线程唤起,使其再次尝试获取同步状态。同步队列中的节点(node)用来...

2019-11-22 19:37:27 754

原创 【GIT】必看的git分支创建与合并流程讲解(图文,超级详细!)

在日常工作中我们经常遇到分支创建与合并的。下面让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。你将经历如下步骤:开发某个项目。为实现某个新的需求,创建一个分支。在这个分支上开展工作。正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。你将按照如下方式来处理:切换到你的线上分支(production branch)。为这个紧急任务新建一个分...

2019-11-03 09:28:27 855

原创 【多线程】- Java中线程以及线程池的状态

一、线程的5种状态新建(New) :使用new Thread() 创建一个线程之后。运行(Runnable) :使用Thread.start() 方法之后。启动一个线程,该线程会进入等待队列等待CPU的执行,因此可以细分为runnable和running状态。无限等待(waiting) :处于这种状态的线程,不会被分配CPU执行时间,需要等待其他线程显式地唤醒,然后进入运行状态。调用Th...

2019-11-01 15:52:22 176

原创 Redis数据结构---链表

二 链表链表提供了高效的节点重排能力,以及顺序访问节点的访问方式,并且可以通过增减节点来灵活调整链表长度,在Redis中使用非常广泛,比如列表键,发布与订阅,慢查询,缓冲区等。Redis中链表节点使用listNode来表示,其结构如下:`struct listNode{//前置节点struct listNode *prev//后置节点struct listNode *next/...

2019-09-14 15:40:21 89

原创 Redis数据结构---简单动态字符串(SDS)

简单动态字符串(SDS)一. SDS的定义redis中专门构建了一种数据结构用来表示字符串,并将其命名为简单动态字符串(simple dynamic sting,SDS)。其结构如下struct sdshdr{//记录buf数组中已经使用的字符串数量,等于SDS说保存的字符串长度int len;//记录buf数组中未使用的字节数量int free;//字节数组,用于保存字符串...

2019-09-05 20:45:59 92

原创 项目开发中Git使用规范

在团队开发汇总,使用Git来进行版本管理应该遵循一个清晰合理的使用流程,保持仓库的整洁清晰,以便于维护协调。当接到一个新需求时,一般可以使用如下流程来进行开发。新建分支开发新功能时,都应新建一个单独的分支。#查看当前git状态git status#若不在主干,则切换至主干git checkout maser#更新主干代码,确保本地仓库与远程同步git pull#新建分支g...

2019-09-03 20:31:35 324 1

原创 Java集合遍历方式

一 数据元素在内存中存放方式链式存储每一个数据元素,在内存中都不要求处于相邻的位置,每个数据元素包含它下一个元素的内存地址。不可以根据元素的位置直接计算出内存地址,只能按顺序读取元素。读取一个特定位置元素的平均时间复杂度为O(n)。主要以链表为代表。Java中以LinkedList为代表。顺序存储相邻的数据元素存放于相邻的内存地址中,整块内存地址是连续的。可以根据元素的位置直接计算出内存...

2019-08-21 20:23:04 197

原创 常用的Git命令总结

Git一些常用命令

2019-08-20 19:34:59 66

原创 【Linux】工作中常用linux指令总结

工作中常用linux指令一.基础操作1.显示当前目录包含的文件 lsll 显示文件权限等信息ll -m 以M显示文件大小2.移动、复制、删除、创建目录、赋权移动/home/test.jar 到/app/test目录下 mv /home/test.jar /app/test复制/home/test.jar 到/app/test目录下 cp /home/test.jar /a...

2019-08-19 20:04:20 146

CountDownLanch.rar

CountDownLatch使用实例 - 初始化时,设置计数(count)值,也就是闭锁需要等待的线程数。 - 主线程必须在启动其他线程后立即调用 CountDownLatch.await() 方法,这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务为止。 - 其他 N 个线程必须引用闭锁对象,因为它们如果完成了任务需要通过 CountDownLatch.countDown() 方法来通知CountDownLatch实例,每次调用计数减少 1。当所有 N 个线程都调用了这个方法时,计数将达到 0,主线程可以在 await() 方法之后继续执行。

2019-12-20

空空如也

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

TA关注的人

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