🌓

leveldb线程模型和并发控制

leveldb前台可并发读,但只能串行写。

leveldb memtable通过无锁skiplist结构 支持读写并发

leveldb的后台线程只有一个,只处理compaction这一个任务, leveldb的minor compaction和major compaction是一起处理的

阅读全文

redis(2)——网络处理、线程模型和rdb,aof持久化

redis 通过网络服务接收远程命令,进行处理,将执行结果返回。

redis的rdb和aof 都是经典的数据持久化/备份手段,rdb关注数据库的数据, aof关注数据库的操作。

阅读全文

redis(1)——数据结构

redis 是最值得学习的开源项目,

  1. 它广泛应用
  2. 它实现了单机缓存数据库,同时支持网络访问、复制、集群、订阅等高级特性
  3. redis依赖很少,数据结构、日志等基础库也是自行实现,有利于学习
  4. redis代码精悍、质量高,甚至很难找到优化点。

本文阐释redis数据结构,redis 数据结构设计的一大特点是节省内存。原因是redis作为内存数据库需要节省内存使用(连续内存的数组能减少内存碎片)。这对架构设计同样有借鉴意义,通过节省元数据内存使用来把更多元数据/索引放在内存上,可以大大提高处理的吞吐和延迟。

阅读全文

leveldb分析

leveldb 可分为五大块。db, iterator,version, memtable+log, tablefile。

leveldb 的架构图资料上有很多,可以参考网站

阅读全文

分布式存储底座

分布式存储底座包括分布式文件系统和分布式一致性KV存储。对外满足的条件 1. 提供数据可靠性,底座之上不需要担心数据损坏 2. 提供数据可用性,节点崩溃不影响数据读写 3. 集群级接口,多机节点可访问

阅读全文

编程语言(7)—编译、运行和调试

写完了代码第一件事是编译,编译失败只能根据编译器通知修改代码;编译通过了第二件事是跑UT,UT不过需要进行调试。调试包括debug和release包的调试,线上进程的运行问题有时候也需要调试,调试的主要方式是调试工具和日志(包括print大法)。为了发现问题,有时候还需要添加报警日志。

提高代码的健壮性,编译器、静态检查和格式化工具、调试、单元测试、日志等是开发必不可少的

阅读全文

编程语言(6)—文件IO和网络库

IO和网络库支持程序访问文件和网络,包括标准输入输出IO、文件IO、网络IO

阅读全文

缓存

缓存存放的是临时数据,相比主存,缓存往往速度更快,容量更小。

缓存往往是多级的,由内而外,cpu cache -> 内存 -> ssd -> hdd(单机) -> 服务器/多节点/oss/nas等

只要有缓存就会有一致性问题

阅读全文

静态变量和函数

简谈编程语言中的静态变量和函数

阅读全文

并发

并发可分成并发对象和并发协调两部分。并发对象可以是进程、线程、协程、以及多机并发。并发协调包括锁(进程锁、线程锁、协程锁、分布式锁),信号,信号量,条件变量,通信队列等。

并发编程的三个特点是原子性、有序性、可见性原子性要求写操作要么执行完要么不执行,不能中途执行一半被干扰,并发编程中需要保证所有操作都是原子的;完全要求顺序的程序无法并发,因此并发编程的特点是原子性+部分有序。可见性是针对并发读共享变量,如果并发对象之间读共享变量,就要维护共享变量的可见性,一个并发对象修改另一个并发对象可以看到。(如果只有并发写,只要考虑原子性和顺序性,不需要可见性)

阅读全文