作者: haluminix

  • 数据编码(序列化)的演化

    数据编码格式

    数据一般有两种表示方式:

    1、在内存中,数据保存在对象、结构体、列表等结构中,这些数据结构针对CPU的高效访问和操作进行了优化(通常都使用了指针)

    2、当将数据写入文件或者通过网络发送是,必须将其编码为某种子包含的字节序列,如JSON文档,这种就不在使用特定的指针。

    这两种表示形式之间的转化为序列化和反序列化。

    简单来说序列化、反序列化的意义就是从各种系统当中将结构化数据转化成一种便于传输的形式的数据,这种数据一般是“规范化“”的,无论是什么系统,什么语言,希望转化成的这种模式数据是一致的,并且能将这种数据再度转化成系统中的结构化数据。

    比较有名的序列库

    语言javarubypython
    Serializable\KryoMarashalpickle

    序列化的一些问题:

    • 序列化与其编程语言一般绑定在一起,难以解耦
    • 反序列化需要能实例化任意的类,这经常会导致一些安全问题,如果反序列化过程中能够实例化任意的类,就可以远程执行一些危险代码
    • 这些序列化工具的版本兼容性问题
    • Java内置的反序列化工具性能较差

    JSONvsXML

    JSONXMLCSV
    流行原因web浏览器内置支持,JavaScript的一个子集与语言无关
    对于数字编码可以区分数字和数字字符串,但是不区分整数和浮点数,并且不指定精度无法区分数字和数字字符串无法区分数字和数字字符串
    对于模式(特定数据格式的支持)支持支持不支持,需要定义每一行每一列的具体含义

    在上述模式编码的基础上,还衍生出占用空间较少、解析速度更快的二进制编码,二进制编码并非取代前者,而是为了解决一些性能上瓶颈衍生出的一些方案。

    ​指标​​JSON/XML​​二进制编码(如MessagePack,BJSON,Thift,Protobuf等)​
    ​空间占用​高(含冗余字符)低(仅必要数据)
    ​解析速度​慢(需逐字符解析)快(直接内存映射)
    ​CPU/内存消耗​

    Thift原本是FaceBook研发的(2007左右开源)、Protocol Buffers 是Google研发的,Avro是Hadoop 的一个子项目。其原理本质上就是对于模式的预定义,这种预定义像是SQL中的DDL语句。与MessagePack等二进制编码的区别就是少了字段名,不用每一条记录重复字段名了。

    字段标签与模式演化

    对于Protobuf、Thrift 的模式兼容性方案,向前向后兼容主要靠标识字段名的一个 字段标识(filed tag) 唯一定位,如果这个字段名如果添加了新的字段到模式只需要给每个字段新加一个标识号码即可,旧版本读取到新的字段标识 会忽略。

    对于数据类型的变更,各个语言的兼容性方案各异,

    ​方案​​适用变更类型​​向前兼容性​​向后兼容性​​复杂度​
    Protobuf(新增字段)任意类型变更
    Thrift(Union类型)有限类型变更
    Avro(联合类型)任意类型变更❌(需升级Reader)
    直接类型提升(int32→64)数值范围扩展⚠️(可能截断)

    数据流模式

  • 数据密集型应用系统设计

    系统设计的衡量指标

    可靠性

    可维护性

    可扩展性

    数据库

    关系数据库&文档数据库

    关系数据库文档数据库
    不同点大表更新较慢,如增加字段,全表更新非常慢(可以考虑新增字段设为null,后续读取时更新)灵活,增加字段容易
    相同点 id外键文档引用

    索引

    适当的索引可以加快读取查询、但是每个索引都会减慢写的速度。

    简述优缺点应用
    哈希索引1、使用hashmap(或者内存表)或者hash函数记录value的字符偏移量,其实这个内存表就是索引
    2、内存表分段存储(大小不一),达到一定大小合并相同的key
    – 缺点:key的量不能过大,否则hash冲突处理麻烦。区间查询效率不高
    SSTables和LSM-Tree 1内存表key是有序的、一般为树状结构、大于阈值时写入磁盘优点:相比于哈希索引,合并key更容易、区间查询效率也更高
    缺点:查找不存在的key效率差-布隆过滤器
    Lucene\Elasticsearch\Solr 的全文索引(倒排索引)

    HBase\LevelDB RocksDB
    B-Trees21、索引分段存储,大小相同(页)4KB,某一页作为根,相比于LSM-Tree读性能好但写性能差MySQL的InoDB

    主键索引 vs 二级索引

    主键索引:通过唯一字段设置的索引,用于直接定位行(关系数据库)、文档(文档数据库)、顶点(图形数据)。InoDB如果没有指定主键,则优先指定唯一索引作为主键,再次默认生成一个隐藏字段(6Byte)作为唯一索引。 一般,工程中将id 作为主键。

    二级索引:除主键索引之外的附加索引,用于加速非主键列的查询操作,InoDB的二级索引的叶子节点存储了主键值,再利用主键索引查找对应的数据,这个操作也叫回表。

    聚集索引(Clustered Index)vs 非聚集索引

    简单来说聚集索引就是索引和数据放在一起,INnoDB B+树的主键索引是聚簇索引,他的叶子阶段存放了完整的行数据信息。他的非聚簇索引存储了数据的引用,可以引用主键,从而回表查询。在这二者之间,有一种折中的设计——覆盖索引,其索引包含了查询的所有列,不用再回表查询了。

    todo: 补全这部分

    组合索引vs多维索引

    组合索引(一般也叫级联索引)就是多个列组成的索引,这种索引受限于索引构建的顺序,只有遵从最左匹配原则才能充分的利用索引。

    多维索引:相较于组合索引,不受限于索引构建的顺序,对于索引内的查询条件同时生效,一般对于地理空间位置来说,构建这种索引非常重要,例如,查询特定经纬度范围内的地点,如果用组合索引,不能同时查询经度和维度,只能按照一定顺序依次查找。

    对于地理位置查询,方案①可以利用空间填充曲线将二维空间映射为一维数字,方案②(常用)用一些专门的空间索引,如R树索引。 这种索引还常用于 色彩(RGB值)、空间碰撞检测、多维特征向量 等领域的检索。

    全文索引 和 模糊查询

    模糊查询技术有很多实现方式,目前主流的实现方式是根据编辑距离+全文索引的方式实现,全文索引3也叫倒排索引 底层使用了 SSTable + LSM Tree 。

    内存数据库

    上述的索引结构都是为了满足磁盘的限制,为了获取良好的读写性能,需要精心安排磁盘上的数据布局。

    内存数据库,顾名思义是将数据放在内存中存储,数据丢失在一定程度上可以容忍,定期的将更改日期或者快照写入磁盘

    与直觉相反,内存数据库的性能优势并非他们不需要从磁盘读取,而是尽可能的不写磁盘数据,或者说它降低了为了适应磁盘数据格式而对内存数据重新编码的开销。此外内存数据库实现了磁盘数据库难以实现的一些数据结构模型,如Redis的跳表等。

    缩略词

    1. Sorted String Tables 、Log-Structured Merge Tree, 考虑一篇详细介绍LSM 树的文章(todo 进度 0%),本来以为这只是一个过渡的索引,美型到用途还挺广泛。 ↩︎
    2. 考虑写一篇详细介绍B-Tree的文章(todo:目前进度10%) ↩︎
    3. 考虑写一篇详细介绍全文索引以及模糊查询实现的文章(todo 进度 0%) ↩︎

  • linux常用命令

    shell 界面常用快捷键

    复制: ctrl+insert

    粘贴:shift+insert

    快速补全: Tab键

    tail命令

    系统运维中,查看日志时,最经常使用的就是 grep、cat 和 tail 三个命令。

    head 和 tail 是成对的命令:head 无法持续跟踪文件内容,也就是没有说 -f 命令。

    # 查看文件的最后 10 行内容
    tail test.txt
    
    # 从第 20 行开始,读取后面所有内容
    tail -n +20 test.txt
    
    # 读取文件最后 20 行的内容
    tail -n -20 test.txt
    
    # 输出文件的最后 100 个字节内容
    tail -c 100 test.txt
    
    # 持续查看文件的最新内容
    tail -f test.txt
    
    # 持续查看文件的最新内容,并且只看带 'Exception' 的行
    tail -f test.txt|grep 'Exception'

    命令组合

    业务场景:文件太大了,只读取一部分内容

    # 一般配合 grep 使用,先收索关键字所在的行号,然后查看附近几行的数据
    grep -n keyword test.txt
    
    # 从文件 20 行开始,读取前 10 行内容
    tail -n +20 test.txt|head -n +10

    vi命令

    基础vi命令

    开打文件:vi + 文本文件名

    跳转到文档末页:shift+G

    进入编辑模式: i

    退出编辑模式后保存:Esc 之后,再输入 :wq

    查找,在只读界面,输入

    # 向下查找
    /关键字
    # 向上查找
    ?关键字

  • docker 基础知识及命令

    docker安装

    docker 配置

    如果使用的是root用户默认方式安装的docker,docker的配置文件夹一般在,../root 下

    如,我的就在 ../root/wordpress-docker 下,里面有一个名为docker-compose.yml的文件,用 vi 命令打开以后内容是这样的。

    
    version: '3.8'
    
    services:
      db:
        image: mysql:latest
        restart: always
        container_name: mysql_db
        environment:
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wp_user
          MYSQL_PASSWORD: XXXXXXXXX  # ← 这个是 wp_user 的密码
          MYSQL_ROOT_PASSWORD: XXXXXXXX  # ← 这个是 root 用户的密码
        volumes:
          - db_data:/var/lib/mysql
    
      wordpress:
        image: wordpress:latest
        restart: always
        container_name: wordpress_app
        ports:
          - "80:80"
        environment:
          WORDPRESS_DB_HOST: db:3306
          WORDPRESS_DB_NAME: wordpress
          WORDPRESS_DB_USER: wp_user
          WORDPRESS_DB_PASSWORD: XXX  # ← 这里要和上面 wp_user 的密码保持一致
        depends_on:
          - db
    
    volumes:
      db_data:
      wp_data:
    

    docker 常用基础命令

    docker ps #列出列出所有运行中的容器​

    假设返回如下

    [root@iZ2zedsug6fxjz9ovmagwcZ ~]# docker ps
    CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS       PORTS                               NAMES
    f07e499f9cbe   wordpress:latest   "docker-entrypoint.s…"   2 weeks ago   Up 2 weeks   0.0.0.0:80->80/tcp, :::80->80/tcp   wordpress_app
    93a0a8331d08   mysql:latest       "docker-entrypoint.s…"   2 weeks ago   Up 2 weeks   3306/tcp, 33060/tcp                 mysql_db
    

    启动容器中的mysql

    docker exec -it 【替换为容器名】 mysql -uroot -p

  • 小镇青年之于“董小姐”

    背景

    最近中日友好医院肖飞医生的出轨新闻登上了社会热点1,最近舆论的矛头开始有了些许变化———逐渐从肖飞的私德和医德问题转移到了出轨对象董袭莹的身份问题。

    根据相关爆料,董袭莹的职业履历备受争议,其本科毕业于哥伦比亚大学经济学专业,具体来说,是哥大的一个独立女子学院,其实并不能算哥大,基本上就是国内富二代子女镀金刷履历的地方。董袭莹本科毕业后,申请了协和医学院的“4+4”试点项目,以非常粗糙的毕业论文拿下了医学博士学位2

    想法

    17年高考失利,我基本上已经无缘心心念的临床,当时孔老师(高中的物理老师)帮我报志愿的时候填写的都是工科计算机之类的,在志愿表提交的前一刻,我犹豫了,将前几个志愿加上了几个医学类专业,并且设置为“不调剂”,记得应该有中南的湘雅的临床。

    当然,结果可想而知,我滑档到了第四个院校——北邮,进入信通院学习。当然我并不是说北邮有多不好,因为在新疆高考的缘故,身边的同学基本上都是比我更加努力也更加优秀的人,在北邮7年,我也真的学到了很多,也逐渐明白自己很多事情沉不下心,功利心太强,不适合做研究。也正因为在北邮,找工作时,并没有太费力,相对而言找到了几个在大众眼中比较好的工作。

    思考

    在国内,明里暗里能看到很多这种通过”关系”上位(维持或者提升阶级)的案例,甚至早就心照不宣,一旦这种事情拿到明面上,就很容易引起大众的舆论的讨伐。看这些新闻的评论区也很有意思:“好工作,就像艾滋病,只能通过母婴、血液、性传播”。

    有种想法在脑海里一致萦绕不去——其实国人对这种通过关系上位的“本领”本身没有什么意见,在中国,关系也是一种能力。普通人更难以接收的是,那些特权阶级占用的资源原本是属于统治阶级垂怜于普通人的机会,然后这些特权阶级拿了资源后又当又立。

    结语

    这是我在wordpress上写的第一份博客,以后这个博客就用来当自己联系写作的工具吧,也顺便记录以下自己的心路历程。

    引用

    1. 【肖飞“术中离场40分钟”涉嫌违规,董某学术经历疑点重重】-界面新闻 2025-04-30 13:19 ↩︎
    2. 【董袭莹的博士学位论文来啦!】-大象新闻-2025-04-29 15:50 ↩︎

  • WordPress实验室

    这里对WordPress的一些特性展开研究。包括文本、图片等等格式、各种形式文件的链接展示等。

    图片

    插入一个图片