自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 问答 (1)
  • 收藏
  • 关注

原创 秒杀场景设计

如果用户长时间未支付,则需要取消订单,这里可以使用rocket mq的延迟队列,生成订单后状态为待支付,这时候向延迟队列发送消息,经过订单最大延迟时间后消费延迟消息,拿到消息查询订单状态如果订单状态为待支付则取消订单,若状态为已支付就修改订单状态为已支付。消息发送前先使用消息发送记录表记录一下并且赋予状态为待处理,当下游服务消费完消息后调用消息回调接口更新消息发送记录表中的信息状态为已完成,启用job机制定期检查发送表中的消息状态,如果是未完成的状态且超过一段时间则重新发送,然后删掉状态为已完成的消息。

2023-09-21 13:05:39 147

原创 protobuf为什么这么快

协议数据格式十分紧凑,采用 tag|leg|value 来定界一个字段,且以这种方式紧密排列,使用varint这种数据结构根据实际字节占用情况灵活分配内存进一步减小传输开销。使用zigzag算法来对负数进行进一步的压缩,最终我们可以使用2个字节来表示-1。用protobuf序列化后的大小是json的10分之一,是xml格式的20分之一,但是性能却是它们的5~100倍。

2023-09-20 10:49:12 536

原创 nats server端启动订阅推送源码剖析

简单对nats的发布订阅和启动机制做一个源码级别的梳理

2022-07-25 20:39:55 822

原创 golang调优日记

