读书笔记
《Redis设计与实现》Part02 第09章~第14章
第09章-数据库 9.1 服务器中的数据库 1 2 3 4 5 6 struct redisServer { ... redisDb *db; // 指向一个数据库数组 int dbnum; /* Total number of configured DBs */ ... }; dunum 属性的值由配置项database决定,默认为16 9.2 切换数据库 1 2 3 4 5 struct client { ... redisDb *db; // 记录client正在使用的db ... } 默认为0号数据库 可以使用select切换 9.3 数据库键空间 1 2 3 4 5 6 typedef struct redisDb { ....
《Redis设计与实现》Part03 第15章~第17章
第15章 复制 在redis中可以通过slaveof命令或者选项,让一个服务器取复制另一个服务器 旧版复制功能的实现 两个操作: 同步(sync) 命令传播(command propagate) 旧版复制功能的缺陷 初次复制 断线后重新复制 (效率低) sync是一个非常耗费资源的操作 新版复制功能的实现 使用psync,它的两种模式: 完整重同步 部分重同步 部分重同步的实现 主服务器的复制偏移量 从服务器的复制偏移量 主服务器的复制积压缓冲区 固定长度的先进先出队列,默认1MB 可以根据公式second * write_size_per_second来估算 服务器的运行id PSYNC命令的实现 复制的实现 设置主服务器的地址和端口 建立套接字连接 发送ping命令 身份验证 发送端口信息 同步 命令传播 心跳检测 在命令传播阶段,从服务器默认以每秒一次的频率,向主服务器发送命令replconf ack <replication_offset> 该命令有三个作用: 检查主从服务器的网络连接状态 辅助实现min-slave选项 min-slaves-to-write和min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令 检测命令丢失 检测到写命令丢失,则部分同步 第16章 Sentinel 由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主从服务器...
《Redis设计与实现》Part04 第18章~第24章
第18章-发布与订阅 publish subscribe,unsubscribe psubscribe,punsubscribe pubsub 18.1 频道的订阅与退订 redis将所有频道的订阅关系都保存在字典pubsub_channels中: 1 2 3 struct redisServer { dict *pubsub_channels } 键是channel的名字,值是订阅这个频道的客户端链表 18.1.1 频道的订阅 18.1.2 频道的退订 18.2 pattern的订阅与退订 redis将所有pattern的订阅存在链表pubsub_patterns中: 1 2 3 4 5 6 7 8 struct redisServer { list *pubsub_patterns; } typedef struct pubsubPattern { redisClient *client; robj *pattern; } pubsubPattern; 18.2.1 订阅pattern 18.2.2 退订pattern 18.3 发送消息 18.3.1 将消息发送给频道订阅者 18.3.2 将消息发送给模式订阅者 18.4 查看订阅信息 18.4.1 PUBSUB CHANNELS 18....
《Rust权威指南》目录索引
intro 数据目录 第01章 入门指南
《Rust权威指南》第01章 入门指南
1. 安装 1.1 rustup 使用命令行工具rustup完成对rust的下载与安装。 linux下: 1 curl https://sh.rustup.rs -sSf | sh 这个命令会自动下载与安装rust,期间需要选择安装方式(我使用了default),然后想在当前shell生效,还需执行source $HOME/.cargo/env(可以关闭当前shell,新开一个shell也行) 1.2 other rustup还用于管理不同的Rust发行版本以及附带的工具链。 2. hello world 编写main.rs如下 1 2 3 fn main(){println!("hello world");} 编译: 1 rustc main.rs 运行: 1 ./main 3. Cargo 编程语言经过几十年发展,意识到必须有一个好用的包管理器,以及一个较完美的项目构建方案。rust提供了Cargo解决这两个大问题。 使用Cargo安装第三方包、管理项目依赖、进行项目构建十分方便。 Cargo用一个Cargo.toml文件来记录依赖,并在cargo build时自动生成与维护一个cargo.lock文件 3.1 用Cargo新建一个项目: 1 cargo new project_name; 生成的项目结构如下: 1 2 3 4 5 project_name/ src/ main....
《The Go Programming Language》目录索引
intro 我感觉这本书例子选得不够好 目录索引 第00章-前言 第01章-入门 第02章-程序结构 第03章-基础数据类型 第04章-复合数据类型 第05章-函数 第06章-方法 第07章-接口 第08章-goroutine和channel
《The Go Programming Language》第00章 前言
简介 Go语言本身只有很少的特性,也不太可能添加太多的特性: 拥有自动垃圾回收、一个包系统、函数作为一等公民、词法作用域、系统调用接口、只读的UTF8字符串等。 go没有隐式的数值转换,没有构造函数和析构函数,没有运算符重载,没有默认参数,也没有继承,没有泛型,没有异常,没有宏,没有函数修饰,更没有线程局部存储。 安装 https://golang.google.cn/doc/install?download=go1.16.5.linux-amd64.tar.gz#install 根据提示下载,然后使用tar命令解压到/usr/local中 1 sudo tar -C /usr/local -xzf 下载的安装包的名字 傻逼go安装包,2021年了,安装没提示(只是单纯的解压),而且还要自己配PATH环境变量,我笑了。配了path环境还要注意要登出登入linux才能起作用。 hello world 1 2 3 4 5 6 7 8 9 package main import ( "fmt" ) func main(){ fmt.Println("suprise! motherfucker") } go中一个package由一个或多个.go文件组成,每个go文件开头申明本文件属于哪个package main包比较特殊。它定义了一个独立可执行的程序,而不是一个库。在main里的main函数也很特殊,它是整个程序执行时的入口 Go语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号,因此换行符添加的位置会影响Go代码的正确解析(译注:比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字break、continue、fallthrough或return中的一个、运算符和分隔符++、–、)、]或}中的一个)。 举个例子,函数的左括号{必须和func函数声明在同一行上,且位于末尾,不能独占一行,而在表达式x + y中,可在+后换行,不能在+前换行(译注:以+结尾的话不会被插入分号分隔符,但是以x结尾的话则会被分号分隔符,从而导致编译错误)。 gofmt工具把代码格式化为标准格式 goimports,可以根据代码需要,自动地添加或删除import声明 go env 查看当前go的各种配置信息,如GOPATH 命令行参数 (ps:脑子进了一吨水才会这么组织章节) os.Args是一个字符串数组,os.Args[0],是命令本身的名字,和其他编程语言一致 循环 第一种写法: 1 2 3 for i:=1; i<10; i++ { } 注意,不能用++i?...