- 博客(110)
- 资源 (6)
- 收藏
- 关注
原创 简单的审核表设计
在我们的日常开发任务中,有很多的业务是跟审核相关的,业界也有很成熟的工作流框架比如 flowable activiti等,但是项目中如果用这种框架,需要投入一定的时间去学习,这种框架支持的场景很多,但是我们大部分的审核都是比较简单的,综合考虑引入这种框架的成本比较高的时候,我们就可以自己设计一套比较简单的审核表。基础版仅支持审核节点只有一个人的,升级版就是支持一个节点可以有多个审核人,审核的方式可以是一个人审核通过该节点审核通过或者所有审核人审核通过该节点审核通过(或者多余半数以上的人审核通过).
2024-01-29 15:25:32
535
1
原创 Easy Excel生成复杂下Excel模板(下拉框个数超出限制)给用户下载
文件的下载是一个非常常见的功能,也有一些非常好的框架可以使用,这里我们就介绍一种比较常见的场景,下载Excel模版,导入功能通常会配有一个模版下载的功能,根据下载的模版,填充数据然后再上传。
2023-12-16 18:15:27
698
原创 kafka如何保证消息不丢失 不重复消费 消息的顺序
1.生产者生产消息发送到broker,broker收到消息后会给生产者发送一个ack指令.生产者接收到broker发送成功的指令,这个时候我们就可以认为消息发送成功了.没有接收到ack指令我们就认为消息发送失败.这是最可靠的确认模式,在这种模式下,生产者发送消息后会等待所有的ISR(In-Sync Replicas,同步副本)确认。这种模式提供了一定程度的可靠性,因为生产者知道消息至少已经被领导者接收,但仍然可能丢失消息,因为它们可能还没有被复制到其他副本。这确保了消息的可靠性。
2023-11-28 15:07:11
1153
原创 深入理解Feign的负载均衡 失败重试 熔断
feign的组成1.Hystri 将每一个fegin请求封装成一个命令 通过执行命令来控制请求hystrixCommand.execute()2.Feign通过动态代理把最终请求的执行放在了SynchronousMethodHandler.invoke(同步的方法执行器)3.Feign请求通过ribbon负载均衡,来获取注册在eureka上的服务的IP+端口4.默认通过java自带的HttpURLConnection来发送http请求逻辑上 Hystri + ribbon + HttpURLCo
2021-04-16 15:49:50
2387
原创 RetryTemplate用法
public static void main(String[] args) throws Throwable { RetryTemplate retryTemplate = new RetryTemplate(); //指数退避策略 等待时间= 等待时间*倍数 ,即每一次的等待时间是上一次等待时间的n倍, //到达最大的等待时间之后就不在增加了,一直都是以最大的等待时间在等待。默认执行3次 ExponentialBackOffPolicy .
2020-11-02 17:57:09
8016
1
原创 HandlerMethodArgumentResolver简介
文章目录一、HandlerMethodArgumentResolver简介二、使用步骤(分析@PathVariable )1.自定义注解实现HandlerMethodArgumentResolver接口三、实战演练1.场景2.编写注解3.编写处理参数的类4.注册到spring mvc5.使用总结一、HandlerMethodArgumentResolver简介直接看源码/** * 解析处理方法参数的类 */public interface HandlerMethodArgumentResolv
2020-11-02 10:20:22
2461
1
原创 redis分布式锁
文章目录前言一、分布式锁是什么?二、redis实现分布式锁的原理互斥性防止死锁性能好二、写一个基于注解分布式锁1.引入库2.读入数据总结前言redis大部分公司都在使用,再面试redis的时候一定也会被问到的一个问题就是分布式锁。或者你的领导让你写一个分布式锁,那这篇文章肯定可以帮到你提示:以下是本篇文章正文内容,下面案例可供参考一、分布式锁是什么?在多线程同是访问同一个资源的时候,由于线程的访问顺序不能确定,会造成资源同时被多个线程修改的时候数据不一致的情况,锁就是为了避免这种情况的。只有获
2020-10-29 16:34:37
285
原创 redis的数据结构精讲
面试官:用过redis吗?小白:用过面试官:能说说redis的数据类型吗?小白:redis有5种数据类型 String list hash set zset听完小白的答案 面试官内心毫无波澜 继续追问 。。。。这种场景是不是很熟悉,有多少同学都是这么回答的,这种回答,平淡无奇,一点也不能打动面试官,就类似于我们刚开始学英语的时候的一段对话Luce :Are you ok .Tom : I am fine Thank you and you .如何能够在众多的面试者种 脱颖而出呢?要学会
2020-10-20 17:37:48
207
原创 RabbitMq 传递消息实体中LocalDateTime转换不了
我们在用RabbitMq 传递参数的时候通常的做法就是 RabbitMqTemplete对象里的这个方法@Override public void convertAndSend(String exchange, String routingKey, final Object object) throws AmqpException { convertAndSend(exchange, routingKey, object, (CorrelationData) null); }如果我们传递的
2020-09-29 15:01:42
2364
原创 合并dev分支的部分代码到master
首先切换到master分支后如下操作查询提交的记录选择需要合并的提交点击cherry-pick将合并的代码推到远程分支
2020-08-27 15:49:21
823
原创 Nginx安装和配置
nginx安装准备工作 官网下载Linux 版本的nginx 解压到/usr/local//usr/local/nginx-1.14.0一 安装依赖的插件 yum -y install pcre-devel openssl-devel/usr/local/nginx-1.14.0 目录下./configuremake && make install // 默认安装的路径 /usr/local/sbin/nginx安装完成 启动 /usr/local/nginx/sbi...
2020-08-25 18:12:57
173
原创 让人眩晕的递归
今天看到一个算法的题目用递归实现栈内数据的逆序,就是把栈内的数据从上到下颠倒过来。先思考一下这个难度只有2个星的题目自己能不能写出来。。。。。。。。答案的代码我一开始都没有看明白。上代码 public static void reverse(Stack<Integer> stack) { if (stack.isEmpty()) { return;//返回只结束当前的方法 } int i = getLastAn
2020-08-25 17:39:42
152
原创 mongdb系列之currentOp查找慢查询
currentOp这个命令可以查看当前系统所有的操作信息,包括 find insert update remove等db.currentOp(true){ "host" : "mongodb:27018", "desc" : "conn71125", "connectionId" : 71125, "client" : "10.10.29.205:46144", "appName" : "mongoserver", "clientMetadata" : { "driver" :
2020-06-02 15:48:44
933
原创 redis系列七LUR清除算法
概述LRU : Least Recently Used 最少使用算法。redis默认使用的就是LRU算法,服务器的内存是有限的,当redis使用的内存达到最大值的时候,再继续存入数据就会将内存有原有的数据删除掉才可以再保存,这种删除数据的策略就是最近最少使用的数据删掉。缓存清理的配置再redis.conf文件种设置 主要有两个参数maxmemory:最大使用内存,超过这个内存之后就会进行LRU算法。如果是64位的机器设置为0,就表示没有内存限制,知道把服务器的所有内存用光。32位的机器如
2020-05-31 15:28:39
502
原创 redis系列六redis-cluster集群的原理
1 基础通信原理redis cluster 节点之间是采取gossip协议进行通信的。gossip协议是分散式的存储。跟集中式不同,集中式是将所有的节点信息 元数据,存在某个节点上。gossip 是将所有的数据分散存放在各个节点上,通过节点之间的相互通信来保存信息的完整性。2 基于重定向的客户端(1)请求重定向客户端可能会挑选任意一个redis实例去发送命令,每个redis实例接收到命令,都会计算key对应的hash slot如果在本地就在本地处理,否则返回moved给客户端,让客
2020-05-30 11:36:33
275
原创 redis系列五redis-cluste集群的搭建
一 环境准备三台虚拟机 centos7 安装6个redis的实例三个master 3个slave192.168.0.30 安装7001 7002 端口192.168.0.31 安装7003 7004 端口192.168.0.32安装7005 7006 端口本次安装也是基于前面的博客来安装的,单机的安装可以查看redis单机安装和生产环境的启动方式不同的地方就是修改的配置文件内容不一致。二修改配置文件redis.conf 文件修改为7001.conf 7002.con...
2020-05-30 00:44:01
321
原创 Redis系列四哨兵机制和数据丢失
sentinal 哨兵机制 主要功能1. 集群的监控 负责监控redis master slave 进程是否正常工作2. 消息通知 sentinal发现某个节点的有故障会给管理员发送消息3.故障转移 如果master node发生故障会自动将slave node 节点转化成master node4.配置中心如果故障转移发生了,通知client客户端新的master地址sentinal 本身也是分布式的,作为一个集群相互协作1.哨兵至少需要三个实例,来保证自己的健壮性。再判断mast.
2020-05-24 22:35:30
486
原创 redis系列三 主从架构的部署和原理
部署准备两台集器 一主一从192.168.0.30 主192.168.0.31 从分别在两台机器上安装好redis 具体步骤redis单机安装及生产环境的启动方案修改主服务器配置文件vim /etc/redis/6379.confbind 192.168.0.30 (原来是127.0.0.1修改成本机的ip 或者 0.0.0.0 允许其他集器连接这台集器。不修改的化从服务器无法连接到主服务器)requirepass redis-pass (连接主服务器需要安全密码验证 ,密码是redi
2020-05-24 18:09:36
1193
原创 redis系列二完全搞懂redis的持久化
redis本身就是缓存,数据再中央仓库也有存储为什么还要持久化呢? 意外情况redis服务器不可用,如果数据都丢失了,就必须从数据库同步过来 如果数据量很大的情况,这种操作是非常耗时的,如果请求全部都打到数据库 数据库也是承受不了的。所以数据的持久化是很有必要的。 持久化方案: RDB;每个一定时间生成redis的完整数据内存快照。快照的时候会有IO操作,redis一边响应客户端的请求一边持久化数据, Redis是利用多进程COW copy on write...
2020-05-23 17:29:43
228
原创 Redis系列一 单机安装和生产环境启动方案
准备工作:官网下载安装包有两个http://download.redis.io/releases/redis-5.0.5.tar.gz redis的安装包http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz 使用Redis的测试用例也就是tests目录下面用的是tcl脚本需要用到这开始安装tcl8.6.1-src 将下载好的两个包都放到/usr/local/tar -xzvf tcl8.6.1-src.tar....
2020-05-23 09:01:59
152
原创 ElasticSearch系列四 配置中文分词器
第一步下载 elasticsearch-analysis-ikhttps://github.com/medcl/elasticsearch-analysis-ik/releases 一定要选择跟自己安装的版本一样的.第二步 解压在es的安装目录plugins下新建文件夹ik将分词器加压到这个目录第三步 启动es查看分词效果自定义扩展词 停用词找到IKAnalyzer.cfg.xml 查看内容如下<?xml version="1.0" encoding="UTF-8"?>&l
2020-05-22 15:50:36
535
原创 tomcat 整体架构
tomcat 整体的架构tomcat中最顶层的容器是server,一个Tomcat只能有一个server.tomcat通过service对外提供服务,service比作一个家庭这个家庭的核心就是connector container,多个connector对应一个container.connector container两个组件就是tomcat整个架构的心脏.connector 作用用于接收客户端的请求,底层通过socket技术监听特定的端口,来接收请求并将请求按照一定的编码(默认UTF-8)
2020-05-11 17:29:52
299
原创 谈一谈Spring IOC
概念IOC:Inversion of comtrol 控制反转,这个概念说起来很熟悉,理解起来还是有点困难的。要先弄清楚第一个问题:谁控制了谁?public class Persion { private Order order; public Persion(Order order) { this.order = order; }...
2020-05-07 11:07:51
128
原创 谈一谈 JVM 垃圾收集器
引言随着计算机硬件的不断演进 单核 到 多核 垃圾收集器也在不断的演进 单线程到多线程 并行到并发Serial && Serial Old JDK1.3的配置serial是新生代的垃圾收集器,标记 复制 算法serial Old 是老年代的垃圾收集器,标记 整理 算法单线程垃圾收集器 简单 高效 多核资源浪费执行流程1.新生代Ende区域的内存满了以后会触发...
2020-05-03 15:08:21
122
原创 ElasticSearch系列三 分组 聚合
文章目录基础知识案例基础知识bucket 其实就是分组 相当于msql 中 group bymetric 就是统计 相当于 mysql 中的count案例以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析GET /tvs/sales/_search{ "size": 0, "aggs": { "ppp": { ...
2020-04-28 18:44:17
1865
原创 mongdb系列之 aggregate展示未被分组的字段
最近遇到一个需求 查询mongdb 根据title字段分组 标题相同的统计数量 同时其他相关的字段也要展示.类似这样的sqlSELECT id,title , synopsis ,news_url ,COUNT(1) from crawl_news_info GROUP BY title LIMIT 10网上搜到的最多的就是最简单的显示的字段 分组的字段 和 操作符的字段 例如...
2020-04-22 17:49:14
1448
原创 JDK观察者 和 spring中的事件监听
文章目录设计模式之观察者模式JDK源码中为我们提供的观察者模式借助于Spring IOC 完善我们的代码spring 事件监听设计模式之观察者模式定义了一种一对多的依赖关系,让多个观察者同时订阅一个主题对象,当这个主题发生变化的时候会通知所有的观察者,观察者自己来完成自己的更新.JDK源码中为我们提供的观察者模式被观察的对象//可以被观察的类public class Observabl...
2020-04-20 18:43:51
176
原创 ElasticSearch系列二 DSL查询
文章目录查询和过滤查询match二级目录三级目录查询和过滤叶查询子句:在特定的字段上查找特定的值,比如 match term rang 可以理解为单条件查询复合查询字句:包含其他叶查询或复合查询,可以理解为多条件查询.查询: query 用于检索内容与条件是否匹配,并计算_score份数过滤:filter不计算匹配得分,只是简单的决定文档是否匹配,主要用于过滤结构化数据 如时间 状态 ...
2020-04-14 18:38:19
375
原创 工厂 + 策略 模式 如何做到完全对修改关闭
一般在使用设计模式的时候工厂模式和策略模式接合到一起使用,在工厂内根据不同的参数创建不同的策略这是一段伪代码方便大家理解 关于工厂模式和策略模式的具体细节不是本文的重点,重点是如何做到代码写完不去修改这个方法.随着业务的改变,会有不同的新的策略加进来,我们写一个新的策略类 然后再在这里添加一个case就可以了,但是作为一个对自己有要求的码农应该考虑如何做到只添加新的类 不去修改老的类....
2020-04-09 14:04:12
215
原创 创建对象的那些事
文章目录要不要在for循环内部new第一种情况 对于new的调用只存在于for循环以内第二种情况 对于new的调用不止存在于for循环以内外部也有调用new 和 clone的区别 哪个更快new一个对象的过程clone 对象要不要在for循环内部new第一种情况 对于new的调用只存在于for循环以内对象的保存位置是在堆内存中, p只是一个记录了堆地址的4个字节的引用 p存在的位置是栈内存...
2020-04-08 17:58:06
126
原创 ElasticSearch系列一 基础知识
文章目录基础知识elasticSearch是什么lucene的倒排索引压缩算法索引词文本路由分片索引 index类型 type文档 document映射 mappingID端口号基础知识elasticSearch是什么elasticSearch基与lucece构建的 分布式的 RESTFUL接口的全文搜索引擎.天生的分布式:它知道如何管理节点来完成扩展和高可用.所以水平扩展很方便只需要加...
2020-04-07 17:58:47
171
原创 Netty 系列六 实现心跳机制 超时重连
编写服务端package com.example.netty.netty.heartbeat;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.chann...
2020-04-06 15:56:03
1190
原创 Netty 系列五 Netty重要对象介绍
ServerBootstrap 服务器端的启动配置类,主要作用是将netty的各个组件串联到一起,客户端的配置类Bootstrap 主要的方法有public ServerBootstrap group(EventLoopGroup group) 装配一个线程组 一般客户端使用这个方法 客户端只需要有一个workgroup来处理事件public ServerBootstrap group...
2020-03-20 11:19:21
398
原创 Netty 系列四 netty实现客户端和服务端通信
package com.example.netty.netty.simple;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChan...
2020-03-19 16:29:19
201
原创 Netty 系列 三 Reactor模型和Netty模型
传统的IO模型Reactor模型 有三种 单Reactor单线程 单Reactor多线程 主从Reactor多线程分别对应下图单Reactor单线程单Reactor多线程主从Reactor多线程别名 分发者模式 通知者模式 反应器模式Netty模型就是基于主从Reactor多线程模式又进行了一些改造Netty 模型1.Ne...
2020-03-19 16:24:31
321
原创 Netty 系列 二 NIO 零拷贝
传统的IO操作流程这里好多人说有4次上下文的切换,这个我感觉不是很重要,次数主要是看开始的状态和最后结束的状态,上图中程序在数据到网络时就结束了,其实这之后还有一次内核到进程的切换,开始和结束都是在进程状态NIO实现零拷贝方式一transferTo()这个流程涉及到3次数据的拷贝 内核态与用户态上下文的切换次数比传统的模式少了2次直接在内核态完成数据的传输 数据...
2020-03-18 17:17:55
225
原创 Netty 系列 一 NIO模型
Java NIO 的模型图1.一个selector对应一个线程来管理2.一个selector 管理多个channel3.每个channel对应一个自己的buffer4.程序切换到哪一个channel是有事件决定的 event5.selector会根据不同事件在多个channnel之间来切换6.buffer是一个内存块 底层是一个数组7.对channel的读写都...
2020-03-18 15:23:11
191
原创 Elasticsearch调优实践
性能调优一 Linux参数调优关闭交换分区,防止内存置换降低性能。 将/etc/fstab 文件中包含swap的行注释掉sed -i '/swap/s/^/#/' /etc/fstabswapoff -a磁盘挂载选项noatime:禁止记录访问时间戳,提高文件系统读写性能 data=writeback: 不记录data journal,提高文件系统写入性能 barrier...
2020-03-11 08:48:11
262
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人