- 博客(50)
- 收藏
- 关注
原创 docker中安装mysql,远程连接
搜索mysql镜像建议使用Oracle官方标记的拉取镜像启动mysql镜像需要做端口映射进入mysql容器,开放root账户授权。
2023-11-29 21:17:03 476
原创 电商网站如何规避二清风险
电商网站如何规避二清风险什么是二清?二清,通俗来说,就是二次清结算,是指有清结算资质的机构将资金结算给入网的商户后,该商户再将资金清结算给下游的子商户,着该商户没有清结算资质的话就属于二清了,二清的本质是没有清结算资质的机构。却提供清结算的服务。哪些机构可以做清结算呦?如:奥行、银联和银行具有清结算的资质,还有现在的第三方支付公司(有支付牌照的)都是合规合法的。如何规避二清分析1:电商系统内部建立虚拟账户2:对接第三方持牌具有分账能力的支付机构以微信支付为例:1:交易系统收单以后,在微信创建预
2022-05-25 23:36:09 996
原创 如何设计一个高性能积分系统
# 如何设计一个高性能积分系统功能说明1:用户签到可以获得积分,需要按照用户维度每天进行用户总积分排行榜2:需要近实时更新排行榜3:在积分相同的情况下,需要按照先注册的用户排在前面4:用户量100w5:排行前20名称6:实现积分新增,扣减,过期等能力。排行榜设计1:排行榜的实现可以借助redis的SortedSet数据结构实现排行榜,sortedSet可以按照我们给的score进行排序,但是SortedSet的性能会随着元素的数量急剧下降。这里每次写入新的移除旧的数据,保证排行的数量在
2022-05-24 00:19:46 1581 1
原创 如何实现一个排行榜
如何实现一个排行榜场景1:用户签到可以获得积分,需要按照用户维度每天进行用户总积分排行榜2:需要近实时更新排行榜3:在积分相同的情况下,需要按照先注册的用户排在前面4:用户量100w5:排行前20名称设计1:排行榜的实现可以借助redis的SortedSet数据结构实现排行榜,sortedSet可以按照我们给的score进行排序,但是SortedSet的性能会随着元素的数量急剧下降。这里每次写入新的移除旧的数据,保证排行的数量在100个2:用户每次签到都去更新排行榜,可能导致redis
2022-04-20 00:00:34 4329
原创 分布式系统debug日志链路日志-OnlineDebug
MDC 分布式日志调用日志系统-OnlineDebug1、背景在分布式系统中,在排查线上问题的时候我们希望可以通过请求的唯一ID(或者用户Id等),打印整个请求在多个系统中的全链路,帮助我们提升问题排查能力。下面事我梳理的几个需求点:1:可以通过动态配置userId,来全链路开启该userId的全链路日志。2:在多线程池执行任务下,切换线程,也可以打印debug日志。3:duboo调用其他服务,这个动态中的userId可以传递。1:log4j2的MDC的能力2:Dubbo的RpcContex
2022-04-18 00:07:32 427
原创 HashMap的源码关键解读
HashMap的源码关键解读一:整体结构hashMap的源码有太多文章解读了,这里只是记录关键点。对很多不重要的东西略过了。java8以后对于hashMap的整体做了优化,是基于一个数组+链表+红黑树的实现。结构图如下:二:key索引映射当我们往hashMap里面put数据的时候,会先获key在数组中的位置。但是hashMap为了让我们的数据在数组中更加分散,在取模前进行了散列hash。 static final int hash(Object key) { int h;
2022-03-26 21:57:35 965 2
原创 RocketMq对于消费者对于消息的如何处理的
RocketMq对于消费者对于消息的如何处理的1:如果设置了自动提交返回:ConsumeOrderlyStatus.COMMIT, ConsumeOrderlyStatus.ROLLBACK, ConsumeOrderlyStatus.SUCCESS , 返回者三种状态都是会提交offset,但是返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT 会校验是否重试。达到重试次数(达到设定的重试次数会投递到重试队列,见下文)还是失败也会提交offe
2022-02-06 16:55:31 2430
原创 装饰者设计模式在业务中的实践
装饰者设计模式在业务中的实践 装饰者设计模式在顾名思义就是在原来逻辑上进行一层装饰逻辑,从而实现不通过if-else实现对优雅的对基础逻辑的扩充。在JDK源码中的InputStream中就有使用了装饰者的设计模式。从而实现通过BufferedInputStream、DataInputStream等其他修饰InputStream,增加了缓存读取、类型读取等功能,相当于InputStream之上加了很多修饰功能,在所以它是一个装饰器模式。这里inputStream作为一个被装饰的类,然后Buffer
2022-01-16 23:27:41 146
原创 Mybatis实现分包定义数据源
Mybatis实现分包定义数据库背景业务需求中需要连接两个数据库处理数据,需要用动态数据源。通过了解mybatis的框架,计划 使用分包的方式进行数据源的区分。原理前提:我们使用mybatis都会有四个步骤1:构建SqlSessionFactory2:通过SqlSessionFactory 获取到sqlSession 对象3:通过sqlSession对象获取Mapper的动态代理对象4:通过执行动态代理对象获取返回值其实点开sqlSessionFactory就的Configuration
2022-01-09 16:43:29 673
原创 JAVA日志体系发展史
JAVA日志发展史第一阶段2001年以前,Java是没有日志库的,打印日志全凭System.out和System.err缺点:产生大量的IO操作同时在生产环境中无法合理的控制是否需要输出输出的内容不能保存到文件只打印在控制台,打印完就过去了,也就是说除非你一直盯着程序跑无法定制化,且日志粒度不够细第二阶段2001年,一个ceki Gulcü的大佬搞了一个日志框架 log4j后来( log4j成为Apache项目,Ceki加入Apache组织Apache还曾经建议Sun引入Log4j到
2021-12-12 21:48:20 449
原创 关于订单库存扣减的应用实践
关于订单库存扣减的应用实践一: 背景 在电商的业务场景中每个商品都是有库存的,而且可能存在很多限售的运营策略。我们团队面临社区电商的业务场景更为复杂。不仅仅是库存限售,存在区域,门店,用户,运营分组,物流等的限售策略。如何面对日单量千万级别(未来更多),和多个维度的限售策略而不超卖,少卖是一个必须解决的问题。 下面就是库存扣减的流程图。冲图种我们可以看出,要保证整个扣减库存不出问题,限购查询和库存的扣减必须是原子性的而且要单线程执行。 现在处理这种场景存在多种方案。但是要保证高性能和高可
2021-11-02 22:34:35 635 1
原创 CompleteFuture实现简单的任务编排实践
CompleteFuture实现简单的任务编排实践一:前言 CompleteFuture是java8 新提供的API,是对函数式编程思想的体现,提供了很多的对于函数式编程支持。不止有同步处理功能,还有异步处理能力。通过函数式编程可以实现线程的简单任务编排。高效,整洁实现多线程异步编程。二:详细介绍 CompleteFuture 提供的API中以ansy结尾的都是异步处理的。异步执行任务,并返回结果:supplyAsync 异步处理,并返回结果,默认使用ForkJoinPool.commo
2021-10-18 00:25:43 1524
原创 无状态状态机在代码中的实践
无状态状态机一:前言 在项目中经常有一些工单,申请之类需要对状态进行流转。这种需求一般都是满足什么条件然后就翻转状态。这些流程结构相似得逻辑,感觉可以抽象处理。用一个通用得结构处理,可以让系统更加整洁,代码逻辑更加单一。 发现阿里开源一种,轻量级得无状态状态机得组件。仔细研究一下,确实很适合这种场景下对代码逻辑得解耦,相比于if-else代码更加让人容易理解,也更加优雅。二:状态机的模型State:状态Event:事件,状态由事件触发,引起变化Transition:流转,表示从一个状态到
2021-10-15 22:39:33 284
原创 git操作清单,问题答疑
git操作清单,问题答疑一:git操作示意图常见概念说明Remote:远程分支Repository:仓库index:暂存区workspace:工作空间二:常见操作1. 新建代码库# 在当前目录新建一个Git代码库$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 下载一个项目和它的整个代码历史$ git clone [url]2. 配置# 显示当前的Git配置$ git config --li
2021-10-10 21:12:43 81
原创 【软件设计】如何画时序图
时序图一:简介 时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。顺序图中显示的是参与交互的对象及其对象之间消息交互的顺序。时序图中包括的建模元素主要有:对象(Actor)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)等等。二:时序图的元素:角色(Actor):系统角色,可以是人、及其甚至其他的系统或者子系统。对象(Object):对象代表时序图中的对象在交互中所扮演的角色生命线(Li
2021-10-10 12:37:13 3322
原创 发布订阅模式的最佳实践-guava的EventBus
发布订阅模式的最佳实践-guava的EventBus一:背景 项目中大量有例如发送短信,记录日志的一些业务逻辑,这些业务逻辑,不属于业务逻辑的一部分,不应该耦合到业务逻辑中。在这种场景下,发布订阅模式就可以解耦这种情况。 在google的guava组件中有一种EventBus的发布订阅模式的组件。我们可以借用这种组件实践发布订阅模式。二:实现DEMO 我们基于Springboot,和guava实现简单的发布订阅模式。定义一个IObserver的接口,所有观察者都需要实现这个接口。
2021-09-27 21:35:22 1090
原创 Typora 如何使用阿里云作为图床
Typora 如何使用阿里云作为图床一:购买阿里云的OSS服务1):阿里云购买一年40G的OSS服务。作为图床,40G够用了。2):创建Bucket3):创建访问密钥Keyld一定要复制文本中,keySecret一定要复制文本中二:下载,配置pinggo1):下载pinggo,下载地址:https://picgo.github.io/PicGo-Doc/zh/guide/#%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%852):安装好picgo后选择配置pic
2021-08-15 19:01:44 402
原创 索引布尔表达式
索引布尔表达式问题背景 广告推荐引擎中,广告主会对广告投放做一下定向要求(比如:性别,年龄,城市等),这就需要通过用户画像特征从广告库里面检索出符合定向要求的广告。 当广告数量少的时候,我们可以迭代每个广告做比对。Attributes = list<Attribute> // 用户的流量标签,例如:用户的年龄、性别... for (Ad ad : ads) { check attributes for each ad. // 对于每一个广告检查是不是符合流量标签,挑选广告.
2021-07-17 14:28:26 334
原创 spring拓展点之- Aware 接口
spring拓展点之- Aware 接口一:Aware接口的作用 aware接口是spring提供的一个拓展的感知接口,具体做啥用,怎么用?我们可以看看源码!我们找到spring源码中的Aware接口,看看注释 * A marker superinterface indicating that a bean is eligible to be notified by the * Spring container of a particular framework object through
2021-06-26 11:51:08 271
原创 spring的拓展点之-InitializingBean
spring的拓展点之-InitializingBean InitializingBean是spring提供的一个初始我们bean熟悉的方法,我们可以直接看看源码注释。我们看这个接口上的注释大概意思就是:当我们需要初始化我们bean中的一些参数,或者校验一些参数的时候的时候就可以通过实现该接口的afterPropertiesSet方法,初始化bean中属性。同时也说明了,初始化bean属性的还可以通过配置init方法。通过源码的注释我们大致知道这个接口的功能了。实现这个接口和配置init方法有什
2021-06-23 23:42:55 210
原创 kafka特性和集群
kafka特性和集群一: kafka特性介绍Topic让我们首先深入了解下Kafka的核心概念:提供一串流式的记录Topic 就是数据主题,是数据记录发布的地方,可以用来区分业务系统。Kafka中的Topics是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。对于每一个topic, Kafka集群都会维持一个分区日志,如下所示:每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的commit log文件。分区中的每一个记录都会分配一个id号来表示顺序,我们称
2021-06-20 15:37:42 170
原创 广告竞价中为什么采用二价计费
广告竞价中为什么采用二价计费一:问题在计算广告的行业中,一般扣费价格并不是你出价的价格作为扣费价格的。而是以第二名的出价进行扣费二:为什么这么做? 假如A,B两个广告主出价参竞,A广告主出家2元,B广告主出价5元,假设他们的cvr都为0.5.那么A的ecpm=1,B的ecpm=2.5,这个时候B胜出,扣费5元。但是下次第二轮竞价的时候,b广告主发现自己成本高,就想降低出价,出4元ecpm=2元,B还是胜出。第三轮也是如此,B广告主会不停的降低出价来降低成本。这就导致竞价的氛围变差。 假设
2021-06-16 23:05:23 5625
原创 LRU算法
LRU算法简介 LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据予以淘汰。 很多缓存中采用这种算法。一:LinkHashMap实现LRU算法LinkedHashMap 会对数据使用来排序,这样服务LRU算法的最少使用的思想了public class LRUCacheDemo<k, v> extends LinkedHashMap<k, v> { private int capacit
2021-06-14 20:19:16 159 1
原创 【SpringBoot源码】Springboot启动tomcat原理
Springboot启动tomcat原理一:思考 记得以前SSM项目时候,需要把项目打包到tomcat的webApps目录下。然后启动tomcat。现在springboot项目直接打包成jar宝就可以启动tomcat了。Springboot为了实现这个功能做了那些操作,和设计呢?二:源码探索我们从SpringBoot的启动类的run()方法中去。进入方法,我们看到一个关键的类,这个个方法就是Spring上下文的类的类路径。这个的webApplicationType 的值就是SERVLET
2021-06-05 21:04:52 146
原创 zookeeper实现分布式锁
zookeeper实现分布式锁一:zookeeper分布式锁原理1:原子性Zookeeper有写操作有原子性,利用这个特性可以实现分布式锁。对于来自客户端的每个更新请求,ZooKeeper 具备严格的顺序访问控制能力。为了保证事务的顺序一致性,ZooKeeper 采用了递增的事务 id 号(zxid)来标识事务。2:Watcher 回调机制客户端注册监听它关心的 znode,当 znode 状态发生变化(数据变化、子节点增减变化)时,ZooKeeper 服务会通知客户端。客户端和服务端保持连
2021-05-29 14:17:28 90
原创 Redis集群策略分析
Redis集群策略分析一:主从模式结构图特点1:主负责写,从负责读。这种方式的话应对比较大的QPS,QPS增大只需要增加slave节点数量就可以了。2:无法保证强一致性,主从同步存在延迟,只能保证最终的一致性。3:master宕机的情况下,无法写入,没有办法自动恢复。二:哨兵模式结构图特点1:哨兵模式是分布式的系统,可以自动转移故障。在master宕机的时候自动选择出slave转为master继续提供服务,保证服务的高可用。2:当确认主节点宕机后,在从节点中选一
2021-05-24 00:41:21 237 3
原创 从源码看公平锁和非公平锁得区别
从源码看公平锁和非公平锁得区别一:理论解释公平锁:ReentrantLock通过构造器参数设置为true就是公平锁。非公平锁:synchronized 关键字,ReentrantLock默认就是非公平锁。公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。优点:所有的线程都能得到资源,不会饿死在队列中。缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。非公平锁:多个线程去获取锁的时候,会直接去
2021-05-19 23:46:24 251 2
原创 【spring源码解读】spring加载流程refresh之prepareBeanFactory(beanFactory)
【spring源码解读】spring加载流程refresh之prepareBeanFactory(beanFactory)一:介绍prepareBeanFactoryspring启动的核心流程都是在org.springframework.context.support.AbstractApplicationContext这个抽象类的refresh()方法中。 prepareBeanFactory(beanFactory)是刷新流程中的第三个方法。这个方法的主要内容。二:主要作用第一步加载类加载
2021-05-16 14:57:24 360
原创 Synchronized关键字原理,和锁的膨胀过程
Synchronized关键字原理,和锁的膨胀过程一:Synchronized关键字介绍synchronized是Java中的关键字,用于线程的同步。可以用在三个地方。 1:同步实例方法,锁是当前实例对象; 2:同步类方法,锁是当前类对象; 3:同步代码块,锁是括号里面的对象;二:Synchronized的原理解析1:synchronized是JVM内置锁,通过内部对象Monitor(监视器锁)实现,基于进入与退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖底层操作系统的M
2021-05-15 23:36:46 154
原创 关于volatile关键字的解析
关于volatile关键字的解析什么是volatile volatile是Java虚拟机提供的轻量级的同步机制三大特性不保证原子性禁止指令重排保证可见性不保证原子性对于volatile不保证原子性,我们可以通过一段代码来验证package javase;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurr
2021-05-15 13:52:13 235
原创 【Spring的源码解读】BeanPostProcessor 接口解读
BeanPostProcessor 接口解读一:什么时候执行BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口。public interface BeanPostProcessor { //bean初始化方法调用前被调用 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; //bean初始化方法调用后被调用
2021-05-11 23:17:46 156
原创 【spring源码解读】图解spring的循环依赖
图解Spring的循环依赖前言Spring的循环依赖是spring架构设计中比较精彩的一环,学习Spring的循环依赖设计,对我们进行业务架构设计还是很有裨益的。这里通过debug介绍一下,spring如何通过三级缓存来实现循环依赖的。spring的三级缓存spring通过三级缓存来实现循环依赖就需要了解spring的三级缓存机制。spring缓存在BefaultSingletonBeanRegistry中。一级缓存singletonObjects 是最终的Bean对象的缓存。也就是常说的
2021-05-09 17:15:30 138 2
原创 MVCC原理分析
MVCC原理分析1:什么是MVCC MVCC是英文名称Multi Version Concurrency Control 的简称,就是多版本并发控制。MVCC可以说实现,读不加锁,读写不冲突。这个可以大大的提高Mysql的性能。2:MVCC解决了什么问题多事务的并发进行一般会造成以下几个问题:脏读: A事务读取到了B事务未提交的内容,而B事务后面进行了回滚.不可重复读: 当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不一样,因为在此期间B事务进行了提交操作.
2021-05-01 15:10:41 180
原创 【JDK源码】AQS源码详细解读
AQS源码详细解读什么是AQASAQS:AbstractQueuedSynchronizer ,它是一个抽象的同步队列器,这个类位于java.util.concurrent.locks包下面,是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类型变量麦示持有锁的状态。主要是通过CLH队列实现对线程的调度。CLH: Craig、Landin and Hagersten队列,是一个单向链表,AQS中的队列是CL
2021-04-29 23:37:46 392
原创 Java 的SPI机制
Java 的SPI机制什么是java的SPI机制 SPI(Service Provider Interface)主要是被框架开发人员使用的一种技术。例如,使用 Java 语言访问数据库时我们会使用到 java.sql.Driver 接口,不同数据库产品底层的协议不同,提供的 java.sql.Driver 实现也不同,在开发 java.sql.Driver 接口时,开发人员并不清楚用户最终会使用哪个数据库,在这种情况下就可以使用 Java SPI 机制在实际运行过程中,为 java.sql.Drive
2021-04-03 14:53:32 254
原创 JAVA日志和Springboot日志集成
### JAVA日志和Springboot日志集成1:java的日志生态中又很多日志实现框架,比如:- [JUL](https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html)- [Apache Log4j1](https://logging.apache.org/log4j/1.2/)- [Apache Log4j2](https://logging.apache.org/log4j/2...
2021-03-27 22:13:08 128
原创 【设计模式】基于spring特性的责任链模式
【设计模式】基于spring特性的责任链模式业务场景:业务场景:开发中,需要对返回进行一系列的策略过滤,直接在一个方法中进行,代码比较长,耦合也是比较深。所以用责任链的模式进行解耦,同时可以动态配置责任链,实现动态拔插。设计:定义一个过滤链接口:public interface IFilterChain<ReqT,repD> { void doFilter(ReqT req, repD rep);}实现接口:这就是一个过滤链的对象public class Linke
2021-03-14 16:52:25 298
原创 如何把项目上传到github
如何把项目上传到github本地git初始化git init 初始化git环境git add . 把所有的文件添加到缓存空间本地密钥配置在用户目录下看有没有 .ssh 文件没有的话新建一个文件夹进入.ssh文件夹下面,创建这两个文件 ,命令 ssh-Keygen -t rsa -C "email" 一直空格就可以了进入github,创建一个SSH密钥点击New SSH key ,然后把刚才创建的文件 id_rsa.pub 里面的公钥加入里面,保存就好了创建g
2021-02-27 17:14:12 117
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人