Skip to content

Commit

Permalink
doc: add link (OpenAtomFoundation#1182)
Browse files Browse the repository at this point in the history
  • Loading branch information
kernelai committed Aug 8, 2022
1 parent 312b7c7 commit d1dc319
Show file tree
Hide file tree
Showing 10 changed files with 348 additions and 45 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Pika is a persistent huge storage service , compatible with the vast majority o
</tr>
</table>

[More](https://github.com/Qihoo360/pika/blob/master/USERS.md)
[More](docs/USERS.md)

## Feature

Expand Down Expand Up @@ -99,12 +99,12 @@ make

## Performance

More details on [Performance](https://github.com/Qihoo360/pika/wiki/3.2.x-Performance).
More details on [Performance](docs/benchmark/performance.md).


## Documents

1. [Wiki](docs/images/../catalogue.md)
1. [doc](docs/catalogue.md)


## Contact Us
Expand Down
2 changes: 1 addition & 1 deletion README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ Pika与Redis的极限QPS对比。
<img src="https://deep011.github.io/public/images/pika_benchmark/pika_vs_redis_qps.png" height = "60%" width = "60%" alt="1"/>
## 文档
1. [Wiki] (https://github.com/Qihoo360/pika/wiki)
1. [doc](docs/catalogue.md)
## 联系方式
邮箱:[email protected]
Expand Down
File renamed without changes.
69 changes: 31 additions & 38 deletions docs/catalogue.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,54 +4,47 @@
- [社区贡献文档](https://github.com/Qihoo360/pika/wiki/ArticlesFromUsers)

## 使用与运维
- [安装使用](wiki/%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8)
- [支持的语言和客户端](wiki/%E6%94%AF%E6%8C%81%E7%9A%84%E8%AF%AD%E8%A8%80%E5%92%8C%E5%AE%A2%E6%88%B7%E7%AB%AF)
- [当前支持的Redis接口以及兼容情况](wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5)
- [配置文件说明](wiki/pika-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E)
- [数据目录说明](wiki/pika-%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E8%AF%B4%E6%98%8E)
- [info信息说明](wiki/pika-info%E4%BF%A1%E6%81%AF%E8%AF%B4%E6%98%8E)
- [部分管理指令说明](wiki/pika%E7%9A%84%E4%B8%80%E4%BA%9B%E7%AE%A1%E7%90%86%E5%91%BD%E4%BB%A4%E6%96%B9%E5%BC%8F%E8%AF%B4%E6%98%8E)
- [差异化命令](wiki/pika-%E5%B7%AE%E5%BC%82%E5%8C%96%E5%91%BD%E4%BB%A4)
- [Pika Sharding Tutorials](https://github.com/Qihoo360/pika/wiki/Pika-Sharding-Tutorials)
- [Pika双主](wiki/Pika双主文档)
- [Pika订阅](wiki/Pub-Sub使用)
- [配合sentinel(哨兵)实现pika自动容灾](%E9%85%8D%E5%90%88sentinel(%E5%93%A8%E5%85%B5)%E5%AE%9E%E7%8E%B0pika%E8%87%AA%E5%8A%A8%E5%AE%B9%E7%81%BE)
- [如何升级到Pika3.0](%E5%A6%82%E4%BD%95%E5%8D%87%E7%BA%A7%E5%88%B0Pika3.0)
- [如何升级到Pika3.1或3.2](%e5%a6%82%e4%bd%95%e5%8d%87%e7%ba%a7%e5%88%b0Pika3.1%e6%88%963.2)
- [Pika多库版命令、参数变化参考](https://github.com/Qihoo360/pika/wiki/pika%e5%a4%9a%e5%ba%93%e7%89%88%e5%91%bd%e4%bb%a4%e3%80%81%e5%8f%82%e6%95%b0%e5%8f%98%e5%8c%96%e5%8f%82%e8%80%83)
- [Pika分片版本命令](https://github.com/Qihoo360/pika/wiki/Pika%E5%88%86%E7%89%87%E5%91%BD%E4%BB%A4)
- [副本一致性使用说明](https://github.com/Qihoo360/pika/wiki/%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3)
- [Pika内存使用](https://github.com/Qihoo360/pika/wiki/Pika-Memory-Usage)
- [Pika最佳实践](https://github.com/Qihoo360/pika/wiki/Pika-Best-Practice)
- [安装使用](ops/install.md)
- [支持的语言和客户端](ops/client.md)
- [当前支持的Redis接口以及兼容情况](ops/API.md)
- [配置文件说明](ops/config.md)
- [info信息说明](ops/infoCommand.md)
- [部分管理指令说明](ops/adminComnand.md)
- [差异化命令](ops/APIDifference.md)
- [Pika Sharding Tutorials](ops/shardingTutorials.md)
- [Pika双主](ops/dualMaster.md)
- [升级](ops/upgrade.md)
- [Pika多库版命令、参数变化参考](ops/multiDB.md)
- [Pika分片版本命令](ops/shardingAPI.md)
- [Pika内存使用](ops/memoryUsage.md)
- [Pika最佳实践](ops/bestPractice.md)


## 设计与实现
- [整体架构](wiki/%E6%95%B4%E4%BD%93%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84)
- [线程模型](wiki/pika-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B)
- [全同步](wiki/pika-%E5%85%A8%E5%90%8C%E6%AD%A5)
- [增量同步](https://github.com/Qihoo360/pika/wiki/pika-%E5%A2%9E%E9%87%8F%E5%90%8C%E6%AD%A5)
- [副本一致性](https://github.com/Qihoo360/pika/wiki/%E5%89%AF%E6%9C%AC%E4%B8%80%E8%87%B4%E6%80%A7%E8%AE%BE%E8%AE%A1%E6%96%87%E6%A1%A3)
- [快照式备份](wiki/pika-%E5%BF%AB%E7%85%A7%E5%BC%8F%E5%A4%87%E4%BB%BD%E6%96%B9%E6%A1%88)
- [锁的应用](https://github.com/Qihoo360/pika/wiki/pika-%E9%94%81%E7%9A%84%E5%BA%94%E7%94%A8)
- [nemo存储引擎数据格式](wiki/pika-nemo%E5%BC%95%E6%93%8E%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E6%A0%BC%E5%BC%8F)
- [blackwidow存储引擎数据格式](wiki/pika-blackwidow%E5%BC%95%E6%93%8E%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E6%A0%BC%E5%BC%8F)
- [整体架构](design/architecture.md)
- [线程模型](design/thread.md)
- [全同步](design/sync.md)
- [副本一致性](design/consistency.md)
- [快照式备份](design/snapshot.md)
- [锁的应用](design/lock.md)
- [nemo存储引擎数据格式](design/nemo.md)
- [blackwidow存储引擎数据格式](design/blackwidonw.md)

## 性能
- [3.2.x性能](https://github.com/Qihoo360/pika/wiki/3.2.x-Performance)
- [3.2.x性能](benchmark/performance.md)

## 工具包
- [新,旧,可读三类binlog转换工具](wiki/%E6%96%B0%EF%BC%8C%E6%97%A7%EF%BC%8C%E5%8F%AF%E8%AF%BB-%E4%B8%89%E7%B1%BBbinlog%E8%BD%AC%E6%8D%A2%E5%B7%A5%E5%85%B7)
- [根据时间戳恢复数据工具](wiki/%E6%A0%B9%E6%8D%AE%E6%97%B6%E9%97%B4%E6%88%B3%E6%81%A2%E5%A4%8D%E6%95%B0%E6%8D%AE%E5%B7%A5%E5%85%B7)
- [Redis到Pika迁移工具](wiki/Redis%E5%88%B0pika%E8%BF%81%E7%A7%BB%E5%B7%A5%E5%85%B7)
- [Redis请求实时copy到Pika工具](wiki/Redis%E8%AF%B7%E6%B1%82%E5%AE%9E%E6%97%B6copy%E5%88%B0pika%E5%B7%A5%E5%85%B7)
- [Pika到Pika、Redis迁移工具](wiki/pika%e5%88%b0pika%e3%80%81redis%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7)
- [Pika的kv数据写入txt文本工具](wiki/%e8%bf%81%e7%a7%bbString%e7%b1%bb%e5%9e%8b%e6%95%b0%e6%8d%ae%e5%88%b0txt%e6%96%87%e6%9c%ac)
- [kv数据txt文本迁移Pika工具](wiki/txt_to_pika工具)
- [新,旧,可读三类binlog转换工具](tools/binlog.md)
- [根据时间戳恢复数据工具](tools/timestamp.md)
- [Redis到Pika迁移工具](tools/redis2pika.md)
- [Redis请求实时copy到Pika工具](tools/redisCopy.md)
- [Pika到Pika、Redis迁移工具](tools/pika2redis.md)
- [Pika的kv数据写入txt文本工具](tools/pika2txt.md)
- [kv数据txt文本迁移Pika工具](tools/txt2pika.md)
- [pika exporter监控工具](https://github.com/pourer/pika_exporter)

## Develop
- [Pika coding style](https://github.com/Qihoo360/pika/wiki/cpp---coding-style)
- [Pika 代码梳理](Pika%E4%BB%A3%E7%A0%81%E6%A2%B3%E7%90%86)
- [Pika coding style](design/coding.md)
- [2022年开发计划](https://github.com/OpenAtomFoundation/pika/issues/1141)

## 博客
Expand Down
183 changes: 183 additions & 0 deletions docs/design/coding.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
### c++ coding style



### header file

#### Name and order of includes

顺序是

Related header, C library, C++ library, other libraries'.h`, your project's `.h`.

不要使用 . 以及 .. 这样的符号

比如一个项目的include 头文件应该是这样

```c++
#include "foo/server/fooserver.h"

#include <sys/types.h>
#include <unistd.h>

#include <hash_map>
#include <vector>

#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/server/bar.h"

```



### class

#### Doing work in constructors

constructor 不能调用虚函数, 因为在构造的时候, 这个对象还没有完全生成, 因此调用虚函数肯定是不对的



#### Inheritance

使用 override 来表示某一个函数是virtual 函数的重新实现, 这样就不需要在看代码的时候确认这个函数是否是重载, 如果在子类里面对一个父类没有的函数进行override也是会直接报错的

在使用struct的时候 只用在只定义数据,不包含任何方法的结构体里面,出了简单的构造函数或者init函数.

通过使用继承可以有效的减少代码量 并且因为继承是编译时期的 因此在编译器能够识别这些错误 接口继承(也就是定义纯虚函数) 更是能够在编译期就识别一个继承的类是否实现了全部的接口

但是由于继承把一个类的代码分散在各个文件里面了 因此增加了看代码的难度 并且父类定义自己的成员变量 因此访问的时候不是很方便


所以一定要账号 is-a 和 has-a的关系 一定确定是 a是b的一种的时候才可以使用 继承 **否则尽可能的使用组合** 也就是b里面有一个a的成员变量

### Function

#### parameter Ordering

函数的变量的顺序: input, 然后是output

尽量把一个函数控制在40行以内

#### reference Arguments

所有通过引用传参的变量都需要加上const, 也就是 const type &in

尽可能的input argument 用value 或者 const reference(当然如果这个变量就是指针, 那么传进来的时候就用指针), 然后output argument 用指针

还有就是如果变量需要传进来NULL的时候, 可能会用const T*

#### function overloading

尽可能的不要使用 function overloading, 因为function overloading 增加了c++ 的复杂性. 特别是当继承的时候, 子类只实现了父类的某一个function 的时候, 这样代码的复杂度就更麻烦了. 因为不知道重载的是哪一个函数, 因此

尽可能的不要使用function overloading, 当遇到函数需要不用的变量类型的时候, 可以写成这种AppendString(), AppendInt() 这种

#### default value

允许在非non-virtual 函数里面使用 default value

### scoping

#### Nonmember, static member, global function

如果有一个函数和一个类的对象里面的内容并不相关

那么这个时候有两个选择, 可以定义成class static member function, nonmember function. 那么这个时候如何选择?

如果这个函数和这个对象强相关, 比如是建立一个这个对象, 或者操作这个类的静态成员函数的时候, 将这个函数声明成class static member function

否则将这个函数声明成nonmember function, 然后用namespace 隔离开来

如果有一个函数只在某一个.cc 文件里面使用, 那么可以将这个函数放在unnamed namespace 或者用static 声明 static int foo() 这种



### other

#### 关于exception 的使用

* pros:
* exception 可以发现更深层次的错误, 比如a()->b()->c()->d() 那么在d里面抛出的exception 在a里面是可以直接捕获的
* 比如在c++ 的construction 里面, 我们是无法知道这个construction 是否构造成功,
* cons
*

#### 关于返回值

1. 在一个函数内部调用



#### brace initializer List

在c++11 里面可以直接通过{} 来初始化一个list, 这个是在c++ 11 之前都不可以的, 比如:

```c++
int main()
{
std::vector<int> v{1, 2, 3};
std::map<int, int> mp{{1, 2}, {1, 3}, {1, 4}};
return 0;
}
```

#### sizeof

在使用sizeof 的时候尽可能的去sizeof(varname), 而不是去sizeof(type). 因此这个varname 随时会更新, 如果varname 这个变量被赋值给其他对象的时候

注意sizeof 的时候考虑对齐的问题

#### Run-Time Type Information(RTTI)

c++ 允许在运行的过程中使用typeid, dynamic_cast 来检查一个变量的类型, 通过dynamic_cast 在类型转换的时候进行检查, 只允许父类的指针指向子类, 而不允许子类的指针指向父类

但是其实用RTTI 的代码都可以用其他的方式来写, 而RTTI 不是很高效, 因此尽可能用 virtual method, 或者 Visitor pattern 模式来实现比较好

#### cast

尽可能的使用 c++ 的static_cast, const_cast, reinterpret_cast 而不是用c 里面的cast

#### stream

如果你为了debug想要打印一个对象内部的细节, 那么经常会提供一个DebugString() 是最经常的

不要使用stream 作为外部用户的IO, stream 性能还是不行的

#### Friend

允许使用 Friend class, function

Friend class 虽然会破坏了类封装, 允许外部类直接访问当前这个类里面的私有成员, 常见的用法就是FooBuilder 应该能够访问Foo 里面的私有成员. 如果没有Friend class, 要么把Foo 的成员都设置成public, 要么给所有的成员变量都添加get, set 函数. 还是很不方便的.

Friend class 只是让某一个类可以访问这个类, 还是比让所有的成员变量都public 来说, 封装更好一些

因此Friend class 需要看到Foo 的私有变量, 因此经常将Friend class 放在同一个头文件里面

#### use of const

能用const 的地方尽可能的使用const

#### Integer type

用<stdint.h> 里面定义的int32\_t, int64\_t 等等, 而不适用short, long, long long 这种类型, 因为short, long 等是根据编译器和平台是不一样的

#### 0 and nullptr/NULL

Use 0 for integers, 0.0 for reals, nullptr (or NULL) for pointers, and '\0' for chars.

在支持c++11 的项目里面尽可能使用nullptr

### Comments

#### TODO comment

写TODO comment 的时候记得写上谁写的这个TODO

// TODO([email protected]): Use a "*" here for concatenation operator.


### 总结

最后可以用 cpplint.py 跑一下, 尽可能把错误是4, 以及4以上的给排除掉
3 changes: 2 additions & 1 deletion docs/introduce.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## Pika是什么
Pika是DBA和基础架构组联合开发的类Redis 存储系统,所以完全支持Redis协议,用户不需要修改任何代码,就可以将服务迁移至Pika。Pika是一个可持久化的大容量Redis存储服务,兼容string、hash、list、zset、set的绝大接口[兼容详情](https://github.com/Qihoo360/pika/wiki/pika-%E6%94%AF%E6%8C%81%E7%9A%84redis%E6%8E%A5%E5%8F%A3%E5%8F%8A%E5%85%BC%E5%AE%B9%E6%83%85%E5%86%B5),解决Redis由于存储数据量巨大而导致内存不够用的容量瓶颈,并且可以像Redis一样,通过slaveof命令进行主从备份,支持全同步和部分同步。同时DBA团队还提供了迁移工具, 所以用户不会感知这个迁移的过程,迁移是平滑的。
<<<<<<< HEAD
Pika是DBA和基础架构组联合开发的类Redis 存储系统,所以完全支持Redis协议,用户不需要修改任何代码,就可以将服务迁移至Pika。Pika是一个可持久化的大容量Redis存储服务,兼容string、hash、list、zset、set的绝大接口[兼容详情](ops/API.md),解决Redis由于存储数据量巨大而导致内存不够用的容量瓶颈,并且可以像Redis一样,通过slaveof命令进行主从备份,支持全同步和部分同步。同时DBA团队还提供了迁移工具, 所以用户不会感知这个迁移的过程,迁移是平滑的。

## 与Redis的比较
Pika相对于Redis,最大的不同就是Pika是持久化存储,数据存在磁盘上,而Redis是内存存储,由此不同也给Pika带来了相对于Redis的优势和劣势
Expand Down
2 changes: 1 addition & 1 deletion docs/ops/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ pika支持redis五种类型(分别为string、hash、list、set、zset)的

* 重名问题:由于pika每个类型独立运作, 所以允许重名。例如在key abc在string中存在的时候也同样允许在hash中存在,一个key最多重名5次(5大类型),但在同一接口中是无法重名的。所以建议在使用的时候对于不同类型不要使用完全相同的key;

* 分库问题:pika自3.1.0版起支持多库,相关命令、参数的变化请参考[Pika3.1.0多库版命令、参数变化参考文档](https://github.com/Qihoo360/pika/wiki/pika3.1.0%E5%A4%9A%E5%BA%93%E7%89%88%E5%91%BD%E4%BB%A4%E3%80%81%E5%8F%82%E6%95%B0%E5%8F%98%E5%8C%96%E5%8F%82%E8%80%83)
* 分库问题:pika自3.1.0版起支持多库,相关命令、参数的变化请参考[Pika3.1.0多库版命令、参数变化参考文档](multiDB.md)

* 数据展示:pika对于keyspace的展示选择了分类型展示而非redis的分库展示(因为pika没有分库概念),pika对于keyspace的统计是被动的,需要手动触发并不会立即输出,命令为:info keyspace [ 0|1 ],默认为0不触发,pika的keyspace统计是精确的。

2 changes: 1 addition & 1 deletion docs/ops/FAQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
A1: 目前只支持Linux环境,包括Centos,Ubuntu; **不支持Windows, Mac**

#### Q2: 怎么编译安装?
A2: 参考[编译安装wiki](https://github.com/Qihoo360/pika/wiki/%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8)
A2: 参考[编译安装wiki](install.md)

#### Q3: Ubuntu编译偶尔报错`isnan isinf was not declared`
A3: 一些旧版本的pika对Ubuntu环境兼容不好,某些情况下会出现;可以先修改代码,用`std::isnan``std::isinf`替代`isnan``isinf`, 并包含头文件`cmath`。 我们会在新版兼容这个。
Expand Down
1 change: 1 addition & 0 deletions docs/ops/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ small-compaction-threshold : 5000
```
# 数据目录说明

#### db目录
用于存放pika的所有数据文件,包含5个子目录(5大数据类型)它们是:kv,set,zset,hash,list,从pika3.0.0开始,这些数据结构目录为:hashes,lists,sets,strings,zsets
Expand Down
Loading

0 comments on commit d1dc319

Please sign in to comment.