2021/1/6服务在空载环境下要求 cpu均值基线为0.25,但实际却达到了0.28所以需要优化。准备步骤1.在代码中嵌入pprof服务端并将服务重新发布到服务器import _"net/http/pprof"func main(){ go func(){ err:=http.ListenAndServe("localhost:6060",nil) if err!=nil{ lager.Logger.Infof("pprof error") } }() /*

2021-01-06 20:26:57 151

原创 政治演讲ppt

题目:对瓦伊昂大坝事故的探讨与分析http://wap.sciencenet.cn/blog-2966991-1073480.html?mobile=1瓦伊昂大坝事故:意大利摆脱了战争的阴霾后,开始进入一个高速发展的时期。与此同时,北部城市的工业发展对电力的需求与日俱增。瓦依昂峡谷得天独厚的地理条件使其成为了兴建水力发电站的不二之选。在亚德里亚电力协会(SADE)的游说下,国会35位部长中的13位开会决定,要在意大利北部修建一座当时世界上最高的拱坝*。不过这个表决其实是无效的,因为法律规定讨论这类

2020-12-17 11:45:22 521 1

原创 xftp SFTP子系统申请已拒绝 请确保SSH链接的SFTP子系统设置有效

将#override default of no subsystems#Subsystem sftp /usr/libexec/openssh/sftp-server替换成#override default of no subsystemsSubsystem sftp /usr/libexec/openssh/sftp-server2. 重新加载一下文件 /etc/ssh/sshd_config reload3.重启服务 service sshd resta...

2020-08-10 21:57:47 1026

原创 golang对slice的一些优化的操作

对slice高效的过滤利用slice的特性,我们在过滤并删除slice的数据不必要在重新make一个新的slice因为这样会重新创建数组浪费空间。所以最好借用原来的slice在原来的slice基础上创建slice,这样在删除时底层不会重新创建数组。func Filter(s []byte, fn func(x byte) bool) []byte { b:=s[:0] //我们利用传过来的slice重新创建一个slice,底层不会重新创建数组 for _, x := range s { if !

2020-07-13 16:50:21 804

原创 mysql利用join优化子查询

有表user(id,name)和code(id,student_code)如果要查询code在user中的对应的全部内容(没有就为null)方式1(子查询):select a.id , a,name , (select b.student_code from code c where c.id=u.id) from user u方式2(left join查询)select u.id , u.name , c.student_codefrom user u left join code co

2020-05-20 17:09:56 302

原创 mysql使用join更新表

有表user(id,name)和code(id,student_code),如果要更新user中某一条记录,且更新条件需要依赖其他查询的查询结果(比如code的查询结果)。例如我们要更新student_code=1010的同学在user的name则可以写update user u join(select id from code c inner join user u on c.id=u.id) r on r.id=u.id set u.name='小明'...

2020-05-20 16:53:08 397

原创 go之临时对象池Pool

简介临时对象池在go中对应sync.Pool类型,我们可以把sync.Pool当作存放临时值的容器,此容器是自动伸缩的、高效、线程安全的。从临时对象池获取对象有两个途径,第一个是Get向池中Put对象,另一个是通过对Pool的公开字段New赋值一个类型为func() interface{}的方法,通过调用该方法获取到的值,该方法是默认调用的,当Pool中没有Put任何对象时,如果你设置了New字段,那么Get到的值就是调用New获取到的值。注意如果你Get到的对象是Put到Pool中的那么Get完之后就

2020-05-18 14:11:14 412

原创 go-原子操作

atomic包atmoic包可以对int32、int64、uint32、uint64、uintptr、unsafe.Pointer提供五种原子性操作分别是增或减、比较并交换、载入、存储和交换。原子增或减简介atomic包中有类似AddInt32等这样的方法,它需要两个参数,第一个是需要修改的int32类型的变量地址,第二个是add到该变量上且与改变量类型相同的值。例子我们的例子是用10个线程每个线程都将变量value(初始值为0)增加1000次,那么最终结果是10000。不用原子操作的话我们可以

2020-05-18 13:22:46 646

原创 go 信号量之cond

cond有三个方法,分别是waite、Signal、Broadcast,wait方法会阻塞该方法所在的线程,Signal会唤醒最先因wait方法而阻塞的线程,Broadcast则会唤醒所有因wait方法阻塞的线程。定义一个condvar mutex=&sync.Mutex{}var cond=sync.NewCond(mutex)cond中有一个成员变量L,它就是你传入的mutex,上面两行代码即可把cond和你要用的锁关联起来,在使用你创建的锁只需要cond.L即可获取到。举一个生产和消

2020-05-17 15:58:12 505

原创 golang-锁的介绍和使用

互斥锁应用场景当多个groutine操作同一个线程不安全的公共资源时,为了安全我们使用互斥锁使得在某一时刻只有一个groutine操作该公共资源,即当有groutine在操作该共享变量(把共享变量加载到工作区,然后修改后再写入内存)时,其他线程在操作该共享变量时就会被block。应用案例我们对一个变量value=0进行1001000次+1的操作,我们知道正确答案应该是value=1001000=100000当不使用互斥锁时var wg *sync.WaitGroup=new(sync.WaitG

2020-05-16 11:22:34 683

原创 go之定时器

创建定时器func main(){ //前两句也可以用expirationTime:=time.After(time.Second*2)来代替 timer:=time.NewTimer(time.Second*2)//定时2秒 expirationTime:=<-timer.C//执行到此处会阻塞2秒 if timer.stop==false{//当定时器过时,就会返回false fmt.Println("stoped! ") }}使用sel

2020-05-11 18:23:07 153

原创 channel小知识点

1.传入channel的值是原来值的备份,从channel中取出来的值也是通道中值的备份。2.如果想通过channel传送同一个值,那么可以传递这个值的指针3.关闭channel要从发送端关闭,如果从接收端关闭会引发恐慌。4.发送端关闭通道并不会影响接收端接收5.带缓冲区和不带缓冲区的channel区别就是长度是否为0,不带缓冲区的channel长度就是06.操作未被初始化的通道会被永久阻塞var demo chan int//for会被永久阻塞for i:=range demo{}7.

2020-05-10 19:02:37 36163

原创 beego:unexpected end of JSON input

后台接收前台传过来的json,使用struct去接收报unexpected end of JSON input,我仔细对过struct每个字段中的属性和json配置都没错,我还试着把数据解析到map中还是同样的问题。最后百度后才知道要在app.conf中加入copyrequestbody = true才行。...

2020-04-30 15:13:46 2023

原创 grpc使用讲解

前言第一次接触grpc,本文只讲解代码逻辑部分,至于安装grpc什么的百度一堆自己查。在使用grpc之前需要了解下protobuf语法,自己先百度查一下然后再来看。案例逻辑逻辑很简单,写一个客户端和服务端,客户端请求服务端后,服务端从数据库中拿数据返回给客户端。案例代码先贴下目录结构proto文件syntax="proto3";option go_package="grpc_t...

2020-03-31 17:12:53 1000 2

原创 go方法传参时指针类型和非指针类型的区别

如果函数接收的是非指针类型的参数,那么函数接收的一定是传入数据的拷贝(任何类型都是如此)。如果接收的是指针类型的参数,则传入的是原类型的地址,传入后在函数内部修改可以修改到原类型数据。例如type student struct{ age int name string}func main() { stu:=student{ name:"小明", ...

2020-03-08 20:15:37 1303

原创 go指针接收器和非指针接收器

1.二者的书写方式不同type student struct { age int8 name string}//指针接收器func(s *student) ageAdd1(){ s.age+=1}//非指针接收器func(s student) ageAdd2(){ s.age+=1}2.二者传入方法中的对象不同指针接收器传入的是struct本身,非指针接...

2020-03-06 12:25:48 1869

原创 安全发布对象-发布与溢出

#不安全发布对象##发布对象使一个对象能够被当前范围外的代码所使用package com.mmall.concurrency.example.publish;import lombok.extern.slf4j.Slf4j;import javax.annotation.concurrent.NotThreadSafe;import java.util.Arrays;@Slf4...

2020-03-05 17:39:11 154

原创 golang channel带缓冲区和不带缓冲区的区别

1.声明方式不同带缓冲区: ch:=make(chan int,num) (num指的是你缓冲区的大小)不带缓冲区: ch:=make(chan int)2.运行方式不同不带缓冲区func main() { ch:=make(chan int) go func(){ time.Sleep(time.Second*3) <-ch }()...

2020-03-03 13:32:13 4328

原创 线程安全性-有序性

有序性-happens-before原则程序次序规则一个线程内,按照代码顺序书写在前面的操作先行发生于书写在后面的操作。锁定规则一个unLock操作先行发生于后面对同一个锁的lock操作。volatile变量规则对一个变量的写操作先行发生于后面对这个变量的读操作。传递规则如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C线程启动规则Thre...

2020-02-21 18:00:42 141

原创 线程安全性-可见性

导致共享变量在线程间不可见的原因线程交叉执行;重排序结合线程交叉执行;共享变量更新后的值没有在工作内存与主存间及时更新JMM关于synchronized的两条规定线程解锁前,必须把共享变量的最新值刷新到主内存;线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主存中重新读取最新的值(注意加锁和解锁是同一把锁)可见性-volatile通过加入 内存屏障和禁止重排序优化来实现...

2020-02-21 17:38:04 132

原创 原子性-锁

原子性-synchronized# 1.修饰代码块:大括号括起来的代码,作用于调用的对象修饰方法:整个方法,作用于调用的对象2.修饰静态方法整个静态方法,作用于所有对象3.修饰类括号括起来的部分作用于所有对象4.如果父类的方法或者代码块被synchronized修饰子类继承父类后synchronized的特性是不会被继承的。原子性-对比1.synchronized不可中断锁,...

2020-02-21 16:39:46 229

原创 线程安全性

定义当多个线程访问某个类时,不管运行时环境采用 何种调度方式 或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称为这个类是线程安全的。线程安全性原子性提供了互斥访问,同一时刻只能有一个线程来对它进行操作可见性一个线程对主内存的修改可以及时的被其他线程观察到有序性一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观...

2020-02-21 14:34:56 110

原创 http请求之content-type

今天我在用go发送json数据时,客户端收不到,发送代码如下func HttpSender(url string,data io.Reader,method string){ transport:=http.Transport{ DisableKeepAlives:true, } client:=http.Client{ Transport:&t...

2020-01-08 17:07:42 168

原创 springboot+mybatis+mysql在idea中搭建

#创建项目 搭建项目大家按着我的结构创建目录pom.xml配置<?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" ...

2019-12-04 15:32:37 426

原创 centos6安装mysql

centos6安装mysql前言安装mysql1.检测系统是否已经安装过mysql或其依赖,若已装过要先将其删除,否则第4步使用yum安装时会报错:2.从mysql的官网下载mysql57-community-release-el6-5.noarch.rpm(注意这里的el6-5即适配RHEL6.5的版本,如果下载了其它版本后面的安装过程中可能会报错)3.安装第一步下载的rpm文件4.使用yum安...

2019-10-23 17:02:30 417

原创 centos7安装docker

1.安装docker仓库,以后我们可以通过仓库来更新和安装docker从这个仓库中 $ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/c...

2019-09-23 15:38:21 90

原创 深度优先遍历

深度优先遍历1.深度优先遍历的思路第一步:从开始节点查找可达节点,如果有没到过的可达节点则第二部,否则第三步第二部:便利到下一个可达节点,记录下该节点已经到达节点第三步:回到上一步的节点再从第一步开始代码实现一个节点对应他的可达节点用map表示,map的key和value分别是Integer和list(用来存放key对应的节点)遍历过的节点同样用map表示,key为到过的节点,va...

2019-07-24 11:40:42 289

原创 datax之自定义sql

例如写入方表B有字段(b,c) ,读入方表A有字段(a),需求是将表A的a字段按照某一规则拆分成两部分,两部分分别存入B的b和c字段,那么单纯的字段之间的映射就不再适用,我们就需要借助querySql这个属性来解决这个问题。querySql里面可以自定义sql语句,你查询出来的字段你可以定义别名,别名的类型和写入方的字段名称和类型一致,就能做到自定义映射。...

2019-07-05 16:40:15 5778

原创 mysql之时间截取函数DATE_FORMAT

我有个datatime类型的数据,格式为yyyy-mm-dd hh-mm-ss ,现在我需要把这个数据分成两部分分别为 yyyy-mm-dd 和 hh-mm-ss,那么我就需要借助函数date_format()来实现。...

2019-07-05 10:24:30 6392

原创 MySQL DATEDIFF函数

作用:DATEDIFF函数计算两个DATE,DATETIME或TIMESTAMP值之间的天数。语法如下:DATEDIFF(date_expression_1,date_expression_2)得出来的结果是 date_expression_1 - date_expression_2的天数差注意:1.是前面天数减去后面天数2.DATEDIFF函数接受两个任何有效日期或日期时间值的参数。...

2019-05-26 13:48:07 1750

原创 LeetCode之部门工资前三高的员工

有表departmentEmployee编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:±-----------±---------±-------+| Department | Employee | Salary |±-----------±---------±-------+| IT | Max | 9...

2019-05-22 11:30:22 290

原创 leetCode之 连续出现的数字 sql语句

1.题目有表Logs,要求编写一个 SQL 查询,查找所有至少连续出现三次的数字2.我的答案select DISTINCT Num as ConsecutiveNumsfrom(select num ,casewhen @agent = num then @count := @count + 1when (@agent := num) is not null then @cou...

2019-05-21 21:14:47 243

原创 sql之case用法

1.case expressionwhen value1 then returnvalue1when value2 then returnvalue2when value3 then returnvalue3else defaultvalueend例如:有表:执行:select name , (case NAMEwhen ‘世龙’ then ‘好孩子’else ‘坏孩...

2019-05-21 19:37:15 198

原创 sql之having用法

having经常和group by 联用,并且having需要和聚合函数应用。例如查询num出现至少三次的numselect distinct Num as ConsecutiveNums from LogsGROUP BY NumHAVING count(Num)>=3...

2019-05-09 22:30:00 10968

原创 mysql四大排名函数(row_number、rank、dense_rank、ntile)使用简介

有如下表1.row_numberrow_number在排名时序号 连续 不重复,即使遇到表中的两个3时亦如此执行select row_number() OVER(order by e.salary desc) as row_num , e.salaryfrom employee e结果如图注意:在使用row_number实现分页时需要特别注意一点,over子句中的order by...

2019-05-09 12:30:32 22716 14

原创 sql之查询子临时表在使用时要加别名

select(if((select count(e.Salary) from (select distinct e.Salary from Employee e) e)>=N, ( select min(e.Salary) from (select distinct e.Salary from Employee e order by...

2019-05-09 11:10:54 2210

原创 sql之if用法

1.if(exp1,exp2,exp3)exp1是一个boolean表达式,exp1是true执行exp2,否则执行exp32.ifnull(exp1,exp2)从exp1开始检测,如果遇到不是null的就直接返回该值

2019-05-09 11:03:33 711

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除