自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CrankZ的博客

希望能用自己的技术使这个世界更加美好。

  • 博客(78)
  • 收藏
  • 关注

原创 Devs--开源规则引擎介绍

DevsDevs是一款轻量级的规则引擎。开源地址:https://github.com/CrankZ/devs基础概念此规则引擎的基础概念有字段、条件、规则等。其中字段组成条件,条件组成规则,并且支持多个条件通过与或组成一个规则。下面用常见的代码说明各个概念代码举例规则分类多个规则可组成一个模板,调用接口执行的时候是以模板为维度执行的。模板模板名称模板1规则模板映射表模板id规则id111213规则相关字段

2021-11-28 17:45:45 760

原创 规则引擎相关开源项目总结

表达式引擎JavaGroovyhttps://groovy-lang.org/JEXLhttps://commons.apache.org/proper/commons-jexl/mvelhttps://github.com/mvel/mvelSpringELhttps://docs.spring.io/spring-framework/docs/3.0.x/reference/expressions.htmlOGNLhttps://commons.apache.org/proper/

2021-04-01 10:58:37 1167

原创 幂等性概念与解决方案

幂等性概念幂等性原本是数学上的概念用在编程领域,则意为对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。幂等性原本是数学上的概念,,即使公式:f(x)=f(f(x)) 能够成立的数学性质。编程领域,则意为对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。用通俗的话讲:就是针对一个操作,不管做多少次,产生效果或返回的结果都是一样的。如果没有实现接口幂等性会有很严重的后果: 支付接口,重复支付会导致多次扣钱 订单接口,同一个订单可能会多次创建。

2021-03-24 22:53:51 640

原创 限流算法总结:计数器、滑动窗口、漏桶算法、令牌桶算法

