- 博客(185)
- 资源 (21)
- 问答 (6)
- 收藏
- 关注
原创 凭证卷发放流程优化方案
::successList: 也是能够实现这样的效果的,但是需要防止出现重复元素,因为劵码是不会重复的Set: 不仅能够去重,而且也能随机弹出集合内的元素(时间复杂度O(1))
2024-01-27 23:45:00 510
原创 20220620 面试复盘
字符串类型的内部编码有三种类型: 1、int:存储8个字节的长整型(long,2^63-1),如果value是long类型的整数,用此编码格式 2、emstr:代表emstr格式的SDS,存储小于44字节的字符串(Redis 3.2版本之前是39字节),只分配一次内存空间(因为Object 和SDS是连续的)底层实现是通过一个简单的动态字符串(SDS)实现的。 3、raw:存储大于44个字节的字符串(Redis 3.2版本之前是39字节),需要分配两次内存空间(分别是Redis Object 和 SD
2022-06-22 15:54:58 214
原创 Spring三级缓存解决循环依赖
我们都知道Spring中的BeanFactory是一个IOC容器,负责创建Bean和缓存一些单例的Bean对象,以供项目运行过程中使用。创建Bean的大概的过程:首先,容器为了缓存这些单例的Bean需要一个数据结构来存储,比如Map {k:name; v:bean}。...
2022-06-05 13:35:19 267
原创 ApplicationContextInitializer的理解和使用
ApplicationContextInitializer的理解和使用一、ApplicationContextInitializer 介绍1.1 作用ApplicationContextInitializer 接口用于在 Spring 容器刷新之前执行的一个回调函数,通常用于向 SpringBoot 容器中注入属性。1.2 内置实现类DelegatingApplicationContextInitializer使用环境属性 context.initializer.classes 指定的初始化器(
2022-05-05 19:47:51 1523 1
转载 Timsort排序 算法
Timsort排序 算法引子我们日常使用Java的时候,经常会对数组使用一个操作叫**排序。**写到这里作者表示好奇,Java针对数组的底层实现是什么呢?我们来看一看吧。int[] a;Object[] b;Arrays.sort(a);Arrays.sort(b);这里面我们看源码会发现,其实他们底层是用了两种不同的算法:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0uYlBdf-1649900789132)(F:%5CmarkdownImg%5Cv2
2022-04-14 09:48:06 910
转载 双轴快速排序(Dual Pivot Quicksort)
双轴快速排序(Dual Pivot Quicksort)引子在Timsort的分析前,我提到了在使用Arrays.sort()时针对int[]会使用DualPivotQuicksort类进行排序。实际上针对非对象类型,都会使用这个方法。JDK1.7开始使用双轴快速排序进行排序。双轴快速排序的特点主要有:比传统快排更快。分治思想。“divide and conquer”使用两个轴pivot而不是一个。下文会具体介绍。另外值得一提的是,JDK 1.8中DualPivotQuicksort并没
2022-04-14 09:46:14 1473
转载 同程艺龙ES+Redis+MySQL,高可用架构设计
同程艺龙ES+Redis+MySQL,高可用架构设计背景会员系统是一种基础系统,跟公司所有业务线的下单主流程密切相关。如果会员系统出故障,会导致用户无法下单,影响范围是全公司所有业务线。所以,会员系统必须保证高性能、高可用,提供稳定、高效的基础服务。随着同程和艺龙两家公司的合并,越来越多的系统需要打通同程APP、艺龙APP、同程微信小程序、艺龙微信小程序等多平台会员体系。例如微信小程序的交叉营销,用户买了一张火车票,此时想给他发酒店红包,这就需要查询该用户的统一会员关系。因为火车票用的是同程会员体系,酒店
2022-04-09 22:53:27 254
原创 MyBatis中的#{}和${}的区别
MyBatis中的#{}和${}的区别#{}是预编译处理,${}是字符串替换。详情:(1)mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。(2)mybatis在处理时,就是把{}时,就是把时,就是把{}替换成变量的值。(3)使用#{}可以有效的防止SQL注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从而避免了潜在的安全风险。(4)预编译是
2022-04-08 18:11:29 2267
转载 100%弄明白5种IO模型
100%弄明白5种IO模型从TCP发送数据的流程说起要深入的理解各种IO模型,那么必须先了解下产生各种IO的原因是什么,要知道这其中的本质问题那么我们就必须要知一条消息是如何从过一个人发送到另外一个人的;以两个应用程序通讯为例,我们来了解一下当“A”向"B" 发送一条消息,简单来说会经过如下流程:第一步:应用A把消息发送到 TCP发送缓冲区。第二步: TCP发送缓冲区再把消息发送出去,经过网络传递后,消息会发送到B服务器的TCP接收缓冲区。第三步: B再从TCP接收缓冲区去读取属于自己的数据。
2022-04-01 22:49:04 95
原创 Golang-gRPC入门
gRPC入门gRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架。gRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多个服务,对于移动设备更加友好。本节将讲述gRPC的简单用法。1 gRPC技术栈Go语言的gRPC技术栈图所示:最底层为TCP或Unix Socket协议,在此之上是HTTP/2协议的实现,然后在HTTP/2协议之上又构建了针对Go语言的gRPC核心库。应用程序通过gRPC插件生产的Stub代码和gRPC核心库通信,也可以直接和gRPC核心库通信
2022-03-30 19:45:42 1531
原创 GRPC使用(java)
GRPC使用快速开始1.依赖 :pom文件<?xml version="1.0" encoding="UTF-8"?><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:/
2022-03-29 16:40:54 2201 1
转载 proto3的使用
proto3 使用定义一个消息类型先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了:syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3;}文件的第一行指定了
2022-03-29 16:29:18 2091
转载 Redis与MySQL双写如何保证一致性
Redis与MySQL双写如何保证一致性谈谈一致性一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间
2022-03-27 22:03:42 301
原创 UML 类图的介绍
UML 类图的用法面向对象设计对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做。伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现。如果要自己设计,无论是给自己看,还是给别人看,势必要输出一些文档,清晰地整理出思路。关于文档,有些人会用文字,但是再多的文字在绝大多数人看来,都不会有一张图来得直白,本文就讲一讲使用UML图来进行面向对象的设计。面向对象设计主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是
2022-03-26 15:51:03 1250
原创 Future模式
Future模式Java多线程编程中,常用的多线程设计模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不变模式和生产者-消费者模式等。这篇文章主要讲述Future模式.1. Future模式核心思想Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑(根据《Java程序性能优化》)。Future模式有点类似于商品订单。在网上购物时,提交订单后,在收货的这段时间里无需一直在家里等候,可以先干别的
2022-03-25 12:21:44 122
转载 消息队列把消息弄丢了怎么办
消息队列把消息弄丢了怎么办消息队列会丢失消息吗?答案是肯定的,所以对于业务严谨的数据,我们要确保其在消息队列中的安全,不能丢。要想解决不丢的问题,首先要弄清楚 消息是怎么丢的呢?丢消息的关键点有3个:Producer 发送消息的过程消息队列的消息存储Consumer 消费消息的过程下面挨个看看都是怎么丢的,以及解决方案。会以 RabbitMQ 和 Kafka 这两个常用的消息系统来说明。1. Producer 弄丢消息Producer 向 MQ 发消息,很简单,发过去就完事儿了。
2022-03-13 09:12:18 1595
原创 Spring boot starter的制作
Spring boot starter的制作1、新建SpringBoot工程pom.xml内容如下<!-- spring-boot遵循“约定优于配置”这一原则,而spring-boot-autoconfigure模块正是完美的实现这个原则 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-auto
2022-03-12 22:07:16 479
原创 将springboot打包成docker镜像
将springboot打包成docker镜像1、在pom.xml中添加插件<properties> <docker.image.prefix>swr.cn-north-4.myhuaweicloud.com/xliangliango</docker.image.prefix></properties><plugin> <groupId>com.spotify</groupId> <arti
2022-03-12 17:11:57 1612
原创 解决VsCode中写golang项目代码提示慢问题
解决VsCode中写golang项目代码提示慢问题问题描述VsCode的自动代码提示,发现太慢了,隔3,4秒才会出提示,所以换为Google推荐的 gopls来代替。替换过程1、拉取goplsgo get golang.org/x/tools/gopls@latest2、配置VSCode中的settings.json文件"settings": { "go.useLanguageServer": false, "[go]": { "editor.snippetS
2022-03-08 22:24:48 2504
转载 GORM Model定义
GORM Model定义在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。 同时也支持sql.Scanner及driver.Valuer接口(interfaces)。gorm.Model为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体
2022-03-08 15:00:38 592
原创 HTTP请求状态码的含义
HTTP请求状态码的含义宏观上1** ----临时响应2** ----成功响应3** ----重定向4** ----请求错误5** ----服务器错误微观上1**100 Continue 继续。客户端应继续其请求101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议2**200 OK 请求成功。一般用于GET与POST请求201 Created 已创建。成功请求并创建了新的资源2
2022-03-07 22:20:16 55
原创 Golang标准库中的Time
Golang标准库中的Time时间和日期是我们编程中经常会用到的,本文主要介绍了Go语言内置的time包的基本用法。1. time包time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。2. 时间类型time.Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。示例代码如下:func timeDemo() { now := time.Now() //获取当前时间 fmt.Printf("current t
2022-03-06 22:40:18 708
原创 Golang标准库中的 Flag
Golang标准库中的 FlagGo语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。1. os.Args如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数。package mainimport ( "fmt" "os")//os.Args demofunc main() { //os.Args是一个[]string if len(os.Args) > 0 {
2022-03-06 22:39:21 255
原创 Golang标准库中的fmt
Golang标准库中的fmtfmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分。1. 向外输出标准库fmt提供了以下几种输出相关函数。PrintPrint系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。func Print(a ...interface{}) (n int, err error)func Printf(for
2022-03-06 22:38:46 1936
原创 Golang 标准库context.Context
Golang 标准库context.Context在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的
2022-03-06 18:47:11 605
转载 Go语言标准库log介绍
Go语言标准库log介绍无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯。logGo语言内置的log包实现了简单的日志服务。本文介绍了标准库log的基本使用。使用Loggerlog包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Pa
2022-03-06 14:58:01 434
转载 Go语言标准库之httptemplate
Go语言标准库之http/templatehtml/template包实现了数据驱动的模板,用于生成可防止代码注入的安全的HTML内容。它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用html/template这个包。模板与渲染在一些前后端不分离的Web架构中,我们通常需要在后端将一些数据渲染到HTML文档中,从而实现动态的网页(网页的布局和样式大致一样,但展示的内容并不一样)效果。我们这里说的模板可以理解为事先定义好的HTML文档文件,模板渲染的作用机制可以简
2022-03-06 13:22:52 242
转载 Spring Aop
Spring Aop1、什么是AOPAOP:Aspect Oriented Programming,中文翻译为”面向切面编程“。面向切面编程是一种编程范式,它作为OOP面向对象编程的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、权限控制、缓存控制、日志打印等等。AOP采取横向抽取机制,取代了传统纵向继承体系的重复性代码AOP把软件的功能模块分为两个部分:核心关注点和横切关注点。业务处理的主要功能为核心关注点,而非核心、需要拓展的功能为横切关注点。AOP的作用在于分离系统中的各种关注
2022-03-05 15:39:44 65
转载 Apach Calcite
Apach CalciteCalcite 是什么?• Apache Calcite 是一个动态数据的管理框架,可以用来构建数据库系统的语法解析模块• 不包含数据存储、数据处理等功能• 可以通过编写 Adaptor 来扩展功能,以支持不同的数据处理平台• Flink SQL 使用并对其扩展以支持 SQL 语句的解析和验证Calcite 架构关于 Calcite 的架构,可以参考下图(图片来自前面那篇论文),它与传统数据库管理系统有一些相似之处,相比而言,它将数据存储、数据处理算法和元数据存储这些
2022-03-04 13:42:28 124
原创 下载源码报错:Sources not found for org.javassistjavassist3.22.0-CR
下载源码报错:Sources not found for: org.javassist:javassist:3.22.0-CR场景在idea中下载源码得到时候出现:Cannot download sources解决方案执行mvn dependency:resolve -Dclassifier=sources
2022-03-04 10:47:49 180
原创 HikariCP中的ConcurrentBag与FastList
HikariCP中的ConcurrentBag与FastList一、IConcurrentBagEntryIConcurrentBagEntry是ConcurrentBag容器里存放的元素。它有四个状态:STATE_NOT_IN_USE:未使用。可以被借走STATE_IN_USE:正在使用。STATE_REMOVED:被移除,只有调用remove方法时会CAS改变为这个状态,修改成功后会从容器中被移除。STATE_RESERVED:被保留,不能被使用。往往是移除前执行保留操作。public
2022-03-03 20:58:26 399
转载 RPC和RMI
RPC和RMIRPC 全称为 Remote Proceduer Call,即远程过程调用。借助 RPC 可以做到像本地调用一样去调用远程服务,是进程间的通信方式。比如:两台服务器 A 和 B,A 服务器上部署一个应用,B 服务器上部署一个应用,A 服务器上的应用想调用 B 服务器上的应用提供的方法,但是两个应用不在同一个内存空间,互相就不能直接调用。这个时候需要通过网络来表达调用的语义和传达调用的数据。需要注意的是 RPC 并不是一个具体的技术,而是指整个网络远程调用过程。在分布式框架中,一个最基础的
2022-03-03 17:53:45 237
原创 CentOS团队从官方镜像中移除CentOS 8的所有包,导致yum报错:Cannot prepare internal mirrorlist No URLs in mirrorlist
CentOS团队从官方镜像中移除CentOS 8的所有包,导致yum报错:Cannot prepare internal mirrorlist: No URLs in mirrorlist问题在CentOS 8中,使用yum时出现错误,镜像列表中没有url,类似如下:# 输入命令yum list | grep telnet# error 内容如下Error: Failed to download metadata for repo 'appstream': Cannot prepare inte
2022-02-22 16:44:55 2452
转载 Go语言通道(chan)——goroutine之间通信的管道
Go语言通道(chan)——goroutine之间通信的管道< goroutine和coroutine的区别示例:并发打印 >如果说 goroutine 是 Go语言程序的并发体的话,那么 channels 就是它们之间的通信机制。一个 channels 是一个通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类型,也就是 channels 可发送数据的类型。一个可以发送 int 类型数据的 channel 一般写
2022-02-08 16:04:28 200
rabbitmq-server-3.8.14-1.el7.noarch.rpm
2021-03-19
开源框架Quartz有哪些缺陷和不足?
2022-07-11
在spring源m上建一个demo报错,不知道如何解决?
2022-04-08
用gradle构建的springboot项目,关闭服务的时候,报错
2022-03-30
枚举类中调用初始化属性的时候出错
2021-11-30
为什么getSystemCpuLoad()返回负值
2021-11-21
TA创建的收藏夹 TA关注的收藏夹
TA关注的人