设计思想、编码能力、算法基础、协作能力、责任态度;
基础结构:
字符串操作封装,如:数字字符串转换;分隔符拆分;等常用操作(string_handle)
网络基础数据结构,如:ip数字转换;获取域名;
对象池封装
位存储(bit_map)
序列化反序列化buffer(octets,能够支持写时拷贝以及压缩功能)
阻塞队列(block_queue)
ring buffer
时间封装(获取年月日等,可以单独线程定时调用)
json_to_pb,pb_to_json(pb_json_convert)
无锁队列
共享内存
定时器(timer)
countdown latch(sync_completion)
字符集转换封装(conv_charset)
关键词搜索(不会涉及分词,比如游戏中各关键词未必是常用词)
c++11:unordered_map耗内存;emplace_back 节省拷贝构造;thread;mutex;atomic;shared_ptr;weak_ptr;function;bind;
stl容器以及算法的使用;
配置文件热加载;
概念:
由弱到强分别是 依赖(临时关系) < 关联(相同层次之间的关系) < 聚合(包含关系,个体于整体,高低层次之间的关系) < 组合(不可分离的整体关系,生命期一致)
线程:
线程和task“聚合”使用,同时封装task factory
线程基本操作封装(thread_pool)
线程锁封装(原子,读写,互斥,条件变量,原子用c++11的话就不必封装)(锁的使用,互斥锁和读写锁使用不易出错,原子锁实现队列等功能容易出错,要使用CAS,要注意)
线程tls(thread_tls)
文件读取:
xml
json(rapidjson,jsoncpp)
ini
yaml
libconfig/libconfig.h++
协议:
pb
xml定义协议、工具生成cpp文件(一些老项目使用类似方式生成各种前后端协议文件)
日志:
glog
log4cpp
linux log API(服务简单的话直接用API就可以啦)
spdlog
内部缓存:
redis unixsocket
网络模块:
libevent
自己封装
spserver
restclient-cpp
外部缓存:
redis(qps 7w,测试用例开启单线程无休眠读取队列 qps 1.6W, redis cpu 14%)
codis(set类型值个数不要超过10W,每个实例8G,具体根据业务测试,有的业务redis存储set类型值个数达到1500W)
数据库:
mysql
mongodb(bsoncxx)
ssdb
influxdb
leveldb
队列:
redis
kafka
RPC:
thrift
brpc
自己封装
外部依赖:
zlib
curl
openssl
tbb
gflag
libconfig
指标:
cppmetrics
规范:
线程和业务要分离,目前代码一般都是线程和业务混淆,类内容混乱,造成逻辑不清晰感觉,查看代码会遇到麻烦;
数据结构设计可以冗余数据,时间换空间;
使用设计模式的目的是把不变的东西和可变的东西分离并且封装起来,避免以后修改代码, “对修改关闭,对扩展开放”,但是滥用设计模式会把简单的问题复杂化;