首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Postgres 源码学习 2—Postgres VFD 机制

操作系统文件 数据库本质其实就是用来存储数据,所以免不了和文件系统、存储进行交互,万丈高楼平地起,存储一般是一个数据库最底层,Postgres 在存储文件管理方面也有很多设计与抽象。...Postgres VFD 作用 Postgres 数据库在运行过程当中,可能会打开非常多文件,比如数据表对应文件,元数据表文件,以及一些在 SQL 运行时打开临时文件,例如排序、哈希表所需文件...所以有非常大概率超过单个进程打开文件数量限制,为了解决这个问题,Postgres 设计了 VFD(虚拟文件描述符)机制,主要是将实际操作系统文件描述符维护到一个 LRU 缓存,通过切换打开方式...VFD 基本工作方式 Postgres 主要通过一个进程私有的数组来维护 VFD,名为 VfdCache。...在打开文件时候,会尝试关闭最久未使用文件,将位置留给最新打开文件。 通过这种方式,Postgres 可以打开远超过系统和进程限制文件数量,是一个非常精妙设计。

7610

golang实现mysql where in查询

最近工作遇到一个小问题,即如何使用原生sql查询where in语句,因为之前使用gorm习惯了,gorm已经封装好了,突然写原生反而有点不熟悉,同时还要考虑到性能和代码是否繁琐,所以写这个笔记记录一下当时几种解决方法...场景 我传入in范围是一个数组,里面值类型为int64型,例如如下: idSlice := []int{1, 2, 3, 4, 5, 6, 7} 正常sql语句是这样写: select * from...,这在gorm可以是因为已经封装好了,所以经过多次试错和思考之后,反应过来,其实in范围要写成字符串形式,毕竟是把整条sql当成原生查询语句,所以不能出现变量之类东西, idSlice为数组类型...这样对整体性能就有影响了。...strings.Joins函数,只用了一个for循环直接拼接,所以整体性能是更优

2.1K20

Golangdefer

defer func() { print("打印") }() defer print("打印后") panic("触发异常") defer print(666) //IDE...函数return value 不是原子操作, 在编译器实际会被分解为两部分:返回值赋值 和 return 。而defer刚好被插入到末尾return前执行(即defer介于二者之间)。...,因此defer能够改变返回值) defer不影响返回值,除非是map、slice和chan这三种引用类型,或者返回值定义了变量名 ---- 参考: Golang研学:如何掌握并用好defer[2]--...存疑("引用传递"那里明显错误) GolangDefer必掌握7知识点 参考资料 [1] Go面试题答案与解析: https://yushuangqi.com/blog/2017/golang-mian-shi-ti-da-an-yujie-xi.html...[2] Golang研学:如何掌握并用好defer: https://segmentfault.com/a/1190000019063371#comment-area

9220

Golang数组

数组包含每个数据被称为数组元素(element),这种类型可以是任意原始类型,比如 int、string 等,也可以是用户自定义类型。一个数组包含元素个数被称为数组长度。...在 Golang 数组是一个长度固定数据类型,数组长度是类型一部分,也就是说 [5]int 和 [10]int 是两个不同类型。...Golang数组另一个特点是占用内存连续性,也就是说数组元素是被分配到连续内存地址,因而索引数组元素速度非常快。...{1, 1}, } modifyArray2(b) //在 modify 修改是 b 副本 x fmt.Println(b) //[[1 1] [1 1] [1 1]]...=” 操作符,因为内存总是被初始化过。 [n]T 表示指针数组,[n]T 表示数组指针。 6、多维数组 Go 语言是支持多维数组,我们这里以二维数组为例(数组又嵌套数组)。

10210

golang反射

golang实现反射是通过reflect包来实现, 让原本是静态类型go具备了很多动态类型语言特征。reflect包有两个数据类型,一个是Type,一个是Value。...接着我们开始我们使用Golang反射,通常在使用到Golang反射时候会有三种定律: 反射定律一:反射可以将“接口类型变量”转换为“反射类型对象”....如果反射对象包含值是原始值,那么可以通过反射对象修改原始值,如果反射对象包含值不是原始值(反射对象包含是副本值或指向原始值地址),那么该反射对象是不可以修改。...反射性能测试 Golang提供了一个testing包,使得单元测试、性能测试尤为简单。...我们可以使用golang testing来做一下reflect最简单性能测试。 Type:Type类型用来表示一个go类型。 不是所有go类型Type值都能使用所有方法。

1.1K30

迁移PostgresSequence(序列)

--- 在结构导出时,序列(Sequence)的当前值无法通过pg_dump导出,只能通过事后查询该序列的当前值并写入目标库。...查询序列的当前值,有两种办法: select currval('seqname') 仅获得当前会话最后一次生成值。...实际执行,必须先执行nextval后才能执行currval,这样会修改源数据库,不可取 select last_value from seqname 获得所有会话中最后一次生成值 修改目标库序列的当前值...select setval('seqname', val) 修改序列当前值(原子操作) alter sequence seqname restart with val 修改序列当前值(阻塞性事务,会阻塞其他会话nextval...操作) 建议采用方案 既可以干净地获取源值,又能低成本地设置到目标。

