技术文
不务正业的程序汪
这个作者很懒,什么都没留下…
展开
-
如何优雅地处理重复请求(并发请求)
利用唯一请求编号去重你可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一请求编号在redis存在,证明处理过,那么就认为是重复的代码大概如下: String KEY = "REQ12343456788";//请求唯一编号 long expireTime = 1000;// 1000毫秒过期,1000ms内的重复请求会认为重复 long expireAt = System.currentTimeMillis() + expireTime;原创 2020-11-27 14:42:12 · 237 阅读 · 0 评论 -
Spring Security 是如何在 Servlet 应用中执行的?
Spring Security 是一个强大的认证和授权框架,它的使用方式也非常简单,但是要想真正理解它就需要花一时间来学习了,最近在学习 Spring Security 时有一些新的理解,特意记录下来防止知识忘记的太快,毕竟好记性不如烂笔关,也给即将准备学习 Spring Security 的同志做一个参考。由于我在学习和使用是基于 Servlet Applications 的,所以文中的大部分都与 Servlet 相关,当然 Spring Security 还支持 Reactive Applicatio原创 2020-11-26 14:04:44 · 153 阅读 · 1 评论 -
SpringBoot 注解每一个用途你都应该清晰了解
一、注解(annotations)列表1、@SpringBootApplication包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文。2、@ComponentScan组件扫描,可自动发现和装配一些Bean。3、@Configuration等同于Spring的XML配置文件;使用Java代码可以检查类型安全。4转载 2020-11-19 14:17:58 · 92 阅读 · 0 评论 -
MyBatis 为什么可以兼容所有常用的日志框架?
前言日志,在我们开发中是一个非常重要的话题,良好的日志打印可以帮助我们快速的定位问题,可能现在我们开发用到最多的日志框架就是slf4j了,但是日志还有其他很多优秀的框架,比如:Apache Common Log,Log4j,java.util.logging等。MyBatis作为一款优秀的ORM框架,定义了一套统一的日志接口供应用层调用,而底层却利用适配器模式兼容了我们上面所列出来的常用日志框架。MyBatis日志分类在介绍MyBatis的全局配置文件的时候,我们提到setting内有一个属性logI原创 2020-11-17 19:29:15 · 81 阅读 · 0 评论 -
MySQL 的 join 功能弱爆了?
简介: 对于 join 操作的实现,大概有 Nested Loop Join (循环嵌套连接),Hash Join(散列连接) 和 Sort Merge Join(排序归并连接) 三种较为常见的算法,它们各有优缺点和适用条件,接下来我们会依次来介绍。关于MySQL 的 join,大家一定了解过很多它的“轶事趣闻”,比如两表 join 要小表驱动大表,阿里开发者规范禁止三张表以上的 join 操作,MySQL 的 join 功能弱爆了等等。这些规范或者言论亦真亦假,时对时错,需要大家自己对 join 有.原创 2020-11-12 14:20:57 · 88 阅读 · 0 评论 -
一次List对象去重失败,引发对Java8中distinct()的思考
list的转map的另一种猜想Java8使用lambda表达式进行函数式编程可以对集合进行非常方便的操作。一个比较常见的操作是将list转换成map,一般使用Collectors的toMap()方法进行转换。一个比较常见的问题是当list中含有相同元素的时候,如果不指定取哪一个,则会抛出异常。因此,这个指定是必须的。当然,使用toMap()的另一个重载方法,可以直接指定。这里,我们想讨论的是另一种方法:在进行转map的操作之前,能不能使用distinct()先把list的重复元素过滤掉,然后转map的时原创 2020-11-11 23:04:52 · 306 阅读 · 1 评论 -
求求你们了,别再写满屏的 if/ else 了!
为什么我们写的代码都是 if-else?程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个 if-else,可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进行类型和值进行判断;这里要判断下对象是否为 null;不同类型执行不同的流程。落地到具体实现只能不停地加 if-else 来处理,渐渐地,代码变得越来越庞大,函数越来越长,文件行数也迅速突破上千行,维护难度也越来越大,到后期基本达到一种难以维护的状态。虽然我们都很不情愿写出满屏 if-else 的代码,可逻原创 2020-11-11 15:52:59 · 101 阅读 · 0 评论 -
如何构建 Kubernetes 原生云边高效协同网络?
使用场景在应用的部署和运维过程中,用户常常需要获取应用的日志,或直接登录到应用的运行环境中进行调试。在 Kubernetes 环境中,我们通常使用 kubectl log,kubectl exec 等指令来实现这些需求。如下图所示,在 kubectl 请求链路上, kubelet 将扮演服务器端,负责处理由 kube-apiserver(KAS) 转发来的请求,这就要求 KAS 和 kubelet 之间需要存在一条网络通路,允许 KAS 主动访问 kubelet。图一:kubectl 执行流程然而,原创 2020-11-09 16:02:59 · 259 阅读 · 0 评论 -
如何让 Mybatis 自动生成代码,提高开发效率
在使用 mybatis 过程中, 当手写 JavaBean和XML 写的越来越多的时候, 就越来越同意出错。这种重复性的工作, 我们当然不希望做那么多。还好, mybatis 为我们提供了强大的代码生成–MybatisGenerator。通过简单的配置, 我们就可以生成各种类型的实体类, Mapper接口, MapperXML文件, Example对象等。通过这些生成的文件, 我们就可以方便的进行单表进行增删改查的操作。以下的工具使用的都是 IDEA1 创建代码生成器1.1 创建Maven项目1原创 2020-11-08 14:37:59 · 228 阅读 · 0 评论 -
五大分布式事务,你了解多少?
一、前言事务(Transaction):一般是指要做的或所做的事情,由 事务开始(begin transaction) 和 事务结束(end transaction) 之间执行的全体操作组成。简单的讲就是:要么全部被执行,要么就全部失败。那分布式事务,自然就是运行在分布式系统中的事务,是由多个不同的机器上的事务组合而成的。同上,只有分布式系统中所有事务执行了才能是成功,否则失败。事务的基本特征ACID:原子性(Atomicity): 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,原创 2020-11-07 19:53:45 · 179 阅读 · 0 评论 -
浅聊 volatile原理
volatilevolatile 只能保证对单次读/写的原子性。i++ 这种符合操作操作不能保证原子性。禁止指令重排可见性volatile读的内存语义当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量(注意不仅仅是一个volatile变量,是所有共享变量)volatile写的内存语义当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存(注意不仅仅是一个volatile变量,是所有共享变量)可见性原创 2020-11-07 15:02:42 · 128 阅读 · 0 评论 -
Spring Boot 打包不同环境配置与 Shell 脚本部署
本篇和大家分享的是 Spring Boot 打包并结合 Shell 脚本命令部署,重点在分享一个shell 程序启动工具,希望能便利工作;profiles指定不同环境的配置maven-assembly-plugin打发布压缩包分享shenniu_publish.sh程序启动工具linux上使用shenniu_publish.sh启动程序profiles指定不同环境的配置通常一套程序分为了很多个部署环境:开发,测试,uat,线上 等,我们要想对这些环境区分配置文件,可以通过两种方式:通过a原创 2020-11-03 19:10:17 · 133 阅读 · 0 评论 -
你还在认为 count(1) 比 count(*) 效率高?
1. count(1) and count(*)当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!从执行计划来看,count(1)和count()的效果是一样的。但是在表做过分析之后,count(1)会比count()的用时少些(1w以内数据量),不过差不了多少。如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。因为count(),自动会优化指定到那一个字段。所以没必要去count(1),用count(),sql会帮你完成优化的原创 2020-11-03 16:24:56 · 188 阅读 · 0 评论 -
SpringBoot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除
看了好多文章,都只讲了基础的demo用法,也就是简单的创建运行定时任务,对定时任务的管理却很少。我这里从0开始搭建一个简单的demo,包括定时任务的各种操作,以及API的一些用法,可以实现大多场景的需求。如:普通定时任务的创建、启动、停止。动态创建定时任务,如创建一个订单,5分钟后执行某某操作。一、整个 Quartz 的代码流程基本基本如下首先需要创建我们的任务(Job),比如取消订单、定时发送短信邮件之类的,这是我们的任务主体,也是写业务逻辑的地方。创建任务调度器(Scheduler),转载 2020-11-02 20:03:53 · 298 阅读 · 0 评论 -
打工人打工魂,打工的必会java调用python的几种用法
1.在java类中直接执行python语句准备工作:创建maven工程,结构如下:到官网https://www.jython.org/download.html下载Jython的jar包或者在maven的pom.xml文件中加入如下代码:<dependency>java <groupId>org.python</groupId> <artifactId>jython-standalone</artifactId> &l原创 2020-11-02 17:44:15 · 3256 阅读 · 2 评论 -
Spring中的Controller ,Service,Dao是不是线程安全的?
结论:不是线程安全的Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring 的 bean 作用域(scope)类型singleton:单例,默认作用域。prototype:原型,每次创建一个新对象。request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。session:会话,同一个会话共原创 2020-10-31 15:54:03 · 129 阅读 · 2 评论 -
啪啪打脸!领导说:try-catch要放在循环体外!
性能评测话不多说,我们直接来开始今天的测试,本文我们依旧使用 Oracle 官方提供的 JMH(Java Microbenchmark Harness,JAVA 微基准测试套件)来进行测试。首先在 pom.xml 文件中添加 JMH 框架,配置如下:<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core --><dependency> <groupId>org.openjdk.jmh.原创 2020-10-29 19:25:13 · 336 阅读 · 3 评论 -
10 个冷门但又非常实用的 Docker 使用技巧
简介在平时的工作中,docker接触很多,除了经常使用的docker run ,docker stop等命令,docker还有很多十分有用但是却不经常使用的命令,下面我就总结一下操作docker top这个命令是用来查看一个容器里面的进程信息的,比如你想查看一个nginx容器里面有几个nginx进程的时候,就可以这么做➜ ~ docker top 3b307a09d20dUID PID PPID原创 2020-10-28 21:02:26 · 222 阅读 · 0 评论 -
MySQL 实现一个简单版搜索引擎,真是绝了!
前言只有Innodb和myisam存储引擎能用全文索引(innodb支持全文索引是从mysql5.6开始的)char、varchar、text类型字段能创建全文索引(fulltext index type)全文索引的基于关键词的,如何区分不同的关键词了,就要用到分词(stopword)英文单词用空格,逗号进行分词;中文分词不方便(一个句子不知道怎样区分不同的关键词)内置分词解析器ngram支持中文,日文,韩文(将句子分成固定数字的短语)当对表写入大量数据时,写入数据后再创建全文索引的速度更快(原创 2020-10-28 15:23:22 · 553 阅读 · 0 评论 -
10 张图打开 CPU 缓存一致性的大门
CPU Cache 的数据写入随着时间的推移,CPU 和内存的访问性能相差越来越大,于是就在 CPU 内部嵌入了 CPU Cache(高速缓存),CPU Cache 离 CPU 核心相当近,因此它的访问速度是很快的,于是它充当了 CPU 与内存之间的缓存角色。CPU Cache 通常分为三级缓存:L1 Cache、L2 Cache、L3 Cache,级别越低的离 CPU 核心越近,访问速度也快,但是存储容量相对就会越小。其中,在多核心的 CPU 里,每个核心都有各自的 L1/L2 Cache,而 L3.原创 2020-10-27 20:59:36 · 68 阅读 · 0 评论 -
10个常见的软件架构模式
想知道如何设计大型企业级的系统吗?在开始主要的代码开发之前,我们必须选择一种合适的体系架构,它将为我们提供所需的功能和质量属性。因此,在将它们应用到我们的设计之前,应该先了解不同的体系结构。什么是架构模式根据维基百科,架构模式是在给定上下文中解决软件架构中常见问题的通用、可重用的解决方案。架构模式类似于软件设计模式,但范围更广。在本文中,我会简单介绍下列10种常见的架构模式,及其用途、优势和劣势。分层模式该模式可用于构建可分解为子任务组的程序,其中每个都处于特定的抽象级别。每一次都向更高层原创 2020-10-27 16:07:57 · 118 阅读 · 0 评论 -
Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储
本文详细介绍了如何在 Kubernetes 集群中部署 ceph-csi(v3.1.0),并使用 RBD 作为持久化存储。需要的环境参考下图:本文使用的环境版本信息:Kubernetes 版本:$ kubectl get nodeNAME STATUS ROLES AGE VERSIONsealos01 Ready master 23d v1.18.8sealos02 Ready master 23d v1.18.8sealos原创 2020-10-21 16:54:03 · 972 阅读 · 0 评论 -
10 个冷门但又非常实用的 Docker 使用技巧
在平时的工作中,docker 接触得很多,除了经常使用的 docker run ,docker stop 等命令,docker 还有很多十分有用但是却不经常使用的命令,下面就来总结一下:1. docker top这个命令是用来查看一个容器里面的进程信息的,比如你想查看一个 nginx 容器里面有几个 nginx 进程的时候,就可以这么做:docker top 3b307a09d20dUID PID PPID C STIME TTY TIME CMDr原创 2020-10-21 14:52:19 · 223 阅读 · 0 评论 -
JVM:我就想知道我是怎么没的
我们都知道 Java 程序都是跑在 JVM 上的,一旦 JVM 有什么风吹草动,必然会影响服务的稳定性。幸运的话,服务会发生抖动,可能有部分请求出现延迟或异常。不幸的话,JVM 直接崩溃,导致服务完全中断。这可不是什么好事,与 JVM 一起崩溃的,除了服务,还有我们的心态。所谓的 JVM 崩溃,一般情况下就是指内存溢出,也就是 OutOfMemoryError 和 StackOverflowError。另外还有一种情况就是堆外内存占用过大,这种情况会导致 JVM 所在机器的内存被撑爆,从而导致机器重启等原创 2020-10-20 15:17:30 · 276 阅读 · 0 评论 -
Netty 应该这样使用,最佳实践
最近很多同学给我发邮件或者微博私信我,咨询推送服务相关的问题。问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类:Netty 是否可以做推送服务器?如果使用 Netty 开发推送服务,一个服务器最多可以支撑多少个客户端?使用 Netty 开发推送服务遇到的各种技术问题。由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路。1.2. 推送服务移动互联网时代,推送 (Push) 服务成为 App原创 2020-10-17 15:15:02 · 192 阅读 · 0 评论 -
神奇的 SQL,Group By 真扎心,原来是这样!
GROUP BY 后 SELECT 列的限制标准 SQL 规定,在对表进行聚合查询的时候,只能在 SELECT 子句中写下面 3 种内容:通过 GROUP BY 子句指定的聚合键、聚合函数(SUM 、AVG 等)、常量。我们来看个例子:我们有 学生班级表(tbl_student_class) 以及 数据如下 :DROP TABLE IF EXISTS tbl_student_class;CREATE TABLE tbl_student_class ( id int(8) unsigned NOT原创 2020-10-16 16:32:12 · 77 阅读 · 0 评论 -
手写mybatis框架-增加缓存&事务功能
增加代码详解缓存 com.simple.ibatis.cache缓存接口-Cachepublic interface Cache { /**放入缓存*/ void putCache(String key,Object val); /**获取缓存*/ Object getCache(String key); /**清空缓存*/ void cleanCache(); /**获取缓存健数量*/ int getSize(); /原创 2020-10-15 16:17:43 · 106 阅读 · 0 评论 -
基于 Nginx+lua+Memcache 实现灰度发布
一、灰度发布原理说明灰度发布在百度百科中解释:灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面 来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。这里的用于WEB系统新代码的测试发布,让一部分(IP)用户访问新版本,一部分用户仍然访问正常版本,其原理如图:执行过程:当用户请求到达前端代理服务Nginx原创 2020-10-09 19:18:02 · 122 阅读 · 0 评论