阅读Redis源码

1. AE事件驱动框架 1.1 polling处理 ae_epoll.c、 ae_kqueue.c、 ae_evport.c、 ae_select.c 这4个文件的功能是完全一样的,提供一致的API接口,给ae.c文件调用 1.2 核心结构体 aeEventLoop 用来创建事件循环 aeCreateEventLoop:初始化一个事件循环结构体(eventL …

阅读全文

MySQL使用总结

索引 建立索引 索引的基数相对于数据表行数较高,工作效果最好。说明列中不同值较多,区分度的公式是 COUNT(DISTINCT col) / COUNT(*)。查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描,惯用的百分比界线是“30%”, 通过SHOW STATUS LIKE ‘Handler_read%’;查看索引的使用情况 Ha …

阅读全文

再看设计模式——访问者模式

visitor模式优势在于双分派 dual dispatch 原始实现: 消息Visitable接口定义一个结构方法:accept(visitor v) { v.visit(this); } 访问者Visitor接口定义处理方法:visitor(具体类型) { 具体逻辑 } 使用者调用:具体类型.accept(v); 这个结构缺点在于新增具体类型,还得修改访问者接口 Acyclic visitor …

阅读全文

c++11如何封装thread库

基本接口要求 要求std::thread的构造函数 但是OS的库函数定义为: 主要是接口中的entry,本身使用void*根本没带类型信息,难点在于要做到模板暴露出类型从而可以通用化 第一个问题:把f和args统统打包在一起做成一个void *结构 我们得从void* 中获取函数指针和参数指针,首先来个结构体定义真实指针类型 需要一个tuple,用于保存f和args,这样我们就可以通过将void …

阅读全文

看设计模式——模板方法与策略模式

模板方法模式(Template Method)和策略模式都是用来解决通用算法和使用的上下文环境分离的代码抽象问题,前者思路是靠继承,后者则靠委托。 模板方法模式很简单,就是提供一些可以用来继承覆盖的通用方法,然后在上下文环境中提前调用通用这些方法,类似做stub。派生类继承后可以改写通用方法,从而完成更多具体的算法实现。缺点是导致派生类里面的具体算法实现和基类无形中绑定了。 策略模式相对复杂一些, …

阅读全文