2.7K44

从 Notion 分片 Postgres 吸取教训(Notion 工程团队)

到 2020 年年中,很明显,产品使用将超过我们值得信赖 Postgres 单体能力,后者在五年和四个数量级增长尽职尽责地为我们服务。...查询性能和维护过程通常在表达到最大硬件绑定大小之前就开始下降;我们停止 Postgres auto-vacuum 就是这种软限制一个例子。...应用级分片 我们决定实现我们自己分区方案并从应用程序逻辑路由查询,这种方法称为应用程序级分片。...在我们最初研究,我们还考虑了打包分片/集群解决方案,例如用于 Postgres Citus 或用于 MySQL Vitess。...“暗”读:在迁移读查询之前,我们添加了一个标志来从新旧数据库获取数据(称为暗读)。我们比较了这些记录并丢弃了分片副本,记录了过程差异。引入暗读增加了 API 延迟,但提供了无缝切换信心。

1.2K20

Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)

从任何节点查询分布式 Postgres 表 升级到 Citus 11 等等,我分片在哪里?...Citus 11.0 中最大增强是,您现在可以始终从集群任何节点运行分布式查询,因为 schema 和 metadata 是自动同步。...从任何节点查询分布式 Postgres 表 Citus 11 还带有一个重要新功能:自动 schema 和 metadata 同步。...无需更改应用程序: 您应用程序可以继续将您 Postgres 查询路由到 Citus 协调器,就像您一直做那样,并让 Citus 确定如何分发查询。...现在最苛刻数据密集型应用程序可以选择从任何节点进行查询: 如果您愿意并且需要,您可以在 Citus 工作节点之间对 Postgres 查询进行负载均衡。

90920

Golang函数使用

函数 函数调用:函数调用时需要传递函数定义要求参数,并根据需要接收返回值。 匿名函数:匿名函数没有函数名,可以直接定义并调用。常用于函数内部作为闭包使用。...表示可变参数,可变参数必须放在函数参数列表最后面,并且只能有一个。 函数作为参数:可以将函数作为参数传递给其他函数,这种函数称为高阶函数。常用于函数式编程。...函数变量作用域 函数声明变量作用域是该函数内部,在函数外部是不可见。如果函数中使用了全局变量,则在函数可以直接使用。 函数递归调用 函数可以递归调用,递归调用必须有一个终止条件。...当函数返回时,栈 defer 语句被逆序执行,最后输出 "deferred"。 除了可以用来清理资源,defer 语句还可以用来记录函数执行时间。...} 在这个例子,timeTrack 函数用来记录函数执行时间。

13230

ES查询

一、查询语句形式 1.叶子语句 2.复合语句(一条复合语句可以是多条叶子语句和多个复合语句组成) 二、查询和过滤区别 1.过滤是将查询设置为是否匹配(只有是和否两种情况),查询会缓存 2.查询是判断文档是否匹配同时判断文档匹配程度...(_score字段),查询不缓存 三、查询 1.match_all查询简单匹配所有文档 { “match_all”: {}} 2.match匹配指定字段(可能是精确查询也可能是全文查询)...” ],        “query”: “build too” } 4.range查询找出落在指定区间内数字或者时间 {     “range”: {         “age”: {...}} 7.exists查询文档包含指定字段有值 {     “exists”:   {         “field”:    “create_time”     } } 备注:Missing...        “filter”: {           “match”: {“age”:26}         }     }   } } b)使用constant_score可以取代只有filterbool

4.6K102

GolangRPC(转载)

RPC 简介 远程过程调用(Remote Procedure Call,缩写为 RPC) 可以将一些比较通用场景抽象成微服务,然后供其他系统远程调用 RPC 可以基于HTTP协议 也可以基于TCP...协议,基于HTTP协议RPC像是我们访问网页一样(GET/POST/PUT/DELETE/UPDATE),大部分RPC都是基于TPC协议(因为基于传输层,效率稍高一些) 基于TCP RPC 工作过程...客户端对请求对象序列化 客户端连接服务端,并将序列化对象通过socket 传输给服务端,并等待接收服务端响应 服务端收到请求对象后将其反序列化还原客户端对象 服务端从请求对象获取到请求参数...,然后执行对应方法,得到返回结果 服务端将其结果序列化并传给客户端,客户端得到响应结果对象后将其反序列化,得到响应结果 GolangRPC 注:例子参考 golang实现RPC...几种方式 net/rpc库 注:没办法在其他语言中调用上面例子实现RPC方法 服务端 rpc_server.go package main import ( "errors"

55820
领券