
后端
文章平均质量分 91
zou8944
这个作者很懒,什么都没留下…
展开
-
几种常用登录的调试方式
三方登录常需要客户端和服务端共同完成,对OAuth2,客户端获取授权码,服务端用授权码换取访问凭证;对OIDC,客户端获取ID Token,服务端验证其正确性用以登录之类的场景。但两端又常非同一个开发人员,服务端逻辑写好后需要客户端配合获取授权码或ID Token作为输入进行调试验证。这样效率太过低下,协调上会有困难。最好是服务端能够自己获取输入参数,这里介绍常见的四种登录方式的简单调试方法:微信登录、Apple ID登录、Google登录、Facebook登录。微信登录遵循标准的OAuth 2.0协议,完原创 2022-07-12 18:31:32 · 1159 阅读 · 0 评论 -
换个角度看X.509证书
初识X.509证书,多半是HTTPS协议,SSL或TLS握手阶段,需要用证书传输公钥,建立加密的传输信道。于是在印象中X.509就和HTTPS绑定在了一起。这种绑定有些许先入为主。实际上X.509证书的用途不止如此。网上已经很多写得好的文章,推荐一篇:X.509数字证书的基本原理及应用。从中我们可以总结出几个要点除此之外,没有更多的理论信息。博客的输出往往只是作者知识学习过程的输出,常很片面,仅能作为知识交流和了解的方式,不能作为严肃学习的主要来源(包括我这篇)。优秀如此文,看完也还是虚空之感,因为我们不知原创 2022-06-12 15:57:39 · 2146 阅读 · 0 评论 -
(记) Deployment设置环境变量不生效
记一个卡了两天的问题问题Dockerfile中,指定不同的启动方式,会有不同的读取环境变量的效果。有的能够读到,有的读不到。具体来说,如下能够读取到的方式直接启动 CMD ["java", " -jar", "xxxx.har"]tini+直接启动 CMD ["/tini", "--", "java", " -jar", "xxxx.har"]tini+sh启动 CMD ["/tini", "--", "sh", "-c", "java -jar xxxx.jar"]不能读取的方.原创 2022-05-19 17:52:34 · 1875 阅读 · 0 评论 -
IAP StoreKit2后端开发完全指南
原文地址:https://zou8944.com/2022/05/13/IAP-StoreKit2%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/TL;DR;2021年10月,苹果发布了StoreKit2。新API和流程看起来更加简化,但是苹果官方文档并没有让开发者接入变得简单,调试起来也是各种问题,这方便和StoreKit1一样做的不好。梳理是必要的。文档研读文档目录官方文档虽然有组织结构,但并不清晰,按照如下结构去看,能够.原创 2022-05-16 15:39:12 · 9323 阅读 · 3 评论 -
Kubernetes节点磁盘管理
Kubernetes集群运行一段时间后,通常会出现磁盘占用过高的问题。这里聊聊排查这类问题的方法和思路。问题点如果是正常的Linux服务器出现这种情况,解决方案无非是ssh到该主机查看大文件然后进行删除。Kubernetes上也是如此,但问题在于,其中的节点由Kubernetes自己管理,登录秘钥管理人员很可能不知道。所以通常的问题点是:无法进入Kubernetes节点。就磁盘问题来说,是无法进入节点的文件系统。进入节点有两个进入节点的方式使用Lens管理软件,它是一个非常厉害的Kubern原创 2022-02-17 15:05:04 · 1568 阅读 · 0 评论 -
单元测试 - 理论
很多人是不写单元测试的,无非因为性价比太低。但我始终以为,真实原因是打开方式不正确,如果花功夫系统研究一下,或许会不一样。这不就来了,现希望相对系统第了解单元测试的理论、常用工具、实施方法。伴随会产生系列文章。初预备三部分:理论:介绍单元测试需要关注的内容,从设计上如何考虑工具:介绍Spring Test、JUnit、Assert、Mock技术,相关库的使用实践:基于以上两个部分的学习,重构当前的一个项目,记录过程中考虑的点。并最终给出结论。此篇为首!与单元测试相关的书籍,大约有这么三.原创 2022-01-22 12:35:40 · 482 阅读 · 0 评论 -
Linux用户和权限管理
这是Linux系列第二篇文章,本来觉得Shell写完就OK了。但仔细一梳理发现对很多Linux要么是一知半解,要么是忘了。既然如此,还是遇到什么就回顾什么吧。本文试图解决以下问题Linux如何做用户管理用户和权限的关系一个用户安装软件后,其它用户能否使用,这是如何决定的?与此相关的命令的使用方式概览Linux的权限管理,与两个重要的特性关联甚密:一切皆文件;多用户操作系统。多用户操作系统,意味着用户之间的资源需要隔离,就有了权限存在的必要性;一切皆文件,意味着权限管理的目标只有文件。Li原创 2022-01-13 23:15:50 · 795 阅读 · 0 评论 -
Shell编程知识点速查
shell常用,却从未引起重视,用到啥就查啥,甚至语法都不记得。在这样一次次的”现查“中,浪费了大量的时间。索性画上一个周末的时间,相对系统第学学它,毕竟它也不复杂。本文没有太多内容,正文是一张图。我到B站随便找了个视频,就它,看了下,收获颇丰。算是系统梳理吧,整个思维导图,助记。说起来,shell也不复杂,掌握的大知识点不会超过10个。图片如下,思维导图本导在这。gocha …...原创 2022-01-09 20:56:01 · 276 阅读 · 0 评论 -
可能是最详细的LDAP讲解
本文试图清晰明白的讲述LDAP是什么、应用场景、使用方法。开篇照例一波吐槽。LDAP这个名字大家不会陌生,即所谓轻量级目录访问协议。无论博客还是论坛,网上对它的讲解太多了,但在我看来,都不得要领。它们中的大多数都仅介绍了冰山一角,还不注明资料来源。想来,作者很可能也不知道这些知识从哪里来的,这篇文章看看、那篇文章参考一下,东拼西凑,再看看库的API,写写代码,然后…it works!!!,再然后就没有然后了吧????。本文试图从协议本身出发,尽量做到系统化。就算读者看了这篇文章还是不能掌握,也可以自己原创 2022-01-03 14:43:18 · 52979 阅读 · 9 评论 -
OpenID Connect详解
OpenID Connect 1.0是建立在OAuth 2.0上的一个身份验证机制,它允许客户端通过授权服务对用户进行认证并获取简单的用户信息。前置知识:读者需要了解OAuth2.0的授权码模式和隐藏模式两种工作流程,要了解JWT、JWE、JWS等概念。这在我的前两篇文章都有详细讲解概览名词解释OP:OpenID Provider,即OAuth2.0中的授权服务,用于对用户鉴权RP:Relying Part,依赖方,即OAuth2.0中的客户端,它从OP除获取对用户的鉴权和用户信息原创 2021-12-26 11:39:34 · 10097 阅读 · 0 评论 -
OAuth2.0详解
本文深入OAuth2.0协议,以及基于其上的OpenID Connect身份认证协议。前者解决授权第三方服务访问资源的问题;后者解决身份认证的问题。主要资料来源是官方协议手册:RFC6749、OpenID Connect Specification。当然还有更多其它说的好的第三方资源,比如阮一峰这个,它的优点是只针对协议讲解,没有举那些无助于理解的复杂例子。考虑到文章的长度,OpenID Connect移到下篇文章再说OAuth2.0解决了授权的问题。在只有客户端和资源服务器的简单架构中,资源服原创 2021-12-23 20:52:24 · 3726 阅读 · 0 评论 -
JWT详解
本文介绍JWT组成原理及适用范围。概览JWT,全称JSON Web Token,是一种包含信息的Token,相较于普通的Token,唯一多的内容是:包含部分信息。与JWT相关的协议比较简单,但数量较多,本文只是对此加以总结。JWS-rfc7515JWE-rfc7516JWK-rfc7517JWA-rfc7518JWT-rfc7519术语说明这其中会涉及到很多简写,先介绍一下JWS:JSON Web Signature,表示使用基于JSON的数据结构,对内容进行数字签名或MAC。具原创 2021-12-21 14:28:49 · 4449 阅读 · 1 评论 -
Spring源码剖析 - 配置注解和自动配置原理
截止目前,我们已经写了四篇关于Spring源码解析的文章,但它们只关注了Spring和SpringBoot的启动流程,并没有回答我们日常使用中的核心问题——自动配置的实现原理,本文进行探索在前文“Spring源码剖析 - BeanDefinition”中扫描Bean定义一节中,我们漏掉了一个关键方法调用,其调用路径如下-> org.springframework.context.annotation.AnnotationConfigApplicationContext #Annotati.原创 2021-12-11 16:08:28 · 556 阅读 · 0 评论 -
Spring源码剖析 - SpringBoot启动流程
在Spring源码剖析的前三篇文章,我们介绍了ApplicationContext、Bean相关内容、BeanPostProcessor的内容;但从普遍反馈和自己事后阅读的体验来看,文章过长,没有重点,条理并不是特别清楚。想必是写作方式出了问题,最突出的莫过于流水账式写法,虽然写作的目的并不一定是写出好的文章,而是主要服务自己,但时间一长,自己也是个普通的读者,同样会看不大懂。因此,写作方法是需要变更了:要突出条理和重点,如需大段源码讲解,可在文章最后增加源码解析一节,读者可选读。也就是说,长度还是那么.原创 2021-12-07 21:51:50 · 543 阅读 · 0 评论 -
容器速记 - Dockerfile主要指令
本文介绍Dockerfile中主要命令的用途FROM指定基础镜像,推荐的方式是 image:tag,精确指定。注意:可以使用多条FROM,这样就会构建多个镜像。比如我同时想要busybox和nginx,我可以这么写FROM busybox:latestFROM nginx:latest然后构建运行# 构建root@10-9-175-15:/home/ubuntu/docker-learn$ docker build -t busybox-nginx .Sending build con原创 2021-12-05 18:10:38 · 574 阅读 · 0 评论 -
Spring源码剖析 - PostProcessor们
BeanPostProcessor是Spring中参与Bean生命周期定制非常重要的一个手段,上文分析过,其执行有两个时机一前:Bean自动注入之后,自定义初始化方法调用前一后:自定义方法调用之后Spring中很多重要的特性利用了BeanPostProcessor达成,毕竟,算来算去,Spring中整个Bean的生命周期已经足够复杂了,如果每加一个功能就要在生命周期上做文章,只会增加复杂度,而BeanPostProcessor则是Spring提供的一种扩展方式。与其相对的,一般用户用的可能较少的B原创 2021-11-30 16:11:13 · 531 阅读 · 0 评论 -
PostgreSQL权限管理详解
本文介绍PostgreSQL中如何管理用户和权限,这些是正确管理PostgreSQL权限必备的前置知识。角色 - ROLEPG中,围绕角色进行权限的管理。它可以被看做是一个user,或一组user。区分role、user、group。user和group是PG 8.1之前的两个实体,role是那之后唯一存在的实体,现在user和role,等价。初始角色数据库刚创建时,会自动创建一个超级用户的角色:postgres。任何操作都是从该用户开始的。创建角色CRAETE ROLE {角色名} [LOG原创 2021-11-25 00:03:42 · 25044 阅读 · 2 评论 -
Spring源码剖析 - 关于Bean的一切
阅读提示:TL;DR。文章包含大量源码,阅读时长较长,认真阅读可能超过20分钟。回想一下,Spring最最核心的功能,终究是一个容器,用于提供所谓的”Bean“,并负责Bean之间的联结。而我们又知道,Bean有不同的Scope,即作用范围,单例的、原型的、Session的,或自定义的。Bean还能够懒加载。因此,创建Bean的时机可能是运行时的任何时候。Spring使用BeanDefinition描述一个Bean的name、类、scope等元数据,并在需要时候创建。创建过程自然也包括了自动注入的过程.原创 2021-11-20 16:07:25 · 631 阅读 · 0 评论 -
Spring源码剖析 - ApplicationContext
前言实话说,Spring虽火,但我的使用经验却不多。这和我的实际工作经历有一定关系,前几年初入软件这行,项目使用Struts1,第一次使用Spring,还是在同时期的外快项目,非常表面。换公司后直接转向Vertx技术栈,近一年多虽然又转向Spring,但手上的Spring项目并不复杂,也没抽时间好好过一遍Spring。于是,Spring成了心病,你可以说它千万好坏,但首先得掌握它,这一点我做的不好,所以是时候研究一下它。Spring说简单也简单,本质上就一个依赖注入、面向切面的框架;Spring MVC原创 2021-11-14 13:54:04 · 657 阅读 · 0 评论 -
瞅瞅动态代理
动态代理说大不大,说小不小,可深可浅。往深了说还是对JVM的了解程度要足够深入,时间篇幅有限,本文专注于回答如下问题,不作更深入的探讨。JDK和Cglib动态代理,分别怎么使用JDK动态代理的原理Cglib动态代理的原理为什么JDK动态代理一定要实现接口,而Cglib就不用?JDK和Cglib,本质上有什么区别?JDK动态代理使用一个简单的场景一个Service接口,拥有sayHello()方法一个ServiceImpl实现类,实现Service创建一个ServiceImpl的代原创 2021-11-03 15:40:54 · 125 阅读 · 0 评论 -
我不会Java反射
我会写Java反射,我知道反射是用来获取、改变程序运行时状态的方式,通过反射API我们能够获取类对象、类的方法、成员变量、注解等。我不会写Java反射,我不知道Type和Class有啥关系,ParameteredType、TypeVariable呢?我会Java反射吗?不,我不会。反射是什么?反射是什么,镜子里看自己。往小了说,就是Java提供的一组能够在运行时查看和修改对象信息的API;往大了说,从计算机专业来看,是编程语言提供的运行时动态更新自身状态的能力,Java的反射只是其中的一种。Go、C原创 2021-11-01 17:26:29 · 194 阅读 · 0 评论 -
序列化探索之六 - Protobuf
序列化探索之ProtobufProtobuf是谷歌提出的一种高压缩比的序列化格式,二进制,不可读,语言无关,平台无关。拥有自己的语法规则,压缩编码算法,并提供主流语言的API生成器(即Protobuf编译器),其序列化结果很小,能够有效节省带宽。掌握Protobuf,需要比较了解三个方面,其中,如果只是单纯滴使用,前两个方面即可。proto语法规则,即proto文件的语法规则具体语言的API生成及使用规则,即通过proto文件生成对应语言的代码序列化和反序列化算法语法截止目前,proto有原创 2021-11-01 17:25:38 · 1915 阅读 · 0 评论 -
序列化探索之五 - Gson
Gson是一个相对简单的库,没有那么多功能,从设计上也并不想让别人去扩展它,它只想安安静静地做一个Json序列化库,简单而实用。简单说Gson提供两种方式创建Gson实例new Gson():快速创建,默认配置,快速使用new GsonBuilder().setxxxxx().create():完整方式创建,支持一些自定义化的配置Gson突出一个简单,API如此,功能更是如此,大致列一下其支持的功能基于field的序列化与反序列化:基本特性支持自定义属性名:@SerializedName原创 2021-11-01 17:25:01 · 353 阅读 · 0 评论 -
序列化探索之四 - Fastjson
开局一吐槽,Fastjson的文档,比Jackson还差。Jackson只是位置不明确,如果安下心来看看,还是能够理清楚的。而Fastjson是位置不明确,如果安下心来看看,还会发现,它的文档零零散散,中英文混杂,找不准主线在哪儿。我记得知乎上有个问题,fastjson这么快老外为啥还是热衷 jackson?,就这文档,让老外用个啥。不过看还是要看的,毕竟它是目前主流序列化框架之一。老样子,我们还是从基本使用方法和原理分析两部分着手。能力Fastjson仅仅针对json,尚不支持其它任何格式,也没有看原创 2021-11-01 17:24:27 · 1787 阅读 · 0 评论 -
序列化探索之三 - Jackson
写这篇文章时,我一度陷入了纠结与不安,再次体会到了聚焦的重要性。Jackson看似简单,实则功能强大,这两天有些迷失,不知道要看些什么,要写些什么。但路得一步一步走,饭得一口一口吃,纵使它可供探索的点繁如星辰,我也得将焦点拉回,否则就叫失控。至于其它的点,以后再说。因此,本文将聚焦如下几点Jackson的能力基本原理module工作原理基本组成Jackson文档怎么看,是一个问题。如果初次接触Jackson,看主项目的介绍半个小时,多半还是云里雾里,我认为这是Jackson文档做的很不好的一点原创 2021-11-01 17:23:53 · 1510 阅读 · 0 评论 -
序列化探索之二 - Kotlin
文章不长,但代码演示居多,可选择性阅读Kotlin以扩展包的形式提供了序列化能力,使得能够以“Kotlin方式”进行序列化。Kotlin设计目标,是提供一个序列化抽象,具体格式实现可用Json、CBOR、Protobuf、Properties、Yaml等进行替换。但就目前的进度,仅提供了对Json的稳定支持。其它格式都处于试验阶段。因此,我们看Kotlin的序列化,主要看的就是数据对象与Json之间的序列化和反序列化。能力展示场景假设:需要序列化一个数据类,包含五个字段resourceId:.原创 2021-11-01 17:22:58 · 4096 阅读 · 0 评论 -
序列化探索之一 - Java
序列化和反序列化,渗透在日常开发的方方面面。所谓的序列化,就是将数据转换为能够在网络上传输、在数据库中存储、在文件中持久化的格式,这类格式很多,可以是字节流(如Java自带的序列化机制)、可以是JSON(系统之间传输用的较多)、可以是Protocol Buffers(压缩率高,GRPC有用)。反序列化,即序列化的反过程。序列化这件事,不同的语言、库,提供了不同的使用方法,哪怕是对同一种序列化格式的支持也有差别。因此,深入了解常用的序列化技术,很有必要。不要再去记使用方法了,我们来看原理吧。序列化探索思原创 2021-10-26 16:16:11 · 665 阅读 · 0 评论 -
设计模式 - 理论
这是系列文章设计模式 - 理论(本文)设计模式 - JDK设计模式 - Spring避免陷阱以前也学习过设计模式,而且不止一次,都以失败告终。究其原因:一是教材选用不对——《大话设计模式》,虽然这本书豆瓣评分8.3,但显然不适合我。讲的太啰嗦,我会讨厌弱智似的故事情节:什么大鸟小鸟老鸟、王二狗林蛋大,读者都是技术人员,作者却还是用小学生作为的语气讲故事,亦或是,难道大家真的都习惯了这种口吻接受知识?二来,技术书籍也好,网络文章也好,好像都是一个模子刻出来的,上来就是UML图、代码实现,.原创 2021-10-26 16:14:46 · 116 阅读 · 0 评论 -
理解UUID们
UUID,Universal Unique Identifier,全局唯一标识符。也叫做GUID,Global Unique Identifier。概念都了解,全局唯一嘛,但怎么实现的?多大概率重复?JDK的UUID和PostgreSQL的UUID一样吗?带着这些问题,我们从RFC,到JDK源码、PG手册,一点点看。本文包含以下内容:UUID实现原理自己实现一个UUIDJDK的实现方式PG的实现方式其它全局唯一ID实现原理老样子,要想了解一项基础技术,最好的方式是阅读一手资料。于UUI原创 2021-10-26 16:14:02 · 919 阅读 · 0 评论 -
聊聊Java中的缓存
本文,我们主要聊一下Java中缓存的使用,几个点Java对缓存的抽象——JSR107Spring对缓存的抽象——Spring CacheRedis如何集成到Spring中——作为Spring Cache的实现、直接使用RedisCache、使用RedisTemplate先说点啥缓存嘛,都知道是咋回事。常见的缓存如Memcached、Redis、Caffine等,各自也有对应的API。使用它们,直接操作API即可。当然,本文并非讨论各种缓存的API的用法,而是在Java中使用缓存的标准方法。.原创 2021-10-26 16:11:34 · 1732 阅读 · 0 评论 -
聊聊HTTP2
花了两天时间读完HTTP2的RFC,揭开HTTP2的神秘面纱,驱散心中迷雾,它比HTTP1.1,到底改变了什么。这是一篇什么样的文章这是一篇化繁为简的文章,只pick HTTP2中最为关键的部分,忽略细节实现部分。毕竟,每个人读一个文档的目的是不一样的。像我只是想从原理上理解,以便之后使用时能够更加顺畅;而如果是为了实现一个支持HTTP2的库,则需要抠细节,当然花费的时间肯定也不一样,那会是一遍一遍又一遍。同时我也受够了网上花花绿绿的文章,它们,十之八九,乃基于数篇至数百篇咀嚼过的N手知识,稀碎拼.原创 2021-10-26 16:10:50 · 547 阅读 · 0 评论 -
聊聊WebSocket
本文主要包含三部分WebSocket协议、STOMP协议、SockJS协议三部分的理论介绍使用Spring实现一个简单的消息推送服务使用Postman调试STOMP服务WebSocket我们大概都知道是个啥东西,原理上挺简单,使用起来却没那么容易。因为我们会发现,无论是Spring的WebSocket部分的手册,还是网络上的一大票文章,无不涉及到三个关键词——WebSocket、SockJS、STOMP。以至于我们想找一篇介绍只使用WebSocket构建服务的文章都十分困难。究其原因,我想大.原创 2021-10-26 16:10:07 · 2257 阅读 · 0 评论 -
时区怎么说
PostgreSQ中,timstamp是不带时区的类型,timestamp with zone是带时区的类型;函数CURRENT_TIMESTAMP得到的是timestamp with zone的当前时间;函数LOCALTIMESTAMP得到的是timestamp类型的时间。那么你知道,将CURRENT_TIMESTAMP赋值给一个timstamp类型的字段会发生什么吗?时区?偏移量?在搞清楚数据库和代码中的时区表达之前,必须掌握好基础知识。你能分清GMT、UTC、夏令时、时区等概念吗?.原创 2021-10-26 16:09:26 · 466 阅读 · 0 评论 -
Spring Webflux初探
说明:文章中代码参考使用方式即可,请忽略其代表的逻辑部分为何想要用Spring Webflux?《每记》是一款新产品。一开始想用webflux,为什么呢?这里给出自己的几点理由Spring生态加持,想必会很好用一直只闻其声不见其人,很想用用原计划中的vertx-spring项目,想要做成的结果,和webflux很像;因此希望从webflux中找到一些发现《每记》技术构成《每记》的主要业务逻辑都在客户端,后端只需要负责用户接口和数据备份。需要用到的技术只有两个grpc —— 用于gr.原创 2021-10-26 16:08:20 · 1432 阅读 · 0 评论 -
Vertx源码解析 - Web(上)
我们在前面的文章分析了Vertx核心单机部分的源码。今天轮到Vert.x-Web,由于Web的内容比较多,因此分为上下两部分。上:分析Vert.x-Web核心类及其主要能力。下:分析HttpServer的线程调度以及Web OpenAPI的工作原理一个基本的VertxWeb代码片段如下:fun main() { val vertx = Vertx.vertx() val router = Router.router(vertx) router.get("/hello")原创 2020-11-01 22:36:07 · 1016 阅读 · 0 评论 -
使用JSON Schema验证API响应
API的响应需要约束目前我们开发Web API的方式是通过定义Open API描述文件来定义请求约束。约束能够保证所有请求参数按照正确的格式和必要性传输,从而规范化输入。这保护了服务端内部的安全——输入约束不变的情况下,输入的值总是合法可期的。尽管Open API也提供了对Response Body的定义,允许用户描述响应的消息格式,但由于其不具有强制性——语法上可以不写,写了也不与实际返回内容有深入结合,因此无法验证真实API的响应是否符合预期,这也是从一开始不愿写响应体的原因。而关于验证API响应原创 2020-10-03 11:13:51 · 1358 阅读 · 0 评论 -
Vert.x源码解析 - Core
希望通过本文的解析,让读者了解Vertx的关键部分的实现原理。对诸如如下问题有一个具象的认识。Vertx实例的作用?一个应用是否只对应一个Vertx实例?Verticle是一个怎样的存在?本地模式下消息是如何在EventBus上传输和响应的?EventBus和EventLoop是如何关联起来的?概述Vert.x是一个事件驱动,基于Netty库构建的高性能应用程序框架。实现了所谓的Multi-Reactor模型,能够充分利用多核CPU实现以事件循环为基础的基本编程模型。同时在此基础上构建了.原创 2020-10-03 11:11:58 · 2098 阅读 · 0 评论 -
随笔 - 消息队列客户端从服务端获取消息时的原理
同事:阿里云MNS获取消息的API使用起来不够方便,需要不断手动长轮询,看起来有点原始。我:em。。。那其它消息队列使用什么方式?难道不是长轮询?在使用阿里云MNS(Message Notification Service)服务时,意识到其从服务端获取消息的方式是手动长轮询。写代码时可能会用到while-true看似危险的控制结构,而查看手册这也是官方推荐的使用方式。于是想找找其它消息队列拉取消息的原理。长轮询在此之前,我们首先做一些基础知识准备——什么是长轮询?而要回答这个问题之前,我们需要.原创 2020-08-15 17:44:08 · 673 阅读 · 0 评论 -
PostgreSQL - 一文看懂explain
explain是SQL优化的前提。但explain的结果,无论是官方手册,还是别人写的博客,看完后点头如捣蒜,但往往看到自己SQL的执行计划时,并不很确定要优化的点在哪里。很大一部分原因是不知道各计划节点的具体含义,更确切地说,是不明白SQL执行的原理。比如,我们并不能很好地回答以下问题index scan、index only scan、bitmap index scan 有啥区别?为什么明明有建立索引,但PG就是不用呢?执行计划中有子查询就一定不好吗?hash join、merge join.原创 2020-08-01 12:56:27 · 6667 阅读 · 5 评论 -
随笔 - 为什么我们使用PostgreSQL而不用M有SQL
与MySQL相比,有何优势SQL标准的null判断用is null,而不是=null。PG可以设置transform_null_equals把=null翻译成is nullMySQL显示emojji时,需要将字符集设置为utf8mb4。而PG就不用在MySQL中,对Unicode的支持,主要又如下几种字符集utf8mb4utf8mb3utf8ucs2utf16utf16leutf32这里我们只关心前三个,其中utf8mb4表示使用1-4字节来描述一个Unicode字符;ut原创 2020-07-17 00:32:18 · 1558 阅读 · 0 评论