- 博客(22)
- 收藏
- 关注
原创 关于分布式事务实战总结
今年开发过很多类似本地积分扣减、本地库存扣减,同时调用rpc进行发券、兑换0元单等业务,对于分布式事务有了一点自己的开发经验,这里记录一下。1、基本前提在我看来,两个操作,想要保证分布式事务,必须有一个大前提,就是这两个操作都是幂等操作,也就是带着同一个幂等参数进行请求时,无论请求多少次,结果都和请求一次是一样的。操作是幂等的,才可保证操作可重试,这是分布式事务的关键。无论是AT模式,还是TCC(try-commit-cancel)模式,当一次请求失败后,都需要可以支持用户或者业务的重试。2、简单实
2021-02-27 10:58:57 194
原创 关于高并发下高可用的实战总结
毕业这一年多来,对于学生时代面试“必考”的高并发,主要是高并发状态下的读接口,有了一些实战的经验,这里记录和总结一下。在我看来,如果一个后端流程要能够扛住高并发大流量,必须严格经历以下几个流程:1、梳理关键路径首先我们需要梳理一个业务流程的关键路径以及次要路径,比如展示一段商品列表,最核心的过程就是要使得商品列表给用户正常展示,不影响用户进入商详和下单,即商品的列表,以及商品的基本属性是主业务流程。而关于商品的其他属性,比如商品的标签、商品包含什么优惠券、商品有哪些服务能力等等,这些其实属于对商品列
2020-09-04 23:30:17 346 1
原创 Redis读书笔记二:单机数据库
一、redis数据库1、键空间redisDb结构中的字典dict,保存着数据库中所有的键值对,称之为键空间。键空间的键即为数据库的键,键空间的值即为数据库的值,对redis数据库的添加、删除、更新、查找等操作,实际上是对键空间这个字典的增删改查操作。2、过期字典redisDb结构中的字典expires,保存了数据库中所有键的过期时间,称之为过期字典。过期字典的键是指向键空间中的某个键对象,过期字典的值是一个long long类型的整数,保存了键所指向的数据库键的过期时间,其是一个精确到毫秒的UNIX
2020-09-12 10:42:46 196
原创 Redis读书笔记一:基本数据结构
众所周知redis是由C语言实现的,包含有五种数据结构,跟别是string、list、set、hash以及sort_set,今天学习了关于string结构的底层涉及。1、SDS的结构redis的string结构,是对C语言的string结构进行了一层封装,可以称之为SDS(Simple Dynamic String 简单动态字符串)。除了包括有基本的char[]数组buf之外,还包括有一个int类型的len(buf数组中已占用的字节数量),以及一个int类型的free(buf数组中未使用的字节数量)。
2020-09-03 17:48:07 168
原创 日常学习笔记
学习笔记消息队列1、消息队列的作用及对比消息队列主要用到的为rabbitMQ,RocketMQ以及kafka,其中rabbitMQ是用erlang编写的比较稳定的MQ,但是不容易深入去掌握;RocketMQ是阿里出品的稳定MQ,但是目前社区不活跃;kafka主要用于大数据领域以及记录日志,可用性非常高。2、消息队列的作用解耦:作为中间层灵活的配置生产者和消费者 异步:将某些耗...
2019-11-04 14:24:09 193
原创 MySQL-学习
MySQL-学习MySQL学习笔记1、事务隔离隔离级别 读未提交:一个事务还未提交时,做的变更就可被别的事务看到 读提交:一个事务提交后,才可以被其他事务看到 可重复读:一个事务执行过程中看到的数据,总跟这个事务在启动时看到的是一致的 串行化:对于同一行记录进行加锁,访问串行化 Innodb事务的视图理解在实现上,数据库里面会创建一个视图,访...
2019-11-04 14:22:32 157
原创 踩坑--Java从缓存中直接引用集合,报ConcurrentModificationException异常
1、背景该异常出现的原因是集合的参数发生了变更,一般是因为集合的长度发生了变化,大量出现在某天晚上的压测中。2、原因因为我在写新版功能的时候,我就将某个list直接从本地缓存的兜底中读取,没有new一个新的list,只是简单的引用。开始以为这种操作没问题,因为也只对这个集合进行了读操作。但是没想到,对list进行分割的操作,也有可能会导致ConcurrentModification...
2019-10-01 14:42:02 187
原创 redis expire方式设置缓存时间的坑
最近入职后一直很忙,今天国庆值班,把前段时间遇到的问题抛出来总结一下。1、背景在项目中需要记录用户的相关状态,这些状态会在一天内清除,且又不止0/1这两种状态,于是考虑将其放在一个hash的key当中。但是redis对于hash类型,并没有提供直接设置超时时间的支持,于是设计采用expire一个key的过期的时间方式来实现当日过期。2、问题通过观察发现,隔天的数据,在共用一个k...
2019-10-01 14:25:25 4746
原创 Java8的Optional类解决NPE,同时又避免多次if-else
像我这种Java初学者非常容易写出NPE,为了避免NPE,会很无奈的使用多次if做判断,感觉代码会很难看。今天偶尔看到了Optional方法,是Java8提供的一种新写法,觉得很有意思,记录一下。通过dubbo的远程调用会经常写出这种类似的代码,虽然多次通过if判断避免空指针,而且也提前返回了结果,但是还是感觉这种写法比较难看:response = dubboService.get(...
2019-08-29 11:36:54 1598
原创 缓存中的三大问题(常见面试题)
缓存的设计一般都遵循以下流程:1、业务系统发起一个查询请求,首先会在缓存中判断是否存在对应结果的数据2、如果缓存中存在,则直接返回数据结果3、如果缓存中不存在,则会去数据库中查询对应数据,并更新缓存,然后返回数据结果 我们在面试时,问道的关于缓存的问题很多,但是涉及实际场景的题目一般可以分为以下三类:1、缓存穿透:当业务系统需要查询的数据根本在数据库中不存在时,每一...
2018-12-03 10:48:07 5125 1
转载 消息队列如何做到消息幂等性
一、缘起如《消息总线消息必达》所述,MQ消息必达,架构上有两个核心设计点:(1)消息落地(2)消息超时、重传、确认 再次回顾消息总线核心架构,它由发送端、服务端、固化存储、接收端四大部分组成。 为保证消息的可达性,超时、重传、确认机制可能导致消息总线、或者业务方收到重复的消息,从而对业务产生影响。 举个栗子:购买会员卡,上游支付系统负责给用户扣款,下游系...
2018-11-28 15:15:27 618
转载 BIO与NIO、AIO的区别
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒...
2018-11-15 17:15:28 186 1
转载 Dubbo+Zookeeper的使用和介绍
Dubbo是什么?Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式...
2018-11-15 09:56:37 226
转载 dubbo和webservice 区别
如何实现远程通信?远程通信:Webservice、restful、dubbo1、Webservice:效率不高基于soap协议,其主要的特点是跨语言、跨平台的。项目中不推荐使用,可用于不同公司间接口的调用。2、使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。3、使用dubbo。使用rpc协议进行远程调用,直接使用s...
2018-11-14 14:06:50 1955
原创 生产者消费者示例
首先创建一个生产者线程类,继承Runnable接口来创建线程,重写run方法,包含一个BlockingQueue常量参数:import java.util.concurrent.BlockingQueue;/** * author:DingwenDeng * Date:2018/9/11 9:29 */public class Producer implements Runnab...
2018-09-20 11:05:35 189
原创 装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。介绍意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。何时...
2018-08-20 20:07:48 105
转载 Java实现动态代理示例
首先定义一个接口public interface IStars { void sing(); void dance();}其中有两个对应star的方法,dance和sing;然后定义一个star类来实现这个接口public class Stars implements IStars { private String name; publ...
2018-08-15 10:38:16 1924
转载 发布和使用WebService
如何才可以发布一个WebService呢? 在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。 JAX-WS是指Java Api for XML – WebService.用Jdk1.6.0_21以后的版本发布一个WebService服务. 与Web服务相关的类,都位于javax.jws.*包中。 主要类有: @WebS...
2018-08-12 21:02:22 471 1
原创 Spring AOP的配置和实现
因为接下来要记录日志,所以把日志的配置文件也一起导入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> ...
2018-08-11 21:26:32 182
转载 多线程下单例模式
public class Singleton { private static volatile Singleton singleton = null; private Singleton(){} public static Singleton getSingleton(){ if(singleton == null){ s...
2018-08-11 12:28:41 276
转载 Java死锁
public class DeadLockSample extends Thread{ private String first; private String second; public DeadLockSample(String name, String first, String second){ super(name); thi...
2018-08-11 12:24:03 74
原创 Future模式示例
1、Future的核心思想是:一个方法f,计算过程可能非常耗时,等待f返回,显然不明智。可以在调用f的时候,立马返回一个Future,可以通过Future这个数据结构去控制方法f的计算过程。这里的控制包括:get方法:获取计算结果(如果还没计算完,也是必须等待的)cancel方法:还没计算完,可以取消计算过程isDone方法:判断是否计算完isCancelled方法:判断计算是...
2018-08-11 12:23:55 729 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人