自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(120)
  • 资源 (3)
  • 收藏
  • 关注

原创 Option类型:C++(std::optional)、Rust(Option)、Go(gob.OptionalValue)

学习Rust中的Option类型以及C++ 17的std::optional

2023-03-10 00:05:10 468 1

原创 Rust入门基础:attribute

Rust 的attribute功能及如何自定义attribute

2023-02-28 23:16:10 463

原创 自定义协议:如何实现keepalive

网络通讯中如何实现keepalive,以及自定义协议实现链接keepalive,做好rpc的基础

2023-02-28 00:08:02 376

原创 MySQL 执行慢原因分析

SQL执行慢的原因分析是一个开放性的问题,在实践过程中,我们可以根据多变的情况进行逐步分析。情况分析在生产环境中,相同数据量情况下,有SQL偶尔执行慢即出现频率低,也有SQL每次执行都慢即出现频率高。出现频率低情景1、InnoDB脏页刷新Innodb为了优化写效率,采用了内存缓冲及redo log(写磁盘)的方式,当内存页与磁盘页数据不一致时(脏页),mysql会进行刷盘(定时批量)。或者mysql dump之后,从redo log恢复最新数据。redo log是有容量的,如果数据库操作频繁,

2023-02-27 23:54:31 1610

原创 区块链开发之Solidity编程基础(六)运算符

运算符是一种特殊的符号,用来表示数据的运算、赋值和比较等,其实运算符是相对标准的,用法也基本跟其他语言无二义

2022-06-12 22:51:14 4348

原创 高频情况下的暗池撮合问题

场景问题当A账户进行委托时,暗池此时没有可匹配单,那么对外交易所报单。B账户进行委托时,发现暗池有匹配的A单可进行暗池撮合。如果B单直接进行A单撮合的话,若A单可能在交易所已经成交,那么会出现仓位轧差的情况。在左边状态到右边状态会存在一个轧差,即在系统层面始终存在+1的持仓未被平掉,这个风险是不可接收的。解决方案一、B单在暗池的委托单里确认可匹配的A单时,对A单进行撤单,且需要等待A单状态变更为撤单成功后,对其进行配对撮合。这种方式任何存在问题:每次都得对A单进行撤单之后才能处理,处理流程

2022-05-06 22:57:02 373

原创 MySQL“写缓冲“优化策略

概要前文讲过MySQL的缓冲池buffer-pool,我们知道缓冲池是用于加速数据访问速度的。那么当发生写操作时,也需要更新缓冲池中缓存的数据,这也是在任何缓存架构体系下需要实现的机制。 简单的更新缓存套路:1、持久化数据2、让缓存失效以上操作没有考虑缓存(Cache)和持久层(Repository)的整体事务的问题。如果你需要强一致性,你需要使用“两阶段提交协议”——prepare, commit/rollback,比如Java 7 的XAResource,还有MySQL 5.7的 XA

2022-03-30 23:29:15 933

原创 MySQL缓冲池buffer pool

概要在应用系统分层结构中,我们经常会使用缓存(cache)来加速数据的访问。同理的,MySQL作为一个存储系统,同样采用了缓存方式,而在MySQL中叫做缓冲池(buffer pool)机制,用来避免每次查询数据时进行磁盘IO。 InnoDB的缓冲池缓存什么数据?缓存用于缓存数据加速访问,那么InnoDB主要缓存的是表数据与索引数据,既然缓存数据可以加速访问,那为何不缓存所有的数据呢?1、数据库的出现就是为了解决数据存储问题,那么其存储的数据可想而知的大。比如磁盘可能有2T数据,但可能可使用的内

2022-03-23 10:35:56 1465

原创 区块链开发之Solidity编程基础(五)合约继承、抽象合约、接口

继承原理单继承多重继承同名修饰器或函数、事件菱形继承问题多重继承的函数调用抽象合约接口本文主要讲解下Solidity的继承系统,主要内容为单继承以及多重继承。如果有其他编程经验的话,便知道继承的主要目的在于优化重复代码,是面向对象编程思想的体现。原理solidity通过复制包括多态的代码来支持多重继承,即当一个合约从多个合约继承时,在区块链上只有一个合约被创建,所有基类合约的代码被复制到创建的合约中。所有的函数调用都是虚拟的,这意味着最远的派生函数会被调用,除非明确给出合约名称。派生的合约需要提供所