为什么需要限流?由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动,为了保证系统不被巨大的流量压垮,会在系统流量到达一定阈值时,拒绝掉一部分流量。限流会导致用户在短时间内(这个时间段是毫秒级的)系统不可用,一般我们衡量系统处理能力的指标是每秒的QPS或者TPS,假设系统每秒的流量阈值是1000,理论上一秒内有第1001个请求进来时,那么这个请求就会被限流。比如web服务、对外API,这种类型的服务有以下几种可能导致机器被拖垮:用户增长过快因为某个热点事件(秒杀、微

2021-03-23 23:55:32 3921 5

原创 本地缓存Caffeine

Caffeine说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。由于Guava的大量使用,Guava Cache也得到了大量的应用。但是,Guava Cache的性能一定是最好的吗?也许,曾经,它的性能是非常不错的。但所谓长江后浪推前浪,总会有更加优秀的技术出现。今天,我就来介绍一个比...

2019-05-19 16:54:04 1014

原创 Java——七种垃圾收集器+JDK11最新ZGC

JDK1.8之前的堆内存示意图:从上图可以看出堆内存的分为新生代、老年代和永久代。新生代又被进一步分为:Eden 区+Survior1 区+Survior2 区。值得注意的是,在 JDK 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域(永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制)。JVM为什么要进行垃圾回收?...

2019-01-07 16:41:45 24466 10

原创 String学习笔记

阿里Java开发手册这里总结了阿里开发手册中有关String类的介绍13. 【推荐】使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException的风险。说明:String str = "a,b,c,,";String[] ary = str.split(",");// 预期大于3,...

2018-12-25 16:23:54 760

原创 结构型模式:代理模式,Java静态代理+动态代理实现

什么是代理模式代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:对扩展开放,对修改关闭。也就是不要随意去修改已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法举个例子来说明代理的作用:假设我们想邀请一位明...

2018-12-15 11:22:03 297

原创 基本类型与包装类型

阿里开发手册中关于基本类型的问题7. 【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。 说明:对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是...

2018-12-14 21:48:08 1988

原创 创建型模式:单例模式+5种写法+最佳实践。

什么是单例模式单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式特点:这个类只能有一个实例; 它必须自行创建这个实例; 它必须自行向整个系统提供这个实例。Tips:单例模式是一种对象创建型模式。单例模式分类饿汉方式 懒汉方式 双重检测法 静态内...

2018-12-11 15:04:04 800

原创 创建型模式:工厂模式

23种设计模式工厂模式的分类简单工厂(Simple Factory)模式 工厂方法(Factory Method)模式 抽象工厂(Abstract Factory)模式为什么要用工厂模式满足开闭原则:对修改关闭,对扩展开放。就是别改老代码,只需要添代码,以前所有的老代码,都是有价值的,需要尽力保留 解耦 :把对象的创建和使用的过程分开 降低代码重复: 如果创建某个对象的过...

2018-12-10 15:52:13 252

原创 哈希 学习笔记

Tips:Hash=哈希=散列Tips:哈希经常与哈希函数指一个意思。本文中哈希与哈希函数不做特殊区分,默认就是一个意思。什么是哈希在记录的关键字与记录的存储地址之间建立的一种对应关系叫哈希函数。哈希函数就是一种映射,是从关键字到存储地址的映射。通常,包含哈希函数的算法的算法复杂度都假设为O(1),这就是为什么在哈希表中搜索数据的时间复杂度会被认为是”平均为O(1)的复杂度...

2018-12-09 18:30:13 1714

原创 布隆过滤器,原理+案例+代码实现

概述什么是布隆过滤器        布隆过滤器(Bloom Filter)是1970年由布隆提出的,它实际上是由一个很长的二进制向量和一系列随意映射函数组成。        它是一种基于概率的数据结构,主要用来判断某个元素是否在集合内,它具有运行速度快(时间效率),占用内存小的优点(空间效率),但是有一定的误识别率和删除困难的问题。它能够告诉你某个元素一定不在集合内或可能在集合内。...

2018-12-09 15:49:10 5763 3

原创 分布式锁,学习笔记

什么是分布式锁?当在分布式模型下,数据只有一份(或有限制),此时需要利用锁的技术控制某一时刻修改数据的进程数。与单机模式下的锁不仅需要保证进程可见,还需要考虑进程与锁之间的网络问题。(我觉得分布式情况下之所以问题变得复杂,主要就是需要考虑到网络的延时和不可靠。。。一个大坑)分布式锁还是可以将标记存在内存,只是该内存不是某个进程分配的内存而是公共内存如 Redis、Memcache。至于...

2018-12-06 17:55:17 242

原创 时间复杂度+常见复杂度解释

前言算法的效率虽然计算机能快速的完成运算处理,但实际上,它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源。要想编写出能高效运行的程序,我们就需要考虑到算法的效率。算法的效率主要由以下两个复杂度来评估:时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。设计算法时,一般是要先考虑系...

2018-12-02 19:07:15 19185 4

原创 分库分表

名词解释库:database;表:table;分库分表:sharding为什么要分库分表移动互联网时代,海量的用户每天产生海量的数量,比如:用户表 订单表 交易流水表以支付宝用户为例,8亿;微信用户更是10亿。订单表更夸张,比如美团外卖,每天都是几千万的订单。淘宝的历史订单总量应该百亿,甚至千亿级别,这些海量数据远不是一张表能Hold住的。事实上MySQL单表可以存储10亿级...

2018-12-01 23:11:31 8214 2

原创 MySQL存储引擎:MyISAM与InnoDB

常见命令查看数据库可配置的存储引擎类型MySQL>show engines; create table创建表时指定存储引擎MySQL> use schoolMySQL> create table class(id int ,cname varchar(20)) engine=InnoDB; #创建库,指定引擎InnoDBMySQL> show...

2018-11-28 23:14:30 409

原创 Cookie、Session、Token

HTTP无状态而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。就是说假如你去网上购物,把喜欢的商品加到购物车中,因为HTTP是无状态的协议,一旦你的浏览器关闭,下次打开的时候,你上次购物车的商品都没了。这种体验肯定是很差的,所有需要一种机制解决这个问题...

2018-11-28 11:47:23 335

原创 8个排序算法

排序算法排序算法(Sorting algorithms)是什么? Wikipedia 如是说:In computer science, a sorting algorithm is an algorithm that puts elements of a list in a certain order.也就是说,排序算法,就是某种算法,将列表中的元素按照某种规则排序。常见的如数字大...

2018-11-22 18:30:44 403

原创 BeanFactory、 ApplicationContext、FactoryBean区别与联系

BeanFactory概述Spring 作为一种IoC容器最大的目的就是降低组件与组件之间的依赖关系。而BeanFactory作为整个Spring IoC容器的核心使用了一种统一的方法来装配所有的应用对象,通过Java的反射机制和依赖注入来实现这一装配过程,使受之管理的对象无需知道Spring的存在,同时也降低了组件间的依赖程度,同时受管对象的生命周期由BeanFactory来统一管理,开...

2018-11-21 16:53:25 743

原创 从输入URL到显示页面的过程中发生了什么?

概览关于这个问题,我看过很多文章,每个人分析的方法与总结的步骤都不相同。我这里按照自己的理解把过程分为了十个部分。因为我主要学习后端,所以最后几步前端的内容略写了。一、URL解析二、DNS域名解析三、建立TCP连接四、发送HTTP请求五、访问重定向301/302(非必须)六、服务器处理请求七、返回响应结果八、断开TCP连接九、浏览器解析HTML十、浏览器渲染界面一...

2018-11-20 16:41:09 3152

原创 Redis淘汰机制+热点数据问题

为什么需要淘汰Redis是内存数据库,我们能时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思,例如最明显的是对于同一种数据结构在不同应用场景下提供了基于不同底层编码的实现(如压缩列表、跳跃表等)。Redis最常见的两种应用场景为缓存和持久存储,当Redis做缓存时,有一个Redis服务器,服务器物理内存大小为1G的,我们需要存在Redis中的数据量很小,这看起来似乎足够用很长时...

2018-11-18 23:11:00 7296 4

原创 Netty学习笔记(一):基础理论+核心组件

前置知识I/O模型用什么样的通道将数据发送给对方,BIO、NIO或者AIO,I/O模型在很大程度上决定了框架的性能阻塞I/O传统阻塞型I/O(BIO)可以用下图表示:特点每个请求都需要独立的线程完成数据read,业务处理,数据write的完整操作问题当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大 连接建立后,如果当前线程暂时没有数据可读,则线程就阻...

2018-11-18 21:49:12 500

原创 Java多线程学习笔记:Callable、Future、FutureTask

概述创建线程的三种方式:继承Thread,重写run方法 实现Runnable接口,重新run方法 实现Callable接口,重写call方法前两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口,这两种方式都是Java第一版就有的方法。 这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信...

2018-11-08 10:14:32 236

原创 Java多线程学习笔记:ReentrantLock,Condition,ReentrantReadWriteLock

ReentrantLockReentrantLock和synchronized关键字一样可以用来实现线程之间的同步互斥,但是在功能是比synchronized关键字更强大而且更灵活。ReentrantLock 整体结构如下图:常用接口分析构造器ReentrantLock()创建一个 ReentrantLock的实例。 ReentrantLock(boolean fai...

2018-11-07 11:48:31 255

原创 Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

概述在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。CountDownLatch上图TA刚开始被阻塞,三个线程T1,T2,T3每次调用countDown()方法cnt就减1,等到cnt=0时,TA才开始执行。正如Java文档所描述的那...

2018-11-06 10:03:52 278

原创 Docker学习笔记(一):基础概念与核心原理

开发中遇到的问题场景1当你拥有一台新的电脑,你第一件事会做什么?一般都是去装一些常用软件,比如QQ、微信、网易云音乐、Chrome浏览器等等。当然作为开发者,还需要装一些环境,JDK,或者python等等。假如现在让你负责给学校机房100台电脑,都安装以上软件和环境。那你怎么办?一台一台的手工去装?NONO这时候你肯定想在一台电脑上把环境安装好,然后把这个系统打包,直接复制...

2018-11-05 11:24:12 275

原创 设计模式学习笔记:设计模式七大原则

维基百科对设计模式的分类什么是设计模式可以用一句话概括设计模式———设计模式是一种利用OOP的封闭、继承和多态三大特性,同时在遵循单一职责原则、开闭原则、里氏替换原则、迪米特法则、依赖反转原则、接口隔离原则及合成/聚合复用原则的前提下,被总结出来的经过反复实践并被多数人知晓且经过分类和设计的可重用的软件设计方式。什么是 GOF(四人帮,全拼 Gang of Four)?在 19...

2018-10-26 11:35:16 516 2

原创 二叉树,二叉搜索树,AVL树,红黑树。学习笔记

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

2018-10-23 09:45:57 764

原创 Linux学习笔记+Vim用法简介

学习Linux之前,我们先来简单的认识一下操作系统。一 从认识操作系统开始1.1 操作系统简介我通过以下四点介绍什么操作系统:操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石; 操作系统本质上是运行在计算机上的软件程序 ; 为用户提供一个与系统交互的操作界面 ; 操作系统分内核与外壳(我们可以把外壳理解成围绕着内...

2018-10-11 22:41:07 264

原创 数据库【三种读现象】与【四种隔离级别】+MySQL相关命令

数据库事务特性ACID数据库事务特征,即 ACID:A Atomicity 原子性事务是一个原子性质的操作单元,事务里面的对数据库的操作要么都执行,要么都不执行,C Consistent 一致性在事务开始之前和完成之后,数据都必须保持一致状态,必须保证数据库的完整性。也就是说,数据必须符合数据库的规则。I Isolation 隔离性数据库允许多个并发事务同事对数据进行操...

2018-10-11 20:23:07 435

原创 Java NIO学习笔记:结合源码分析+Reactor模式

Java NIO和IO的主要区别下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 面向流与面向缓冲Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在...

2018-10-01 20:24:23 705

原创 数据库连接池学习笔记(一):原理介绍+常用连接池介绍

什么是连接池数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。为什么要使用连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。  一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动...

2018-09-27 22:12:43 64068 13

原创 直播技术学习笔记(直播协议+流媒体服务器+音视频处理+FFmpeg)

直播协议RTMP(Real Time Messaging Protocol)简介Time Messaging Protocol,实时消息传送协议RTMP是Adobe公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。协议:长连接TCP原理:每个时刻的数据,收到后立即转发延迟:1~3秒优点实时性高:一般能做到3秒内。 支持加密:rtmpe和rt...

2018-09-17 17:06:38 4172 1

原创 Python+OpenCV+mss实现局域网跨平台桌面演示

整体思路server.py:用mss截图,然后zlib压缩后socket发送client:socket接收,zlib解压缩,然后使用OpenCV播放简单介绍mssAn ultra fast cross-platform multiple screenshots module in pure Python using ctypes. 具体去官网:https://github.co...

2018-09-17 10:30:52 4686 1

原创 ZooKeeper学习笔记二

实战使用ZooKeeper框架的安装1. 下载并tar开解压(略)2. 创建配置文件创建conf/zoo.cfg 配置文件tickTime=2000dataDir=/var/lib/zookeeperclientPort=2181 参数说明:tickTime: zookeeper中使用的基本时间单位, 毫秒值. dataDir: 数据目录. 可以是任意目录. da...

2018-09-03 17:13:52 263

原创 ZooKeeper学习笔记一

分布式应用程序分布式应用程序可以通过在它们之间协调以完成特定的任务,快速且有效的方式在多个系统中的网络在给定时间(同时)运行分布式应用程序有两部分,分别是:服务器和客户端应用程序。如下图所示:分布式应用程序的优点可靠性 可扩展性 透明性Zookeeper在分布式中提供的服务命名服务 配置管理 集群管理 节点领导者选举 锁定和同步服务 数据注册表ZooKeep...

2018-09-03 17:02:42 522

原创 Spring注解学习笔记

什么是注解传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低 在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效...

2018-08-23 17:50:10 1471 1

原创 Java注解学习笔记

什么是注解注解(Annotation)是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符,它是一种由JSR-175标准选择用来描述元数据的一种工具。Java从Java5开始引入了注解。在注解出现之前,程序的元数据只是通过java注释和javadoc,但是注解提供的功能要远远超过这些。注解不仅包含了元数据,它还可以作用于程序运行过程中、注解解释器可以通过注解决定程序的执行顺序。比...

2018-08-22 15:36:58 207

原创 Spring AOP学习笔记(一):基础概念

AOP产生背景AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,...

2018-08-14 23:00:35 184

空空如也

空空如也

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

TA关注的人

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