Java
西门飘雪VIP
西门飘雪,专注Java后端开发
展开
-
java8 快速实现List转map 、分组、过滤等操作
利用java8新特性,可以用简洁高效的代码来实现一些数据处理。定义1个Apple对象:public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer id, String name, BigDecimal money, Integer num) {转载 2020-12-30 17:48:59 · 250 阅读 · 0 评论 -
微信红包随机算法
最近看了一篇文章,讲微信红包随机算法的。感觉很不错,所以自己实现了下,并进行了简单测试。算法算法很简单,不是提前算好,而是抢红包时计算:红包里的金额怎么算?为什么出现各个红包金额相差很大?答:随机,额度在0.01和剩余平均值*2之间。实现实现上述算法的逻辑主要是:public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余的红包数量 // remainMoney 剩原创 2020-11-26 20:20:55 · 613 阅读 · 0 评论 -
redis实战系列-如何实现一个短链接服务
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。大家经常会收到一些莫名的营销短信,里面有一个非常短的链接让你跳转。新浪微博因为限制字数,所以也会经常见到这种看着不像网址的网址。短链的兴起应该就是微博限制字数激起了大家的创造力。如果创建一个短链系统,我们应该做什么呢?将长链接变为短链; 用户访问短链接,会跳转到正确的长链接上去。查找到对应的长网址,并跳转到对应的页面。短链生成方法#短码一般是由[a - z, A - Z, 0 - 9]这62 个字..转载 2020-11-13 13:59:18 · 617 阅读 · 0 评论 -
Reddit 如何实现大规模的帖子浏览计数
我们希望更好地将 Reddit 的规模传达给我们的用户。到目前为止,投票得分和评论数量是特定的帖子活动的主要指标。然而,Reddit 有许多访问者在没有投票或评论的情况下阅读内容。我们希望建立一个能够捕捉到帖子阅读数量的系统。然后将该数量展示给内容创建者和版主,以便他们更好地了解特定帖子上的活动。在这篇文章中,我们将讨论我们如何大规模地实现计数。计数方法对浏览计数有四个主要要求:计数必须是实时的或接近实时的。不是每天或每小时的总量。 每个用户在短时间内只能计数一次。 显示的数量与实际转载 2020-11-13 13:54:12 · 237 阅读 · 0 评论 -
java 8 对JSONArray 按指定字段排序,升序和倒序
以前在内存中用大数据量的排序不论使用冒泡排序还是使用Collections.sort效率都相当低下,现如今Java 8 出现了Comparator首先这并不是一个方法,而是一个接口@FunctionalInterfacepublic interface Comparator<T> {}在此不过多阐述它实现的原理,只在这里介绍它的两个实现方法/** * Accepts a function that extracts a {@link java.lang.Co...原创 2020-11-13 13:47:14 · 1306 阅读 · 0 评论 -
如何实现一个短链接服务
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。大家经常会收到一些莫名的营销短信,里面有一个非常短的链接让你跳转。新浪微博因为限制字数,所以也会经常见到这种看着不像网址的网址。短链的兴起应该就是微博限制字数激起了大家的创造力。如果创建一个短链系统,我们应该做什么呢?将长链接变为短链; 用户访问短链接,会跳转到正确的长链接上去。查找到对应的长网址,并跳转到对应的页面。短链生成方法#短码一般是由[a - z, A - Z, 0 - 9]这62 个字..转载 2020-11-12 14:01:35 · 222 阅读 · 0 评论 -
克隆工具类--进行深克隆对象、集合
package com.JUtils.clone;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.Collection.原创 2020-11-01 16:34:13 · 217 阅读 · 0 评论 -
两个系统之间数据同步
1.概述本文所讨论的数据同步是指分别部署的多套系统之间的数据同步。数据同步可分为三类:实时同步、定时同步、手动同步。同步方案可分为:数据库同步、读写文件同步、直接调用接口同步。2.数据同步同步讲究数据传输的时效性,要求对于数据的变化要快速反应。数据同步最好的情况是能够实现实时同步,但是考虑到数据同步过程中对系统的压力以及数据实时同步的必要性等因素有时会选择定时同步和手动同步。3.同步方案数据需要从平台A同步到平台B。目前只考虑数据从A到B的情况。3.1.数据库同步通过原创 2020-05-23 21:50:40 · 6519 阅读 · 1 评论 -
分布式任务调度平台XXL-JOB
一、分布式任务调度概述什么是任务调度平台任务调度是指基于给定的时间点,给定的时间间隔又或者给定执行次数自动的执行任务。我们可以思考一下在以下场景中,我们应该怎么实现:支付系统每天凌晨 1 点,进行一天清算,每月 1 号进行上个月清算; 电商整点抢购,商品价格8点整开始优惠 12306 购票系统,超过 30 分钟没有成功支付订单的,进行回收处理为什么需要任务调度平台定时任务是程...原创 2020-03-18 01:34:58 · 304 阅读 · 0 评论 -
arthas源码分析
arthas简介arthas 是Alibaba开源的Java诊断工具,基于jvm Agent方式,使用Instrumentation方式修改字节码方式以及使用java.lang.management包提供的管理接口的方式进行java应用诊断。详细的介绍可以参考官方文档。官方文档地址:https://alibaba.github.io/arthas/GitHub地址:https://gith...原创 2020-03-18 01:00:06 · 968 阅读 · 0 评论 -
springboot + redis + 注解 + 拦截器 实现接口幂等性校验
一、概念幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次比如:订单接口, 不能多次创建订单 支付接口, 重复支付同一笔订单只能扣一次钱 支付宝回调接口, 可能会多次回调, 必须处理重复回调 普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次 等等二、常见解决方案唯一索引 -- 防止新增脏数据 token机制 -- 防止页面重...原创 2020-03-18 00:35:16 · 127 阅读 · 0 评论 -
Java-Lambda表达式和“方法引用”的对比和详解
Lambda表达式一、Lambda表达式简介1.1什么是Lamdba表达式? Lambda表达式是Java 8 添加的一个新特性,可以认为,Lambda是一个匿名函数(相似于匿名内部类),作用是返回一个实现了接口的对象(这个观点非常重要,贯穿于Lambda表达式的整个使用过程)。1.2为什么使用Lambada表达式? 使用Lambda表达式对比于其他接口实现方式显得非常...转载 2020-02-03 21:18:52 · 644 阅读 · 0 评论 -
幂等问题 8种方案解决重复提交
1.什么是幂等在我们编程中常见幂等select查询天然幂等delete删除也是幂等,删除同一个多次效果一样update直接更新某个值的,幂等update更新累加操作的,非幂等insert非幂等操作,每次新增一条2.产生原因由于重复点击或者网络重发 eg:点击提交按钮两次;点击刷新按钮;使用浏览器后退按钮重复之前的操作,导致重复提交表单;使用浏览器历史记录重复提交表...原创 2019-10-28 01:36:20 · 500 阅读 · 0 评论 -
MySQL常用30种SQL查询语句优化方法
1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num is ...原创 2019-10-28 00:52:53 · 101 阅读 · 0 评论 -
Java 函数优雅之道
导读随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题。持续地优化代码,提高代码的质量,是提升系统生命力的有效手段之一。软件系统思维有句话“Less coding, more thinking(少编码、多思考)”,也有这么一句俚语“Think more, code less(思考越多,编码越少)”。所以,我们在编码中多思考多总结,努力提升自己的编码水平,才能编写...转载 2019-10-28 00:47:01 · 107 阅读 · 0 评论 -
springboot项目的优雅关闭方式(更新部分细节)
本案例使用的是springboot2.0.4当把打包好的jar包发布到服务器,并通过java -jar运行,一般要把springboot项目关闭大多数都是先找到项目的pid,然后直接kill pid,不过这种方法在特殊需求场景下不太合适(不安全),同时也不优雅。下面通过actuator来让springboot项目关闭优雅化。先导入maven依赖<dependency>...转载 2019-10-28 00:32:34 · 553 阅读 · 0 评论 -
如何优雅关闭 Spring Boot 应用
如何优雅关闭 Spring Boot 应用前言随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理中的请求丢弃,响应失败。这样的响应失败尤其是在处理重要业务逻辑时需要极力避免的,那么有什么更好的方式来平滑地关闭 SpringBo...原创 2019-10-28 00:23:11 · 272 阅读 · 0 评论 -
消灭 Java 代码的“坏味道”
导读明代王阳明先生在《传习录》谈为学之道时说:私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。...转载 2019-10-23 08:45:03 · 119 阅读 · 0 评论 -
淘宝千万级并发分布式架构的演进
一、概述本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。二、基本概念在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:1)分布式系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomca...转载 2019-10-22 20:32:06 · 561 阅读 · 0 评论 -
写业务代码最容易掉的8种坑
1、客户端的使用我们在使用Redis、ElasticSearch、RabbitMQ、Mongodb等中间件或存储的时候肯定都会使用客户端包来和这些系统通讯,我们也会使用Http的一些客户端来发Http请求。在使用这些客户端包的时候,非常容易犯错的一个地方就是Client的使用方式,比如有一个叫做RedisClient的类,是Redis操作的入口。你应该是每次使用new RedisClient....转载 2019-10-22 20:24:03 · 178 阅读 · 0 评论 -
一文教会你如何写复杂业务代码
了解我的人都知道,我一直在致力于应用架构和代码复杂度的治理。这两天在看零售通商品域的代码。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,是一个新课题。针对该命题,我进行了比较细致的思考和研究。结合实际的业务场景,我沉淀了一套“如何写复杂业务代码”的方法论,在此分享给大家。我相信,同样的方法论可以复制到大部分复杂业务场景。一个复杂业务的处理过程业务背景简单的介绍下业...转载 2019-10-22 20:23:07 · 202 阅读 · 0 评论 -
那些年,我们见过的 Java 服务端乱象
导读查尔斯·狄更斯在《双城记》中写道:“这是一个最好的时代,也是一个最坏的时代。”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动;随着行业竞争加剧,互联网红利逐渐消失,很多创业公司九死一生。笔者在初创公司摸爬滚打数年,接触了各式各样的 Java 微服务架构,从中获得了一些优秀的理念,但也发现了一些不合理的现象。现在,笔者总结了一些创业公司存在的 Java 服务端乱象...转载 2019-10-22 20:05:55 · 130 阅读 · 0 评论 -
那些年,我们见过的 Java 服务端“问题”
导读明代著名的心学集大成者王阳明先生在《传习录》中有云:道无精粗,人之所见有精粗。如这一间房,人初进来,只见一个大规模如此。处久,便柱壁之类,一一看得明白。再久,如柱上有些文藻,细细都看出来。然只是一间房。是的,知识理论哪有什么精粗之分,只是人的认识程度不同而已。笔者在初创公司摸爬滚打数年,接触了各式各样的Java服务端架构,见得多了自然也就认识深了,就能分辨出各种方案的优劣了。这...转载 2019-10-22 20:04:43 · 195 阅读 · 0 评论 -
EasyExcel使用的正确姿势,工具类封装
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要10...原创 2019-10-22 17:15:48 · 1849 阅读 · 0 评论 -
微服务写的最全的一篇文章
今年有人提出了2018年微服务将疯狂至死,可见微服务的争论从未停止过。在这我将自己对微服务的理解整理了一下,希望对大家有所帮助。1.什么是微服务1)一组小的服务(大小没有特别的标准,只要同一团队的工程师理解服务的标识一致即可)2)独立的进程(java的tomcat,nodejs等)3)轻量级的通信(不是soap,是http协议)4)基于业务能力(类似用户服务,商品服务等等)...原创 2019-10-22 16:48:51 · 268 阅读 · 0 评论 -
Java 优雅地分离验证代码与业务核心代码,减少过多的if-else
在平常项目开发中,不知道你们有没有遇上这么一个现象:业务模块在进行某个业务运算前, 都要先通过一些验证。随着业务扩展,这些验证越来越多,if-else的写法越来越显得麻烦,而且很多部分不能实现复用。基于为解决以上痛点,我用采用这样的写法,效果还不错。废话不多说,看Demo。验证接口类:Condition.java/** * 验证接口 * @param <T> *...转载 2019-10-08 18:04:07 · 208 阅读 · 0 评论 -
减少该死的 if else 嵌套
写在前面不知大家有没遇到过像“横放着的金字塔”一样的if else嵌套:if (true) { if (true) { if (true) { if (true) { if (true) { if (true) { ...原创 2019-10-08 18:05:39 · 139 阅读 · 0 评论 -
6个实例详解如何把if-else代码重构成高质量代码
本文提纲:为什么我们写的代码都是if-else?这样的代码有什么缺点?是否有优化的方法?如何重构?异常逻辑处理型重构方法状态处理型重构方法为什么我们写的代码都是if-else?程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个if-else,可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进行类型和值进行判断;这里要判断下对象是否为nul...转载 2019-10-08 18:16:17 · 119 阅读 · 0 评论 -
RabbitMQ之业务场景:动态创建,删除队列工具类(一)
RabbitConfig.java 配置类import java.util.HashMap;import java.util.Map;import org.springframework.amqp.core.Binding;import org.springframework.amqp.core.BindingBuilder;import org.springframework.a...原创 2019-05-08 13:41:06 · 3117 阅读 · 0 评论 -
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4....原创 2018-07-31 19:03:33 · 124 阅读 · 0 评论 -
为什么 Java 中只有值传递?
首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。Java程序设计语言总...原创 2019-10-08 16:14:06 · 111 阅读 · 0 评论 -
“XML Parser Error on line 1: 前言中不允许有内容。”问题解决方法
在使用mybatis逆向生成工具时,总是会报一个错误:XML Parser Error on line 1: 前言中不允许有内容。之前一直只是知道这个问题但是并不知道是什么问题,每次只能在Eclipse里面编辑好了然后粘贴过去,今天又遇到了这个问题,通过相关文档找出如下原因:你在修改进行保存的时候系统修改了文件的编码,我们修改完文件之后选择另存为的时候重新选择编码就行了。...原创 2019-09-23 09:44:01 · 1954 阅读 · 0 评论 -
RabbitMQ (四) 路由选择 (Routing)
上一篇博客我们建立了一个简单的日志系统,我们能够广播日志消息给所有你的接收者,如果你不了解,请查看:RabbitMQ (三) 发布/订阅。本篇博客我们准备给日志系统添加新的特性,让日志接收者能够订阅部分消息。例如,我们可以仅仅将致命的错误写入日志文件,然而仍然在控制面板上打印出所有的其他类型...转载 2019-04-23 17:49:07 · 179 阅读 · 0 评论 -
RabbitMQ (三) 发布/订阅
本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与实验,内容仅供参考。 上一篇博客中,我们实现了工作队列,并且我们的工作队列中的一个任务只会发给一个工作者,除非某个工作者未完成任务意外被杀死,会转发给另外的工作者,如果你还不了解:RabbitMQ (二)工作队列。这篇博客中,...转载 2019-04-23 17:46:31 · 157 阅读 · 0 评论 -
RabbitMQ (二)工作队列
本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与实验,内容仅供参考。上一篇博客中我们写了通过一个命名的队列发送和接收消息,如果你还不了解请点击:RabbitMQ 入门 Helloworld。这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务。工作队...转载 2019-04-23 17:41:07 · 153 阅读 · 0 评论 -
RabbitMQ 入门 Helloworld
RabbitMQ 入门 Helloworld 1、Windows下RabbitMQ的安装下载Erlang,地址:http://www.e...转载 2019-04-23 17:36:36 · 136 阅读 · 0 评论 -
maven中的setting.xml配置
<?xml version="1.0" encoding="UTF-8"?><settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.ap...原创 2018-07-17 10:36:15 · 920 阅读 · 0 评论 -
SnowflakeId
/*** Project Name:springBootStudy* File Name:SnowflakeIdWorker.java* Package Name:com.dream.java.utils* Date:2018年6月22日上午10:36:09* Copyright (c) 2018, bluemobi All Rights Reserved.**/pa...原创 2018-07-31 20:23:20 · 726 阅读 · 0 评论 -
maven的pom.xml文件详解
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4...原创 2018-08-13 15:07:32 · 310 阅读 · 0 评论 -
Mybatis乐观锁插件
背景:对于数据库的同一条记录,假如有两个人同时对数据进行了修改,然后最终同步到数据库的时候,因为存在着并发,产生的结果是不可预料的。最简单的解决方式就是通过给表的记录加一个version字段,记录在修改的时候需要比较一下version是否匹配,如果匹配就更新,不匹配就直接失败。更新成功则把version+1,也就是所谓的乐观锁。当然这样的逻辑最好能做到对开发人员透明,本插件就是来做这件事情的。...转载 2018-08-13 14:59:29 · 778 阅读 · 0 评论