自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LU_ZHAO的博客

明日复明日,明日何其多

  • 博客(326)
  • 收藏
  • 关注

原创 一些学习和资源网站

c++http://purecpp.org/https://en.cppreference.com/

2020-04-17 16:55:15 1475 1

原创 The Serenity Prayer

The Serenity PrayerGod grant me the serenity to accept the things I cannot change; courage to change the things I can; and wisdom to know the difference. Living one day at a time; Enjoying one...

2020-04-15 16:01:26 1287

原创 现代cpu的合并写技术对程序的影响

对于现代cpu而言,性能瓶颈则是对于内存的访问。cpu的速度往往都比主存的高至少两个数量级。因此cpu都引入了L1_cache与L2_cache,更加高端的cpu还加入了L3_cache.很显然,这个技术引起了下一个问题:如果一个cpu在执行的时候需要访问的内存都不在cache中,cpu必须要通过内存总线到主存中取,那么在数据返回到cpu这段时间内(这段时间大致为cpu执行成百上千条指令的时间,...

2020-04-02 14:43:00 564

原创 伪共享(false sharing),并发编程无声的性能杀手

什么是共享下图是计算的基本结构。L1、L2、L3分别表示一级缓存、二级缓存、三级缓存,越靠近CPU的缓存,速度越快,容量也越小。所以L1缓存很小但很快,并且紧靠着在使用它的CPU内核;L2大一些,也慢一些,并且仍然只能被一个单独的CPU核使用;L3更大、更慢,并且被单个插槽上的所有CPU核共享;最后是主存,由全部插槽上的所有CPU核共享。当CPU执行运算的时候,它先去L1查找所需的数据、再去...

2020-04-02 11:35:08 532

原创 【Golang】如何得知变量是分配在栈(stack)上还是堆(heap)上?

How do I know whether a variable is allocated on the heap or the stack?From a correctness standpoint, you don’t need to know. Each variable in Go exists as long as there are references to it. The sto...

2020-04-02 11:03:37 3115

原创 【Golang】内存池

Go的内存分配器采用了跟tcmalloc库相同的实现,是一个带内存池的分配器,底层直接调用操作系统的mmap等函数。作为一个内存池,回忆一下跟它相关的基本部分。首先,它会向操作系统申请大块内存,自己管理这部分内存。然后,它是一个池子,当上层释放内存时它不实际归还给操作系统,而是放回池子重复利用。接着,内存管理中必然会考虑的就是内存碎片问题,如果尽量避免内存碎片,提高内存利用率,像操作系统中的首次...

2020-04-02 10:49:19 762

原创 【操作系统】cache直接映射、组相连映射以及全相连映射

Cache的容量很小,它保存的内容只是主存内容的一个子集,且Cache与主存的数据交换是以块为单位的。为了把信息放到Cache中,必须应用某种函数把主存地址定位到Cache中,这称为地址映射。在信息按这种映射关系装入Cache后,CPU执行程序时,会将程序中的主存地址变换成Cache地址,这个变换过程叫做地址变换。Cache的地址映射方式有直接映射、全相联映射和组相联映射。假设某台计算机主存容量...

2020-04-02 04:29:30 3931

原创 【Golang】Go调度器(scheduler)与channel

go程序的运行,以goroutine为单位,而goroutine实际运行在某个系统线程内。goroutine(可以非常多)和系统线程(相对比较少)并非一一对应。调度时,既有os调度线程,也有go调度器本身调度goroutine。简言之,go原生支持并发,go调度器负责将各个goroutine调度到不同的操作系统线程中取执行。通过go关键字启动一个协程来运行函数:go func()三个定义:...

2020-04-02 02:21:25 529

原创 【MySQL】filesort 文件排序

filesort 文件排序filesort 并不是说通过磁盘文件进行排序,而只是告诉我们进行了一个排序操作。即在MySQL Query Optimizer 所给出的执行计划(通过 EXPLAIN 命令查看)中被称为文件排序(filesort)文件排序是通过相应的排序算法,将取得的数据在内存中进行排序: MySQL需要将数据在内存中进行排序,所使用的内存区域也就是我们通过sort_buffer_...

2020-04-01 22:33:15 556

原创 【设计模式】业务代表模式(Business Delegate Pattern)

业务代表模式业务代表模式(Business Delegate Pattern)用于对表示层和业务层解耦。它基本上是用来减少通信或对表示层代码中的业务层代码的远程查询功能。在业务层中我们有以下实体。客户端(Client) - 表示层代码可以是 JSP、servlet 或 UI java 代码。业务代表(Business Delegate) - 一个为客户端实体提供的入口类,它提供了对业务服务...

2020-04-01 22:20:13 318

原创 【Golang】反射机制

反射在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属...

2020-04-01 20:33:26 534

原创 【可视化】使用 Graphviz 绘画 UML 图

简介Graphviz 是 AT&T 实验室开发的一个开源软件,它以一种文本语言去描述图(graph),然后自动排布节点和边去生成图片。它已有近 30 年历史。UML(unified modeling language,统一建模语言)是一种常用的面向对象设计的方法。其中最常用的是类图(class diagram),用于表示类的构成以及类之间的关系。利用 Graphviz 去生成 UML...

2020-04-01 14:08:56 902

原创 C语言 _Alignof 运算符(C11 起)

查询其运算数类型的对齐要求。通常通过便利宏 alignof 使用此运算符。头文件:#include <stdalign.h>解释返回 类型名 所指名的类型的对齐要求。若 类型名 为数组类型,则结果为数组元素的对齐要求。 类型名 不能为函数类型或不完整类型。结果是 size_t 类型整数常量。不求值运算数(故用作运算数的外部标识符不必有定义)。一些 C 编译器允许把 _A...

2020-04-01 04:23:15 3662

原创 【设计模式】拦截过滤器模式(Intercepting Filter Pattern)详解及源码

拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务。过滤器链(Filter Ch...

2020-04-01 02:38:47 455

原创 【操作系统】 为什么说共享内存是最快的一种IPC方式呢?

在linux进程间通信的方式中,共享内存是一种最快的IPC方式。因此,共享内存用于实现进程间大量的数据传输,共享内存的话,会在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问的时间等。为什么说共享内存是最快的一种IPC方式呢?让我们一起来看一下下面的这张图:从这张图中,我们可以看出,使用管道(FIFO/消息队列)从一个文件传输信息到另外一个文件需要复...

2020-04-01 02:15:52 4928 1

原创 【Redis】慢查询日志

慢查询日志是 Redis 提供的一个用于观察系统性能的功能, 这个功能的实现非常简单, 这里我们也简单地讲解一下。本章先介绍和慢查询功能相关的数据结构和变量, 然后介绍 Redis 是如何记录命令的执行时间, 以及如何为执行超过限制事件的命令记录慢查询日志的。相关数据结构每条慢查询日志都以一个 slowlog.h/slowlogEntry 结构定义:typedef struct slowl...

2020-04-01 01:59:58 341

原创 如何编写高级爬虫?

根据 网页如何判断一个请求来自于爬虫?就容易知道做一个爬虫要干啥:分布式:通常会有一些教材告诉你,为了爬取效率,需要把爬虫分布式部署到多台机器上。这完全是骗人的。分布式唯一的作用是:防止对方封IP。封IP是终极手段,效果非常好,当然,误伤起用户也是非常爽的。模拟JavaScript:有些教程会说,模拟javascript,抓取动态网页,是进阶技巧。但是其实这只是个很简单的功能。因为,如果对...

2020-04-01 01:50:51 1079 1

原创 网页如何判断一个请求来自于爬虫?

网络爬虫在大多数情况中都不违法,其实我们生活中几乎每天都在爬虫应用,如百度,你在百度中搜索到的内容几乎都是爬虫采集下来的(百度自营的产品除外,如百度知道、百科等),所以网络爬虫作为一门技术,技术本身是不违法的,且在大多数情况下你都可以放心大 胆的使用爬虫技术。当然也有特殊情况,请看下一章节。可以从以下几点进行考虑限制请求/提交次数,比如每分钟最多请求60次,3分钟最多请求100次。如果超...

2020-04-01 01:46:54 3159

原创 【代理模式】Java的三种代理模式 - 静态代理,动态代理,Cglib代理

代理(Proxy)是一种设计模式,定义:为其他对象提供一个代理以控制对某个对象的访问,即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。为什么使用代理我们在写一个功能函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带来以下麻烦:枝节性代码...

2020-04-01 01:28:13 328

原创 【Redis】Lua 脚本

Lua 脚本功能是 Reids 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 CAS (check-and-set)命令的缺点, 并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。本章先介绍 Lua 环境的初始化步骤, 然后对 Lua 脚本的安全性问题、以及解决这些问题的方法进行说明, 最后对执行 Lua 脚本的两...

2020-04-01 00:36:21 267

原创 Linux Command - set 设置shell

set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。语法set [+-abCdefhHklmnpPtuvx]参数说明:-a  标示已修改的变量,以供输出至环境变量。-b  使被中止的后台程序立刻回报执行状态。-C  转向所产生的文件无法覆盖已存在的文件。-d  Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。-e  若指令传回值...

2020-03-31 23:57:49 393

原创 Linux Command - tee 读取标准输入的内容并输出成文件。

tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收完从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。语法tee [-ai][--help]...

2020-03-31 23:50:43 495

原创 【API 网关】API 网关需要支持哪些功能?

API 生命周期管理支持包括 API 发布、API 测试、API 下线等生命周期管理功能。支持 API 日常管理、API 版本管理、API 快速回滚等维护功能。全面的安全防护支持多种认证方式,支持 HMAC (SHA-1,SHA-256) 算法签名。支持 HTTPS 协议,支持 SSL 加密。防攻击、防注入、请求防重放、请求防篡改。灵活的权限控制用户以 APP 作为请求 ...

2020-03-31 23:45:52 863

原创 如何有效防止API的重放攻击?

API重放攻击(Replay Attacks)又称重播攻击、回放攻击,这种攻击会不断恶意或欺诈性地重复一个有效的API请求。攻击者利用网络监听或者其他方式盗取API请求,进行一定的处理后,再把它重新发给认证服务器,是黑客常用的攻击方式之一。https://help.aliyun.com/knowledge_detail/50041.htmlHTTPS数据加密是否可以防止重放攻击?否,加密可以...

2020-03-31 23:06:02 1179

原创 【网络安全】重放攻击(Replay Attacks)

重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。原理重放攻击的基本原理就...

2020-03-31 22:53:45 3305

原创 【Java】ConcurrentHashMap

ConcurrentHashMap是Java中的一个线程安全且高效的HashMap实现。平时涉及高并发如果要用map结构,那第一时间想到的就是它。那么我就这几个方面了解一下ConcurrentHashMap:ConcurrentHashMap在JDK8里结构ConcurrentHashMap的put方法、size方法等ConcurrentHashMap的扩容HashMap、Hashta...

2020-03-31 22:05:01 301

原创 Linux Command - Timeout 运行具有时间限制的命令

Linux附带了许多命令,每个命令都是唯一的,并在特定情况下使用。Linux的目标是帮助你尽快高效地工作。Linux命令的一个属性是时间限制。你可以为所需的任何命令设置时间限制。如果时间到了,该命令将停止执行。timeout 是指运行指定的命令,如果在指定时间后仍在运行,则杀死该进程。用来控制程序运行的时间。语法Usage: timeout [OPTION] NUMBER[SUFFIX] C...

2020-03-31 21:34:38 1275

原创 【设计模式】策略模式VS状态模式

在行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式。但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的;而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的。这两种模式虽然都有变换的行为,但是...

2020-03-31 21:24:29 364

原创 Linux Command - trap 使用shell脚本要监视并拦截的Linux信号

Linux信号Linux系统利用信号与系统中的进程进行通信。Linux的常见信号有:信号值描述1SIGHUP挂起进程2SIGINT终止进程3SIGQUIT停止进程9SIGKILL无条件终止进程15SIGTERM尽可能终止进程17SIGSTOP无条件停止进程,但不是终止进程18SIGTSTP停止或暂停进程,但不...

2020-03-31 21:11:20 673

原创 【Java】Java语言学习思维导图

mark。

2020-03-31 20:52:35 343

原创 【Java】ReentrantLock 可重入锁

ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性,synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式...

2020-03-31 20:50:57 317

原创 【Golang】IrIs框架 Hosts

监听服务您可以启动服务器监听任何类型的net.Listener甚至http.Server实例。 服务器的初始化方法应该在最后通过Run函数传递。Go开发人员用于服务其服务器的最常用方法是传递“hostname:ip”形式的网络地址。 有了Iris,我们使用的iris.Addr是一种iris.Runner类型。 //用网络地址监听tcp 0.0.0.0:8080 app.Run(iris....

2020-03-31 16:27:23 653

原创 【设计模式】策略模式及源码示例

模式动机完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。在软件系统中,有许多算法可以实现某一功能,如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类...

2020-03-31 16:24:33 424

原创 【设计模式】适配器模式、装饰模式、代理模式的异同

这三种设计模式同属于结构型模式,初学者乍一看可能难以分辨三者的区别。这里对三者之间的异同详细地探讨一下。适配器模式VS装饰模式首先来比较一下适配器模式和装饰模式。两者都被称为包装模式,在功能上是较为接近的。适配器模式分为类适配器和对象适配器。类适配器比较直接,继承待适配类,实现目标接口,使得待适配类满足目标接口的特定功能。但是这种直接继承的方法太简单粗暴了,我们知道要尽量多聚合少继承,所以更...

2020-03-31 15:28:57 1338

原创 C/C++ 变量前面加(void)是什么作用

今天看代码,看到在变量前加(void)。。变量前面加(void)是什么作用?是一种伪装手法,对程序没有影响,目的是消除编译器的警告。如果一个变量定义了,但是没有被后续代码使用,编译器就会给出警告,而(void)a;这样的代码虽然啥也没做,却可以消除编译器产生的警告。函数调用时,前面加个(void)到底是做什么用的?其实对于程序的编译运行没有任何影响,目的很简单就是让源代码顺利通过一些严格的...

2020-03-31 14:59:51 4902

原创 【Golang】 网站的根目录如何映射到文件系统?

不到十行代码:package mainimport ( "log" "net/http")func main() { http.Handle("/", http.FileServer(http.Dir("youpath"))) log.Fatal(http.ListenAndServe(":8080", nil))}需要注意是否可以回溯。如果可以访问...

2020-03-31 02:20:04 879

原创 【Golang】go mod 使用

go modules 是 golang 1.11 新加的特性。现在1.12 已经发布了,是时候用起来了。Modules官方定义为:模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。如何使用 Modules ?把 golang...

2020-03-30 23:47:38 1081

原创 :go get github.com/kataras/iris/v12@latest go: cannot use path@version syntax in GOPATH mode

安装iris的时候记得打开GO111MODULE和使用中国代理,在项目路径下设置环境变量:export GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct然后执行如下命令则是安装iris:go get github.com/kataras/iris/v12@latest...

2020-03-30 22:57:05 4398

原创 带你了解什么是Push消息推送

什么是Push消息?Push消息是非常常见的,每个APP几乎都有此类的产品。举个例子:Push消息能做什么?一般我们认为Push消息能做以下的事情:唤醒用户,提高用户的留存率,提高产品活跃度。我手机下载了蘑菇街,但我似乎把它已经忘记了(好久没用了),如果此时这个APP给我推送一条我有兴趣的内容。我可能会继续用蘑菇街这个APP,甚至从此活跃起来(购买消费)告诉用户我有新的产品上线了(带...

2020-03-30 21:38:03 2408

原创 【Golang】Iris介绍

背景介绍Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。谷歌资深软件工程师罗布·派克(Rob Pike)表示,“Go让我体验到了从未有过的开发效率。”派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,“使用它可以进行快速开发,...

2020-03-30 21:33:17 1265

空空如也

空空如也

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

TA关注的人

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