Posts in 2017
  • Go数据库教程:database/sql

    2017年08月24日 in PG 生态

    Go使用SQL与类SQL数据库的惯例是通过标准库database/sql。这是一个对关系型数据库的通用抽象,它提供了标准的、轻量的、面向行的接口。不过database/sql的包文档只讲它做了什么,却对如何使用只字未提。快速指南远比堆砌事实有用,本文讲述了database/sql的使用方法及其注意事项。 1. 顶层抽象 在Go中访问数据库需要用到sql.DB接口:它可以创建语句(statement)和事务(transaction),执行查询,获取结果。 sql.DB并不是数据库连接,也并未在概念 …

    Read more

  • GO与PG实现缓存同步

    2017年08月03日 in PG 开发

    Parallel与Hierarchy是架构设计的两大法宝,缓存是Hierarchy在IO领域的体现。单线程场景下缓存机制的实现可以简单到不可思议,但很难想象成熟的应用会只有一个实例。在使用缓存的同时引入并发,就不得不考虑一个问题:如何保证每个实例的缓存与底层数据副本的数据一致性(和实时性)。 PostgreSQL在版本9引入了流式复制,在版本10引入了逻辑复制,但这些都是针对PostgreSQL数据库而言的。如果希望PostgreSQL中某张表的部分数据与应用内存中的状态保持一致,我们还是需要自 …

    Read more

  • 用触发器审计数据变化

    2017年06月09日 in PG 开发

    有时候,我们希望记录一些重要的元数据变更,以便事后审计之用。 PostgreSQL的触发器就可以很方便地自动解决这一需求。 -- 创建一个审计专用schema,并废除所有非superuser的权限。 DROP SCHEMA IF EXISTS audit CASCADE; CREATE SCHEMA IF NOT EXISTS audit; REVOKE CREATE ON SCHEMA audit FROM PUBLIC; -- 审计表 CREATE TABLE …

    Read more

  • SQL实现ItemCF推荐系统

    2017年04月05日 in PG 开发

    推荐系统大家都熟悉,猜你喜欢,淘宝个性化什么的,前年双十一搞了个大新闻,还拿了CEO特别贡献奖。 今天就来说说怎么用PostgreSQL 5分钟实现一个最简单ItemCF推荐系统,以推荐系统最喜闻乐见的movielens数据集为例。 原理 ItemCF的原理可以看项亮的《推荐系统实战》,不过还是稍微提一下吧,了解的直接跳过就好。 Item CF,全称Item Collaboration Filter,即基于物品的协同过滤,是目前业界应用最多的推荐算法。ItemCF不需要物品与用户的标签、属性,只 …

    Read more

Posts in 2016
  • UUID性质原理与应用

    2016年11月06日 in PG 开发

    最近一个项目需要生成业务流水号,需求如下: ID必须是分布式生成的,不能依赖中心节点分配并保证全局唯一。 ID必须包含时间戳并尽量依时序递增。(方便阅读,提高索引效率) ID尽量散列。(分片,与HBase日志存储需要) 在造轮子之前,首先要看一下有没有现成的解决方案。 Serial 传统实践上业务流水号经常通过数据库自增序列或者发码服务来实现。 MySQL的Auto Increment,Postgres的Serial,或者Redis+lua写个小发码服务都是方便快捷的解决方案。这种方案可以保证全 …

    Read more

  • PostgreSQL MongoFDW安装部署

    2016年05月28日 in PG 管理

    更新:最近MongoFDW已经由Cybertech接手维护,也许没有这么不堪了。 最近有业务要求通过PostgreSQL FDW去访问MongoDB。开始我觉得这是个很轻松的任务。但接下来的事真是让人恶心的吐了。MongoDB FDW编译起来真是要人命:混乱的依赖,临时下载和Hotpatch,错误的编译参数,以及最过分的是错误的文档。总算,我在生产环境(Linux RHEL7u2)和开发环境(Mac OS X 10.11.5)都编译成功了。赶紧记录下来,省的下次蛋疼。 环境概述 理论上编译这套 …

    Read more

Posts in 0001
  • WAL与检查点概述

    0001年01月01日 in PG 内核

    数据库需要保证两个基本的特性:可靠性与可用性。通俗来讲: 可靠性就是:出了故障,既不会丢数据,也不会弄脏数据。 可用性就是:保证足够的读写性能,出了故障后,能够快速恢复服务。 朴素的数据库实现有两个选项:在内存中修改数据页,或者将事物变更直接写入磁盘。但这产生了一个两难困境: 内存支持随机读写,因此在性能上表现强悍,然而作为易失性存储,一旦故障就会丢数据。 硬盘恰恰相反,随机读写表现糟糕,但在故障时数据要可靠的多。 内存可用性强可靠性差,硬盘可用性差但可靠性强,如何解决这一对矛盾,让内存与硬盘取 …

    Read more