• 数据库索引技术之LSM树

    上次我们分享了采用哈希索引实现的存储引擎,它总是将写操作不断追加到数据文件,就跟写日志一样。这种日志结构式的存储引擎,数据记录顺序由写入时间决定,同一键的旧记录由新记录取代。

    SSTable

    由于数据在写入时,自动切分成一个个文件。数据库需要在后台对文件进行合并,以减少文件数,进而加快查询。如果待合并文件里的数据是有序的,我们就可以采用归并排序算法来提高合并效率。

    虽然这看起来会违背顺序写的原则,但也有办法解决,我们稍后介绍。

    现在,我们将数据文件格式改成这样:①文件中的所有记录,按照 key )来排序;②排序保证了每个键只在文件中出现一次,不会有重复的旧记录。姑且将这种格式叫做 排序字符串表sorted string table )简称 SSTable

    阅读全文
  • 数据库索引技术之哈希索引

    我们介绍过一个用几行 Shell 代码实现的简陋数据库,它的插入性能很好,但查询性能很差。

    我们都知道,想要提升数据库的查询速度,索引必不可少 。那么,索引的底层结构都是怎样的呢?它们又是如何工作的呢?

    实际上,数据库索引技术因底层数据结构不同,可以分为好几种:

    • 哈希索引hash index
    • LSM树log structured merge tree
    • B树b-tree

    其中,哈希索引的结构最为简单,但也很常用。今天我们就先将它一举拿下!

    哈希索引结构

    键值对存储引擎其实跟编程语言中的 字典dictionary )类型很像,而字典底层通常是用 哈希表hash table )实现的。既然哈希表可以用来索引内存中的数据,应该也可以用来索引磁盘数据吧?

    阅读全文
  • 仅用几行代码就撸了个数据库!

    最近重读《数据密集型应用系统设计》这本书,看到第三章《数据存储与检索》,主要讲数据库内部的索引技术。

    从本质上讲,数据库主要是做两件事情:

    1. 当你给它数据时,它帮你保存数据(存储);
    2. 当你查询数据时,它帮你取回数据(检索);

    这两件事情看似简单,背后却暗含玄机。那么,数据库内部到底是如何存储数据的呢?又是如何检索数据的呢?

    你可能会有这样的疑问:我作为一个开发人员,为什么需要知道数据库内部是怎么工作的呢?

    阅读全文
  • 程序员首先要学会偷懒

    公司项目基本都用 gitlab-ci 实现自动集成部署,代码提交后自动触发 代码编译容器构建K8S部署

    最近将 gitlab-ci 权限开放给开发同学,自主将代码部署上测试环境,以便快速验证新功能。我们约定好通过 标签tag )来触发部署,只要推送了格式形如 cicd-x-nnn-MMddHHmm 的标签,就会触发自动部署。其中, nnn 代表开发者姓名拼音首字母,其后跟着日期时间。

    如果我想部署当前的代码 提交点commit ),我只需按照约定打一个部署标签,然后推送到服务器:

    1
    2
    
    git tag cicd-x-cyf-07171430
    git push origin cicd-x-cyf-07171430
    

    很方便不是?

    但可能是我太懒了,还是觉得远远不够。首先,我感受到记忆标签格式的负担,记不住就得查;其次,我得大致看下时间,然后还得手工输入,这绝对不能忍……

    阅读全文
  • tabulate

    用过 MySQL 的童鞋一定对那个非常好看的字符表格印象深刻吧!

    Python 中,使用 tabulate 库,可轻松实现一模一样的字符表格。

    快速上手

    废话不多说,先来看看效果:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
        >>> from tabulate import tabulate
    
        >>> table_header = ['Name', 'Chinese', 'Math', 'English']
        >>> table_data = [
        ...     ('Tom', '90', '80', '85'),
        ...     ('Jim', '70', '90', '80'),
        ...     ('Lucy', '90', '70', '90'),
        ... ]
    
        >>> print(tabulate(table_data, headers=table_header, tablefmt='grid'))
        +--------+-----------+--------+-----------+
        | Name   |   Chinese |   Math |   English |
        +========+===========+========+===========+
        | Tom    |        90 |     80 |        85 |
        +--------+-----------+--------+-----------+
        | Jim    |        70 |     90 |        80 |
        +--------+-----------+--------+-----------+
        | Lucy   |        90 |     70 |        90 |
        +--------+-----------+--------+-----------+
    
    阅读全文
  • 浅谈对称加密与非对称加密

    作为信息安全领域的基石,数据加密算法你或多或少应该用过。可你知道数据加密分成 对称加密 ( symmetric encryption ) 和 非对称加密 ( asymmetric encryption ) 两种吗?对称加密与非对称加密有什么区别?各自适用于什么场景?

    对称加密

    在对称加密中,我们需要维护一个 密钥 ( secret key )。数据加密者根据加密算法用 密钥明文 进行加密,得到不可读懂的 密文 。数据解密者根据加密算法,用同样的 密钥 对密文进行解密,得到原来的明文。

    阅读全文
  • 一文说清文本编码那些事

    一直以来,编码问题像幽灵一般,不少开发人员都受过它的困扰。

    试想你请求一个数据,却得到一堆乱码,丈二和尚摸不着头脑。有同事质疑你的数据是乱码,虽然你很确定传了 UTF-8 ,却也无法自证清白,更别说帮同事 debug 了。

    有时,靠着百度和一手瞎调的手艺,乱码也能解决。尽管如此,还是很羡慕那些骨灰级程序员。为什么他们每次都能犀利地指出问题,并快速修复呢?原因在于,他们早就把编码问题背后的各种来龙去脉搞清楚了。

    本文从 ASCII 码说起,带你扒一扒编码背后那些事。相信搞清编码的原理后,你将不再畏惧任何编码问题。

    阅读全文
  • 前端工程师眼中的 Docker

    笔者最近在整理 Node.js 操作各数据库的方法,却不料遇到一个很棘手的问题:很多数据库,都需要同时下载 Server 端和 Client 端,并进行相应的配置,着实是麻烦。那有没有方法可以省去这些步骤呢?

    答案肯定是有的,这就是今天要介绍的主题 —— Docker

    Docker 概述

    Docker 是什么呢?

    通俗地讲,当我们部署代码到生产服务器时,第一次都需要先进行环境配置,比如你有 100 台机器,你就要手动配置 100 台服务器的环境,这样难保不会出错。 Docker 则将软件服务制作成标准化的模板,也就是镜像,从而实现快捷部署。每次部署新机器,只需要拉取相关镜像,即可一键完成。

    阅读全文
  • 用 Python 读写 Excel 表格

    Python 可以读写 Excel 表格吗?

    当然可以。 Python 下有很多类库可以做到, openpyxl 就是其中的佼佼者。

    openpyxl 的设计非常漂亮 ,你一定会喜欢它!不信请往下看:

    工作簿

    开始 openpyxl 前,无需提前建好工作簿( Workbook )。 只需导入 Workbook 类,便可在内存中创建新工作簿并开始操作:

    1
    2
    
    >>> from openpyxl import Workbook
    >>> wb = Workbook()
    
    阅读全文
  • Linux内核参数管理

    Linux 内核有很多可以定制化的参数 —— 内核参数 ( kernel parameters ), 斟酌设置内核参数对 系统调优 意义重大。 内核参数 涵盖内核的方方面面,包括 网络 ( net )、 文件系统 ( fs )等等。

    本文以 fs.file-max 参数为例,介绍设置内核参数的几种方式。

    procfs

    Linux 内核通过 procfs 伪文件系统暴露 内核参数 的访问接口, 通过 procfs 接口,用户可 设置 或者 查看 指定内核参数。 内核参数位于 /proc/sys 目录下,以 fs.file-max 参数为例,路径为 /proc/sys/fs/file-max

    查看参数只需读取对应文件内容:

    1
    2
    
    $ cat /proc/sys/fs/file-max
    94524
    
    阅读全文