2022-03-20 20:17:49 3460

原创 区块链开发之Solidity编程基础(四)合约事件

事件事件智能合约返回值给用户接口异步的带数据的触发器一种比较便宜的存储事件里的Indexed参数事件事件是以太坊虚拟机(EVM)日志基础设施提供的一个便利接口。用于获取当前发生的事件。事件和日志有三个用途:智能合约返回值给用户接口异步的带数据的触发器一种比较便宜的存储智能合约返回值给用户接口我们可以在 dapp 的用户界面中监听事件,EVM 的日志机制可以反过来“调用”用来监听事件的 Javascript 回调函数。contract ExampleContract { //一些状态变

2022-03-17 20:51:59 9349

原创 Nginx 自定义日志打印Request及Response log信息

场景:生产过程中,使用Nginx做反向代理转发请求到第三方网关时,因为请求出错,所以需要在nginx 打印请求的信息。配置Nginx 日志格式使用lua脚本需要nginx配置了lua,或者使用openresty取代nginxhttp { #默认值为off,忽略变量下划线 underscores_in_headers on; #设置日志格式,采用$http_xxx的方式记录header name(xxx)的值 log_format upstreamlog '$

2022-03-09 14:32:55 6337

原创 python库打包与发布 setup

概要简要介绍如何打包自己的python库并进行发布,主要工具为python 库 'setuptools`from setuptools import setup 常用的分发方式tar.gz格式:这个就是标准压缩格式,里面包含了项目元数据和代码,可以使用Python setup.py sdist命令生成。egg格式:这个本质上也是一个压缩文件,只是扩展名换了,里面也包含了项目元数据以及源代码。这个格式由setuptools项目引入。 可以通过命令Python setup.py bdist_

2022-03-08 14:31:35 2263

原创 为什么要用REST Api

简要说一下REST API也是我们常说的RESTful API,是一套规范,指导我们通过Http协议方法隐射到对应的业务逻辑。标准规范如下:方法描述GET用于查询操作,对应于数据库的 select 操作PUT用于所有的信息更新,对应于数据库的 update 操作DELETE用于更新操作,对应于数据库的 delete 操作POST用于新增操作,对应于数据库的 insert 操作HEAD用于返回一个资源对象的“元数据”,或是用于探测API是否健康P

2022-03-07 23:39:15 621

原创 区块链开发之Solidity编程基础(三)合约数据存储

Solidity编程基础三概要以太坊虚拟机 EVM数据位置storage/存储memory/内存calldata/调用数据Stack 栈数据赋值成本概要本章将进行太坊虚拟机EVM的介绍、Solidity的三种数据存储位置的 区别以及不同情况下跨区域数据赋值的gas成本分析与利用等内容。在前文讲变量、函数时,我们讲过EVM提供了四种数据结构来存储数据:Storage、Calldata、Stack、Memory。以太坊虚拟机 EVMEVM是以太坊用于提供Solidity合约运行的轻量级操作系统,其运行

2022-03-06 22:19:35 9158

原创 区块链开发之Solidity编程基础(二)合约语句及函数修饰符

@[TOC](Solidity编程基础二)概要本文延续专栏的编程基础一进行学习,本文主要内容讲解Solidity的语句以及修饰符等内容

2022-02-20 16:26:41 8851

原创 Java项目采用JNI方式加载Quantlib c++(SWIG)库

概要QuantLib(https://github.com/lballabio/QuantLib) 是一个免费、开源的软件库,旨在为量化金融计算提供一个统一的、综合的软件框架。QuantLib 的源代码由 C++ 编写,得利于 C++ 在面向对象和泛型编程方面强大的表现力,以及C++对贴近底层所带来的出众执行效率,QuantLib 一方面可以清晰地描述各种复杂的金融产品,同时兼顾了计算速度。主要功能QuantLib 所提供的功能聚焦在两大领域:期权定价以及相关计算;固定收益产品定价以及相关计算。

2022-02-15 09:55:25 569

原创 WebFlux响应式编程

文章目录概要入门WebFluxWebClient概要在SpringMvc框架下,http的请求是同步的,在某些场景下为了提供性能,可以采用异步的方式来进行优化。WebFlux便是提供了异步的技术栈 响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式WebFlux经常会跟响应式编程挂钩,其实其只不过是响应式编程中的一部分技术,代表的是web控制端实现异步

2022-02-15 09:48:09 1195

原创 NPE nullpoNullPointerException问题

NPE nullpoNullPointerException问题

2022-02-09 14:55:53 402

原创 区块链开发之Solidity编程基础(一)

Solidy是当前编写智能合约的主流语言概要sol文件结构编译开发引入其他文件注释代码注释文档注释合约状态变量类型值类型概要由ETH为代表的第二代区块链技术,相比于第一代区块链技术而言,最大的特点就是智能合约的出现,让去中心化应用成为了可能。ETH节点为智能合约提供运行环境:EVM(Ethereum Virtual Machine)以太坊虚拟机。EVM是一个动态运行沙盒,可以将以太坊上所有的智能合约和周围环境全部隔离。因此,EVM上运行的智能合约无法访问网络、文件系统或者在EVM上运行的其他进程。So

2022-01-09 22:35:52 9624

原创 python自动化框架:pywinauto实现博客之星自动化评论

场景:2021年度博客之星开始评选了,又是各路豪杰实践自身技术能力的时刻,平时都是写文章维护粉丝好友度,现在才是实打实的展现技术 ???? 本分只是python框架的实践,不建议恶意推广,后果自负。大部分玩家都采用爬虫的方式: 登录 -> 获取 cookie -> 设置cookie -> 调用评论api,再爬取其他博主的链接进行周而复始。今天咱不讲爬虫,讲python的自动化测试框架pywinauto如何实现模拟手动操作(相同的还有pyAutoGui这个库),制造一个有血有肉的回复机

2021-12-29 23:42:45 1646 3

原创 交易系统开发技能及面试之TechCoding

文章目录概要Q1设计股票订单撮合系统,支持5000以上不同品种,单品种每天上百万订单Q2 实践:设计订单簿,用于支持下单、撤单、撮合功能,撮合采用价优方式Q3 设计一个网关用于接收用户订单并将其转发给交易撮合服务,该网关需要实现限流功能,给定 N,T两个值,表示在T微妙时间内只处理N个消息,相当于滑动窗口控制。要求设计订单控制类:根据N、T、Input,处理接收的订单流,返回pass 或者 fail。Q4 实现前缀树的插入跟搜索概要编程面试是整体面试中最核心的部分,毕竟开发者都是手艺者,需要动手跟思维都

2021-12-26 22:09:18 1145 1

原创 交易系统开发技能及面试之低延迟编程技术

文章目录概要概要

2021-12-21 22:42:12 1848

原创 交易系统开发技能及面试之网络知识

文章目录概述Q1 为什么总问TCP握手过程Q2 当客户端没有通知服务端关闭链接时异常退出,服务端如何处理链接状态?Q3 tcp是如何处理快生产慢消费的?Q4 什么是MTU?Q5 比较TCP跟UDP?Q6 客户端是如何加入IP多播流?Q7 使用非阻塞socket的优势Q8 比较select 跟 poll系统进阶概述网络知识体系是开发人员都必须具备的,本章主要讲解TCP/UDP协议,Socket,IP多播方式。理解非阻塞socket工作方式和怎样设计一个事件驱动系统。Q1 为什么总问TCP握手过程TCP

2021-12-14 20:09:08 174

原创 交易系统开发技能及面试之进程间通信(共享内存)

文章目录摘要Q1 当最后一个附加到共享内存的进程意外退出时,会发生什么?Q2 为什么内存共享是最快的进程通讯方式?Q3 可以在运行时调整共享内存大小么?Q4 使用mmap实现进程间通讯有什么优点?当一个进程正在写内存时会发生什么?Q5 操作系统为什么需要虚拟内存?Q6 Application Binary Interface(ABI)和 Application Programming Interface(API)的区别?摘要共享内存是进程间通信的最常用的方式,所以其在面试中也是高频知识点。通常,共享内存

2021-12-07 09:00:00 408

原创 交易系统开发技能及面试之无锁编程(Lock-free)

目录概要Q1 什么是atomic?Q2 alignas 关键字Q3 C++的内存模型 relaxed ordering, release-acquire ordering, sequentially consistent ordering概要这一章内容主要讲解无锁编程相关技能,在生产中,为了解决线程间资源共享问题,最常用的方式就是加锁了,这在上一章并发编程也讲到过很多。关于无锁的时候,也写过一篇无锁队列的实现,而今天这篇文章主要是讲解无锁编程所需要了解的基础知识,比如atomics,内存模型,内存排序等

2021-12-03 00:27:39 559

原创 交易系统开发技能及面试题之多线程并发编程(Multithreading)

文章目录概要Q概要交易系统开发技能系列的第二部分内容:并发编程多进程、多线程编程是大型系统开发必不可少的技能,这部分内容涉及各种各样的锁,死锁,线程安全思考,以及生产者消费者模式:spsc、mpmc等等。Q...

2021-11-23 00:18:20 507

原创 交易系统开发技能及面试题之c++基础特性

Q1Boost库Boost.AsioBoost.Signals2Boost.ThreadBoost.Test

2021-11-20 18:21:53 1862

原创 区块链开发之智能合约设计模式

编程范式中提到的设计模式:Creational Patterns(创建型模式),如Singleton, Factory,AbstractFactory模式等;Behavioral Patterns(行为模式),如Observer,Vistor,Mediator模式等;Structural Pattern(结构型模式),如Bridge,Composite,Facade模式等;随着Solidity大量的去中心化应用的普及,也形成了一些设计模式:1、合约自毁(Contract Self Destruct

2021-11-18 00:27:42 7103

原创 区块链开发之Solidity智能合约开发

在编写智能合约之前,需要有Solidity的开发环境,我将使用Remix来进行Solidity的学习,大家可以访问Remix在线Solidity集成开发环境其界面主要分三部分,左半本分是合约目录,可进行合约编译、发布右上部分是合约的编写框右下部分是合约的运行情况编写合约这个示例演示多个合约的调用,已经编译发布跟执行1、首先编写被调用合约 Calleepragma solidity ^0.4.24;contract Callee{ uint[]public values;

2021-11-13 16:41:08 6762

原创 golang实践:构建gin web项目,让web开发更轻便,碗里的spring boot并不香了

近期需要使用golang搭建一个web项目, 顾采用gin这个框架,也可以用beego框架,基本一样的用法,废话不多说, 先创建项目1、在GOPATH目录下 新建 Api项目mkdir apicd apigo mod init2、使用mod 进行项目构建,可以让包都放在GOPATH的pack目录下3、在项目内执行 go get 获取 gin包mod会自动填写包的依赖以及版本, 当需要替换版本时 使用replace指令go get -u github.com/gin-gonic/gin

2021-11-12 00:19:07 1548 1

原创 Java 项目封装sqlite连接池操作持久化数据以及采用JDBC-mybatis快速使用

Sqlitesqlite是C实现的一个开源SQL引擎,其api提供sql语法支持,通过sql解析后对存储层的磁盘文件进行操作,完整配置的sqlite库小于400kb,多用于移动端应用,小型项目中。对Sqlite有兴趣的可以了解下其体系结构之前自研SQL解析器的时候便是借鉴了SQLcompiler的源码,这里不展开介绍封装Java的Sqlite连接池首先maven项目引入依赖sqlite-jdbc,其主要是java版的sqliteapi,关于Sqlite api的操作,大家可以看菜鸟教程<

2021-11-09 00:25:27 1736

原创 java 实现grpc服务间调用工程

学习目标:使用grpc协议,实现服务间通讯学习内容:1、rpc协议有哪些2、grpc3、构建rpc服务rpc协议有哪些RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。为微服务时代,rpc是常用的技术方案,区别于单体服务内的本地调用,rpc需要解决的是不同进程间的调用,往往会是跨机器调用(区别于同一机器下通道等IPC解决方案),跨机器主要解决的是网络通讯。那么跨机器的网络通讯方式主要通过TCP/IP,而rpc更多关注的是应用层的

2021-11-07 18:10:41 1133

原创 Java 使用双内存缓冲区 实现简易日志组件

在实现简易日志组件时,为了写日志的同时,可将日志数据进行写入磁盘实现持久化。如果每记录一条日志就写一次磁盘文件的话, 磁盘IO会占用正常处理逻辑的性能。因此,采用双内存缓冲区的思路来将写日志与写磁盘文件这两个动作进行解耦。1、将业务日志写入到日志缓冲区2、当进行刷盘时,将日志缓冲区的数据转移到待刷盘缓冲区3、日志缓冲区继续执行,而刷盘线程可另外工作以下为实现的逻辑代码:package com.dfs.namenode.server;import java.util.LinkedList;/

2021-10-31 22:25:51 251

原创 Js 的Promise 异步编程模式

Promise语义统称 承诺对象, 在异步编程模式中, 通过创建承诺对象,将异步任务交由承诺对象执行后,主线程可以去执行其他任务。当需要获取异步任务的执行结果时,通过承诺对象可以获取到对应的结果值Js 使用Promisefunction test() { return new Promise((resolve, reject)=>{ /* 执行逻辑 */ let result = ""; let succes

2021-10-21 21:28:20 100

原创 java 垃圾收集(Garbage Collection)之 哪些内存需要回收

Garbage Collection : 垃圾收集,简称GC在使用java的时候,我们将内存交由虚拟机管理,而不需开发人员过度关注,但并不意味着我们可以不学习什么是垃圾回收和内存分配。因为当需要排查各种内存溢出、内存泄漏问题时,垃圾回收成为系统达到更高并发量的瓶颈时(gc需要占用工作线程),我们需要能进行监控和调节。Java的内存运行区数据中,程序计数器、虚拟机栈、本地方法栈这3个区域随线程而生亡,其栈帧分配多少内存基本上是在类结构确定下来时就已知的,所以这3个区域的内存分配和回收都具备确定性,而不需要

2021-10-17 21:15:20 453

原创 mysql 使用 replace into 或者 ON DUPLICATE KEY 实现插入数据或者更新已存在数据(insertOrUpdate)

1、replace into 的做法是先根据主键来判断数据是否存在,如果存在即删除旧数据后重新插入数据,来达到update的目的 <insert id="insertOrUpdateData" useGeneratedKeys="true" keyProperty="id" parameterType="list"> replace into datas (<include refid="column"/>) VALUES

2021-10-14 20:51:25 364

原创 使用Spring freameword core提供的StopWatch统计代码执行时间

StopWatch stopWatch = new StopWatch("逻辑耗时统计=" + orderParam.getOrderType()); stopWatch.start("1. xxxx"); /* 执行逻辑 */ stopWatch.stop();StopWatch是Spring框架提供的工具类

2021-10-13 18:03:08 89

原创 js 采用a 标签导出csv

let mainTitle = ["A", "B", "C"]; let dataStr = []; dataStr.push(mainTitle.join("\,")); //标题添加上换列转成字符串并存进数组 //datas为每行数据 for (let j = 0; j < datas.length; j++) { let temp = []; temp.push("A");

2021-10-12 18:11:42 204

原创 java使用AES 工具类 加解密解决数据保密性问题

场景:请求权限时,将请求的返回值进行AES加密成token,用户通过临时token请求权限时,解密获取请求的数据,避免请求数据被拦截解析。密文返回十六进制,解决 前端可能通过url请求时,将token设置为url参数会导致url格式不正确(包含’/’ '+'等特殊符号)package com.digquant.util;import org.apache.commons.lang3.StringUtils;import javax.crypto.Cipher;import javax.cry

2021-10-12 14:35:13 517

原创 Redis数据结构之Dict字典

简介字典(Dict),是一种用于保存键值对(key-value pair)的抽象数据结构,其应用于将一个键(key)映射为一个值,从而形成关联性。在字典中,每个键都是独一无二的,通过独一无二的特性来获取、更新、删除与之关联的值。键的独一无二特性取决于哈希函数的随机性,当我们实现自己的字典时,哈希函数是实现的一大关键。字典这种结构通常内置在各个高级语言,比如c++的Map、java的Map,都是字典。字典在redis中的应用场景Redis的实现语言为C,因此Redis的作者自己实现了字典这个数据结

2021-10-10 23:35:37 305

protoc-3.15.5-win64.exe

protoc-3.15.5-win64.exe

2021-11-07

protoc-gen-grpc-java-1.9.1-windows-x86_64.exe

protoc-gen-grpc-java-1.9.1-windows-x86_64.exe

2021-11-07

power design 15.1 15.* 破解

license

2017-08-26

空空如也

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

TA关注的人

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