Stream 流式编程:并行流
1、基本概念Stream是工作中经常用到的集合操作工具,Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。同时它提供的parallelStream方法能够充分利用多核CPU的优势,使用多线程加快对集合数据的处理速度
相对于顺序流而言,并行流在执行某些中间操作时,会自动将数据分成若干个小块,并在多个线程中进行处理,最终将结果合并起来。可以通过调用parallel()方法将顺序流转换为并行流
例如,我们可以使用以下代码使用并行流对一个整数列表进行求和:
12List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); int sum = numbers.parallelStream() .mapToInt(Integer::intValue) .sum();
这里,parallelStream()方法创建一个并行流,mapToInt()方法将Stream中的元素转换为int类型,sum()方法对所有元素求和。
需要注意的 ...
西方哲学史
1、智慧的痛苦1.1、什么是哲学关于哲学错误的看法:
(1)哲学是科学:它不具备一门科学知识应该具备的最基本特征:普遍性和必然性(2)哲学是让人聪明的学问:哲学的理论学说都处在众说纷纭,莫衷一事的处境中。那么你想想学哲学会让你聪明还是糊涂(3)哲学是讲道理的学问:哲学是讲大道理的,可是哲学这个大道理大到什么程度,大到没有办法去印证的程度。那么道理道理之间的冲突就变成没有道理 哲学往往被看做是为意识形态服务的工具,今天是这样一种政策,理论家们就要给我论证它的理论基础,非常完善的一套逻辑,过一段时间政策变了,还是这群哲学家,仍然还可以给你论证那套基础。不恰当的讲,可以把煤球论证成黑的,也可以论证成白的。 科学知识的对象 -> 现实性 哲学的对象 -> 理想性,带有乌托邦的性质,它是人们不满足于这个世界,而为它建立的一个理想世界,但每个人不同的时代社会和所处的环境,使人们对这个理想的境界理解不同(4)哲学无用,无用只用,是为大用。所有学科都比哲学有用,但是是唯有哲学是自由的学问,因为所有的学科都有前提,都有它服务的对象,但唯独哲学是为了自身而被追求的知识。哲学是 ...
异步非阻塞编程:CompletableFuture
1、背景我们都知道可以通过继承Thread类或者实现Runnable接口两种方式实现多线程。但是有时候我们希望得到多线程异步任务执行后的结果,也就是异步任务执行后有返回值,Thread和Runnable是不能实现的。当我们需要返回值的时候怎么办呢? Java 1.5 推出的Callable和Future接口就解决了这个问题。但是因为Future有几个局限,由于这几个局限,在Java1.8就推出了加强版的Future类:CompletableFuture
Future用于表示异步计算的结果,只能通过阻塞或者轮询的方式获取结果,而且不支持设置回调方法,Java8之前若要设置回调一般会使用guava的ListenableFuture。 CompletableFuture对Future进行了扩展,可以通过设置回调的方式处理计算结果,同时也支持组合操作,支持进一步的编排
2、Future使用假如我们现在有如下需求:
老板正在开会,开会过程中发现少一份材料,通知秘书去整理,在秘书整理过程中老板这边还在继续开会,秘书整理完以后将材料给到老板手中。
需求分析:
老板开会是主线程,不能中断。秘书就是异步 ...
sharding-jdbc实现自动按月分表
1、基本需求1、 项目中我们希望 能够按照时间、类别来添加表。但是sharding-jdbc 是固定配置 的 actual-data-nodes 参数。也就是说我们需要提前创建好分表或者分库。那么我们需要如何来实现动态创建表,并且动态刷新 actual-data-nodes 呢。
2、思路就是写个定时器来动态创建表 ,在创建表的时候 动态刷新 actual-data-nodes 实现动态创建表被shard加载。
2、功能实现2.1、添加依赖12345678910<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version></dependency><dependency> <groupId>org.apache.shar ...
分布式事务解决方案seata
1、概念1.1、背景在微服务架构下,由于数据库和应用服务的拆分,导致原本一个事务单元中的多个DML 操作,变成了跨进程或者跨数据库的多个事务单元的多个 DML 操作,而传统的数据库事务无法解决这类的问题,所以就引出了分布式事务的概念。分布式事务本质上要解决的就是跨网络节点的多个事务的数据一致性问题,业内常见的解决方法有两种
a. 强一致性,就是所有的事务参与者要么全部成功,要么全部失败,全局事务协调者需要知道每个事务参与者的执行状态,再根据状态来决定数据的提交或者回滚b. 最终一致性,也叫弱一致性,也就是多个网络节点的数据允许出现不一致的情况,但是在最终的某个时间点会达成数据一致。
在分布式事务的实现上,对于强一致性,我们可以通过基于 XA 协议下的二阶段提交来实现,对于弱一致性,可以基于 TCC 事务模型、可靠性消息模型等方案来实现。
1.2、常见分布式事务解决方案1、seata阿里分布式事务框架2、消息队列3、sage4、XA
他们有一个共同的特点,都是两阶段(2PC),两阶段是指完成整个分布式事务,划分为两个步骤完成。实际上这四种方案分别对应着分布式事务的四种模式:AT,TCC, ...
快乐源泉
1、段子
小明考了零分, 老师把小明拽到讲台前说道:“大家都看看, 这就是平时注意力不集中, 不好好听我讲课, 竟然考了零分, 大家要以此为鉴!” 这时,小明泪流满面地说:“老师,啥时候考的试呀, 下回能不能到门外通知我一下?”
天气预报说今晚会有台风登陆,但是一直没登陆,你知道是为什么吗?因为台风忘记密码
唉!模拟地震没有地震;模拟火灾没有火;那为什么模拟考试就有考试了啊啊啊!
司机:你们为什么要去四十公里外的地方吃饭 我:看小红书推荐的 司机:现在还看书的年轻人不多了
两程序员聊天,程序员甲抱怨:”做程序员太辛苦了,我想换行……我该怎么办?”程序员乙:”敲一下回车。”
你为家乡脱贫做出了什么贡献?我出门打工,减少贫困人口
野外有野生龟,家有家规
大熊猫点外卖,笋到家了
大多数人回家的第一句话是“妈,我回来了。”如果妈妈不在家,第一句话一定是:“爸,我妈呢?”
不偷不是意大利,不抢不是法兰西,又偷又抢英吉利,再开两枪是美帝
结婚并不是人生的最优解,他只是亲戚朋友父母的一种期望而已,如果你物质生活丰富,精神世界富足,婚姻对你而言只是锦上添花而已。来到这个世界上你是自己的主角,这辈子也没 ...
Linux运维笔记
1、Linux终端1.1、终端组成部分[root@localhost ~]#
1、root:表示当前终端登录的用户名2、@:表示在3、localhost:当前登录的主机名4、~:当前终端的工作目录5、#:表示身份标识符
1.2、Linux关机命令1、shoutdown -h now:正常关机2、halt:关闭内存3、init 0:关机,和shoutdon -h一样。只不过shutdown可以通过 -r now重启
2、Linux系统与文件2.1、Linux文件系统在 Linux 系统中有一个重要的概念:一切都是文件
/bin: 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里/sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等/etc: 存放系统管理和配置文件/home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示/usr : (Unix S ...
Redisson 框架中的分布式锁
实现分布式锁通常有三种方式:数据库、Redis 和 Zookeeper。我们比较常用的是通过 Redis 和 Zookeeper 实现分布式锁。Redisson 框架中封装了通过 Redis 实现的分布式锁,下面分析一下它的具体实现
1、关键点
原子性:要么都成功,要么都失败
过期时间:如果锁还没来得及释放就遇到了服务宕机,就会出现死锁的问题。给 Redis 的 key 设置过期时间,即使服务宕机了超过设置的过期时间锁会自动进行释放。
锁续期: 因为给锁设置了过期时间而我们的业务逻辑具体要执行多长时间可能是变化和不确定的,如果设定了一个固定的过期时间,可能会导致业务逻辑还没有执行完,锁被释放了的问题。锁续期能保证锁是在业务逻辑执行完才被释放。
正确释放锁: 保证释放自己持有的锁,不能出现 A 释放了 B 持有锁的情况。
2、实现2.1、引入依赖1234567<!-- pom.xml文件--><dependency> <groupId>org.redisson</groupId> <artifactId>redi ...
sharding-jdbc
1、基本概念分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成 ,将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。分库分表分为分库和分表两部分,通常分为垂直分库、垂直分表、水平分库、水平分表
1.1、垂直分库垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上。例如,将用户信息表和订单信息表分别存储在不同的数据库中,以减轻单个数据库的负载压力
1.2、水平分库水平分库是将一个表的数据按照某个条件(例如,按照用户ID的范围或哈希值)分散存储在多个数据库中。每个数据库只存储部分数据。这样可以将数据库负载均衡,并提高查询性能。例如,将用户信息根据用户ID的哈希值分散存储在不同的数据库中
1.3、垂直分表垂直分表是将一个表按照列的方式进行拆分,将不同的列存储在不同的表中。每个表负责存储特定的列数据。这样可以降低单个表的数据量和表的宽度,提高查询性能。例如,将用户表拆分为用户基本信息表和用户扩展信息表,分别存储基本信息和扩展信息
1.4、水平分表水平分表是将一 ...
各框架下的SPI机制实现原理
1、基本概念1.1、概念SPI ( Service Provider Interface),是一种服务发现机制。SPI 的本质是将接口的实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载对应接口的实现类。这样就可以在运行时,获取接口的实现类。通过这一特性,我们可以给很容易的通过 SPI 机制为程序提供拓展功能
1.2、使用场景概括地说,适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。比较常见的例子:
数据库驱动加载接口实现类的加载:JDBC加载不同类型数据库的驱动
日志门面接口实现类加载:SLF4J加载不同提供商的日志实现类
Spring:Spring中大量使用了SPI,比如:对servlet3.0规范对ServletContainerInitializer的实现、自动类型转换Type Conversion SPI(Converter SPI、Formatter SPI)等
Dubbo:Dubbo中也大量使用SPI的方式实现框架的扩展, 不过它对Java提供的原生SPI做了封装,允许用户扩展实现Filter接口。
2、java SPI2.1、基本概念 ...