Drools是一款基于Java语言的开源规则引擎,通过drools特定的语法,将复杂多变的业务规则统一管理。
环境配置
一、使用maven创建项目
添加相关依赖,pom.xml如下
1 |
|
Drools是一款基于Java语言的开源规则引擎,通过drools特定的语法,将复杂多变的业务规则统一管理。
maven创建项目添加相关依赖,pom.xml如下
1 | <?xml version="1.0" encoding="UTF-8"?> |
在Redis中,相同的数据,如果我们使用不同的数据结构来存储,它们使用的内存大小差异可能是非常大的,要想更多的节省空间,我们不仅仅需要了解Redis的几种常用数据类型,还需要了解他们内部在不同情况下使用的具体数据结构
之前曾整理过一篇Redis每种数据类型及对应的内部结构,如果对此不太了解的同学可以先大致看一下
Redis为hash、set、zset都提供了对应的节约空间的数据结构存储方式,合理使用它们可以大大节约内存空间
下面以hash结构举例,其他的结构也是类似的
Redis我们都比较熟悉,可以用来做缓存、分布式锁等,但是,其中的客户端与服务端是如何进行通信的呢?
我们可以分别模拟一个服务端或者客户端,打印查看来自实际连接的请求来获取它们的通信方式
首先,让我们先使用先模拟一个服务端,使用Jedis进行连接查看
1 | // 一个简单的demo |
对于 Java 中的 lambda 表达式,我们可以把它简单的理解为一个函数。
比如,我们需要这样一个函数,它需要把两个数字相加,将结果返回 则可以这样定义
1 | int add(int a, int b); |
但是我们知道,Java中函数是没有办法单独定义存在的,所以我们需要一个接口才能声明这个函数功能
1 | interface Function { |
当我们需要实现这个方法的时候,一种方法就是定义一个新的类来实现这个接口
1 | class Calc implements Function { |
接着之前说过的 Java HashMap的Rehash,这次我们来看看 Redis中的 hash结构(对应Java中的Map)是如何实现rehash的。
这次先说下结论,它的结构与HashMap基本一致,只是它有两个哈希表,平时只使用其中的第一个,在发生rehash时,会逐渐的将元素转移到另一个表中,全部转移完成后,再将引用赋值给第一个哈希表
下面我们来开始看代码
我们都知道Java中的HashMap是使用数组,结合链表来实现的,其结构如下:
如果加入的元素数量达到了设定的阈值,那么必然会涉及到扩容重新分配空间,将元素重新插入到新的空间中,也就是发生了rehash。这个过程其实是很耗时的,这也是为什么我们写代码时,最好指定的HashMap的初始空间大小的原因,就是为了避免或者减少发生rehash的次数。下面我们来看看这个过程的具体实现。
JDK是一直在升级的,其中的代码也在不断优化调整,我们这次主要就看下JDK1.7和 JDK1.8中的实现
这篇来跟踪一下AbstractBeanFactory#getBean(java.lang.String, java.lang.Class<T>)这个方法获取bean实例的流程,由于过程比较复杂,我们这里以一个简单的例子来跟进一下主要的流程
下面我们看下具体的例子代码
spring配置文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
spring-beans虽然是一个很基础的包,但是它已经包括了很多的功能,我们先看下如何在只使用spring-beans包的情况下,解析并拿到xml中配置的bean实例
spring-bean.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
解析代码
1 | // 1.创建一个BeanFactory |
MyBatis是我们常用的ORM框架,先看一下它的基本用法(省略了Mapper相关的配置项):
1 | // 读取MyBatis配置文件 |
工作中最常用的还是与Spring结合,使用mybatis-spring
1 | <dependency> |
CountDownLatch功能很简单,它主要有两个方法,await()与countDown(),初始创建的时候需要给它提供一个数值,调用countDown()方法会将数值减1,调用await()方法的时候会判断值是不是等于0,如果等于0就继续执行,否则就阻塞等待
1 | // 初始化创建,值为1 |
利用这两个方法,我们能用来做什么呢?