3分钟做5道leetcode题上手leetcode刷题之路

官网地址:https://leetcode-cn.com

在官网注册后,点击题库页面就可以看到所有可以刷的题目了

可以按照难度进行筛选、建议从简单难度的题上手

两数之和: https://leetcode-cn.com/problems/two-sum/

问题描述

Read more   2019/9/28 posted in  leetcode

三分钟上手数据结构作图工具graphviz

Read more   2019/9/16

nginx网络通信模块设计与实现分析

nginx作为后端程序不可缺少的中间件,凭借其优异的性能和稳定性,获得了大量的用户

目录结构


nginx的文件目录非常清晰,虽然有6个目录,但是可以归成两类,core目录存放nginx生命周期相关的函数,比如master、worker进程的创建,模块构造函数调用,核心数据结构和算法实现

其它目录主要就是存放nginx功能的扩展了、nginx几乎所有的功能都是通过扩展实现的

入口程序

src/core/nginx.c::main()

在入口程序中,nginx主要是处理了命令行参数,如果没有带参数运行nginx,则启动nginx服务器ngx_master_process_cycle(cycle

核心调用如下

  1. ngx_strerror_init() 初始化错误码存放链表
  2. ngx_get_options(argc, argv) 将命令行参数解析到全局变量
  3. 初始化日志系统: ngx_log_init(ngx_prefix)
  4. ngx_save_argv(&init_cycle, argc, argv) 保存所有命令行参数到全局变量
  5. ngx_process_options(&init_cycle)

给启用的nginx模块进行编号

ngx_max_module = 0;
for (i = 0; ngx_modules[i]; i++) {
    ngx_modules[i]->index = ngx_max_module++;
}
Read more   2019/9/15 posted in  源码分析

memcached中的经典数据结构hash链表和LRU删除策略的应用

hash链表是memcached核心的数据结构了,hash表用于快速读取、写入缓存数据(item结构),链表用于实现lru策略,lru用于内存不足时的兜底策略,有效防止了内存不足时造成宕机

缓存操作

memcached中使用struct _stritem结构体代表缓存,这个结构体被typedef定义成了item类型,对这个item结构体的操作都在item.c中,函数列表如下

函数 作用
item_init 初始化lru链表头尾指针、item数量数组
item_make_header 计算一个item占用的内存字节数
item_alloc 从slab中分配出item的内存
item_free 把item内存还给slab
item_size_ok 检查item内存大小是否超过了slab允许的范围
item_link_q 把item加入到lru链表头
item_unlink_q 从链表中删除item
item_link 把item插入hash表,同时加入lru链表中(item_link_q)
item_unlink 把item从hash表中删除,同时从lru链表中删除(item_unlink_q)
item_remove 把item内存还给slab,带异常检查
item_update 修改item,同时按照lru规则重建这个item在lru链表中的位置
item_replace 替换item,和item_update的区别时,这个不会修改item的最后访问时间
item_cachedump 获取指定slab的所有item的key和value的大小
item_stats 获取所有lru链表的大小
item_stats_sizes 统计item的大小

可以看到这个item的操作就用到了hash表和链表,item是在hash表和链表上进行的,即对缓存item的操作,会同时影响到hash表和链表两种数据结构的构建

hash表构建

Read more   2019/9/8 posted in  源码分析

基础数据结构-用链表实现队列和栈

链表在memcached、redis中作为核心数据结构出现。相比数组,链表能动态增减容量,就比数组要灵活,并且hash表结构一般都使用链表进行数据存储

完整案例代码已上传github: https://github.com/neatlife-learn/mydatastructure

队列

元素结构

对应代码如下

typedef struct _element {
    struct _element *previous;
    struct _element *next;
    void *value;
} element;

队列结构

一个队列中包含多个元素,为了能够方便的得到这个队列头和尾,以及队列里的元素个数,使用这个queue结构来存放这些信息

Read more   2019/8/28 posted in  源码分析

memcached内存分配策略源码分析

本文基于memcached 1.2.0写成

memcached的内存分配器slab.c不过300行代码,还是比较容易上手分析的。

内存模型如下:

一个slabclass_t管理了多个slab,每个slab被称为内存页,每个slab管理多个item的内存空间

核心函数

函数名 作用
slabs_init 初始化slabclass_t结构体数组
slabs_clsid 通过内存大小从slabclass_t数组中找到最小能满足的结构体
slabs_preallocate 给每个slabclass_t先分配一个slab(页)的内存(1mb)
slabs_newslab 给指定的slabclass分配一个新的slab存放到slab_list上,同时slabs、end_page_ptr、end_page_free发生相应变化
grow_slab_list 动态增加slab_list数组的大小
slabs_alloc 从内存分配器中取出一个空的item内存来使用
slabs_free 将item所在的内存指针重新标记成可使用,相当于删除了item
slabs_stats 从slabclass_t结构体上获取内存分配器的使用情况
Read more   2019/8/23 posted in  源码分析

三分钟上手禅道项目任务管理系统

公司采用了这个禅道项目任务管理系统,是有必要了解学习的

下载地址:https://www.zentao.net/

文档参考:https://www.zentao.net/book/zentaopmshelp/40.html

github项目地址:https://github.com/easysoft/zentaopms

获取可用的禅道实例

可以使用docker一键启动禅道系统,参考:https://github.com/idoop/zentao

git clone https://github.com/idoop/zentao.git
cd zentao
docker-compose pull
docker-compose up -d
docker-compose ps

操作效果如下

可以看到web服务已经在80端口启动了,访问ip:80使用默认用户名密码 root 123456就可以登录了

Read more   2019/8/21

三分钟上手linux系统开发

linux系统编程,主要使用c语言,c++是c的超集,也是可以的

完整项目代码已上传github:https://github.com/neatlife/my-tlpi-book

获取可用环境

可以使用虚拟机安装一个linux系统进行linux系统开发,虽然mac os和linux非常相似,但是和linux还是有很多小区别的,装虚拟机是最省事的
这里使用elementary os,下载地址参考:https://elementary.io/zh_CN/

安装时,选linux 4.x以上的内核版本即可

memcached网络通信模块设计与实现分析

接上一篇redis网络通信模块,memcached的网络通信借助了libevent库,简化了底层的网络读写事件的封装,但是memcached多了多线程处理

核心流程:客户端 -> 服务端memcached master -> master fd -> master accept(fd) -> client fd -> worker线程处理client fd所有读写事件

master处理流程

master处理流程在main()函数中,虽然main函数共有6892-8334共计1442行代码,6892->8104共计1212行都是在解析memcached的配置、和做一些主流程无关的小操作。

main中的核心代码不到230行(8104->8334),还是非常容易分析的

master做的核心工作有一下几点

创建libevent事件循环-event_base_new_with_config()

这个是libevent事件循环的核心共享结构体,后面的事件注册,启动等都需要这个结构体

这里需要注意的是memcached使用了带参的event_base_new()函数,参数是libevent配置

ev_config = event_config_new();
event_config_set_flag(ev_config, EVENT_BASE_FLAG_NOLOCK);
main_base = event_base_new_with_config(ev_config);

不为event_base分配锁,这样可以提高一些libevent的性能,虽然这样可能导致多线程下使用event_base变得不安全,但是memcached的event_base是一个线程一个event_base,所以不存在这个问题

启动tcp服务器

memcached.c::server_socket()函数中使用socket()和bind()方法启动了tcp服务器,并得到这个代表memcached server的fd

Read more   2019/8/11

redis网络通信模块设计与实现分析

redis的通信模块封装得非常简单易用,可以直接用到自己项目中,学习下也是很有价值的。

本文基于redis源码4.0.1写成,redis源码下载:https://github.com/antirez/redis/archive/4.0.1.tar.gz

文件结构

redis的网络通信模块由8个文件构成

作用如下

文件 作用
ae.c 统一epoll、evport、kqueue、select网络事件处理接口, 函数实现
ae.h 统一epoll、evport、kqueue、select网络事件处理接口,函数原型,共享结构体定义
ae_epoll.c 封装epoll网络事件处理库到统一的接口
ae_evport.c 封装evport网络事件处理库到统一的接口
ae_kqueue.c 封装kqueue网络事件处理库到统一的接口
ae_select.c 封装select网络事件处理库到统一的接口

统一网络库底层接口

被统一的网络事件处理接口如下,参考:ae_epoll.c, ae_evport.c, ae_kqueue.c, ae_select.c

Read more   2019/8/9 posted in  源码分析 Redis

三分钟上手hive进行数据统计

最近操作了hive进行数据统计,使用下面总结的步骤可以快速上手这个数据库

完整案例代码已上传github: https://github.com/neatlife-learn/myhive

获取可用的hive实例

可以使用docker一键启动参考:https://github.com/big-data-europe/docker-hive

git clone https://github.com/big-data-europe/docker-hive.git hive
cd hive
docker-compose pull
docker-compose up -d

执行docker-compose ps查看启动效果

可以看到hive-server已经成功启动并在10000端口监听了

然后可以使用命令: docker-compose exec hive-server /opt/hive/bin/beeline -u jdbc:hive2://localhost:10000

进入hive命令行终端进行操作了,常见的sql语句一般都支持,比如show databases show tables desc tableName等,操作效果如下:

使用sqoop导入mysql数据到hive

准备测试数据

在mysql中准备需要导入hive的数据,可以自行生成,这里使用已经存在的user_words表,内容如下

Read more   2019/8/6 posted in  三分钟系列

三分钟上手安全渗透系统Kali Linux

kali linux系统集成了常用的安全渗透工具,省去了安装工具的时间,做安全相关的工作是非常推荐使用的。

安装Kalii Linux

安装系统

一般使用虚拟机进行安装,Kali Linux基于Debian内核,虚拟机的操作系统选择Debian 7.x 64

Read more   2019/8/3 posted in  安全 三分钟系列