2018年1月5日~2018年1月6日 12:00 考完最后一门。 14:00 到哥哥这边吃饭。 16:00 和哥哥去姐姐医院,和姐姐说再见。 17:00 到火车站,取票,下雪路滑,拉着箱子不好走。 17:20 刚取完票过安检,火车站通知Z88停运,查票的小姐姐刚好查到我就是Z88,笑个不停,我问她:这是不是你今天最开心的事?她说:是。 17:40 退Z88,改签T114(23点45发车),哼,这点小事能难倒我? 18:00~23:00 交了10元钱在候车茶水间度过,把书拿出来又装回去了,太吵,而且可能我觉得看书有点装B,或许因为我旁边坐的都是年轻人。 23:00 开始排队候车 23:39 被通知火车晚点 00:30 火车还是晚点,广播开始说:可以办理改签或者退票,我有点后悔改签时候为什么没有选择9点多去杭州的火车,其实主要是因为T114速度快,到的早。 01:07 我查了下机票,很便宜,315,又查了下去机场的大巴,火车站陇海大酒店旁边,4:00是第一班。 01:30 为了确认大巴可 继续阅读 >>


杨博东 18/01/07 22:37:39
一、前言 作为一只大四狗,最近还跟着大二同学修了一门课(当然不是之前没通过啦),课程是高级语言课程设计,高级语言指的是C语言 :),内容是做一个XX管理系统,我选择了图书管理系统,先介绍下我做的系统: 主要功能: 读者信息管理:添加、修改、删除、查询读者信息。 图书信息管理:添加图书、修改图书、删除图书、查询图书 图书借阅归还:图书借阅和归还,以及列出借阅情况。 信息统计汇总:图书总量统计、图书借阅统计等。 日志功能:记录用户、图书、借阅相关信息的日志。 参与对象:管理员和用户,管理员主要指图书馆相关工作负责人员,用户指老师或者教工,可以从图书馆借书。 数据存储格式:文件。 数据组织方式:链表。 界面:ncurses库。 其它:CMake组织项目、GitHub版本控制:代码地址 、Linux操作系统运行。 为了体现我大学四年也不是白念的,当然得体现出逼格,那就从界面下手,于是我选择了ncurses这个终端字符库,最后的界面是这样的: 整个界面分为三部分,上面显示系统名称和时间,用户登录之后还会显示用户名;左下是整个程序的功能菜单部分;右下是系统日志,负责动态显示 继续阅读 >>


杨博东 17/12/28 15:41:47
源码版本:4.0.1 源码位置: intset.h:数据结构的定义 intset.c:创建、增删等操作实现 1. 整数集合简介 intset是Redis内存数据结构之一,和之前的 sds、 skiplist、dict、adlist 等通用数据相比,它是Redis特有的,用来实现Redis的Set结构(当元素较小且为数字类型时),它的特点有: 元素类型只能为数字。 元素有三种类型:int16_t、int32_t、int64_t。 元素有序,不可重复。 intset和sds一样,内存连续,就像数组一样。 2. 数据结构定义 typedef struct intset { uint32_t encoding; // 编码类型 int16_t、int32_t、int64_t uint32_t length; // 长度 最大长度:2^32 int8_t contents[]; // 柔性数组 } intset; 3. 创建、插入(扩缩容)、查找(二分查找)、删除 以下面这个例子来看下ints 继续阅读 >>


杨博东 17/11/30 00:52:45
1. 什么是守护进程 守护进程daemon,是指没有控制终端,运行在后台的进程,通常伴随着系统启动产生,系统关机结束。可以使用命令ps -axj查看系统的守护进程,输出如下所示: 父ID PID 组ID 会话ID 终端 状态 用户ID 命令 PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 1 1 ? -1 Ss 0 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 0 2 0 0 ? -1 S 0 0:00 [kthreadd] 2 3 0 0 ? -1 S 0 0:00 [ksoftirqd/0] 说明: 1 继续阅读 >>


杨博东 17/11/28 01:12:09
内核版本:linux-4.4.18 源码位置:这里 fork相关的代码最终执行的函数为_do_fork(),下面按照顺序分析下_do_fork(): 首先判断是否需要trace(跟踪)这个进程,这一步主要与调试相关,GDB在x86-64 Linux 系统上的原理就是利用ptrace(2)系统调用 [1]。 有关likely和Unlikely,实际上是利用gcc内置函数对分支条件的优化 [2]。 if (likely(!ptrace_event_enabled(current, trace))) // likely表示大多数情况下下面分支会被执行 trace = 0; 接着代码调用copy_process(),它设置了进程描述符以及子进程所需的任何其他内核数据结构。 它的参数和_do_fork()相比增加了一个子进程的pid。 接下来检查clone_flags参数中传递的标志是否兼容。 通过调用security_task_create()来执行额外的安全检查。 调用dup_task_struct(),为新进程创建新的内核堆栈,t 继续阅读 >>


杨博东 17/11/27 19:57:46
1 调研目的 主要的目的是想调研各大云平台有关Redis监控功能的实现,但是最后我发现各大云平台提供的监控功能都比较基础,比如我想看诸如访问频率较高的HotKey、占用内存较大的Bigkey等指标,它们都没有提供,一部分Redis监控的开源工具实现了这样的功能,但是实现方法实用性不大,见后文汇总。 2 调研情况 2.1 常见公有云平台监控 我所调研的阿里云、腾讯云、青云这三个平台给用户提供的监控信息均是采用Redis Info命令获取的,他们中有的再次对Redis Info的信息做了一些处理,比如阿里云对INFO Commandstats做了排序,提供了TOP Command的信息,但是他们并没有对服务端做改造或者通过其他的方式获取监控信息,因此也没有提供诸如访问频率较高的HotKey、占用内存较大的Bigkey的指标。 阿里云的监控页面: 腾讯云的监控页面: 青云的监控页面: 2.2 开源的Redis监控工具 有一些开源工具提供了类似的监控指标,汇总如下: RedisLive:提供了Top 继续阅读 >>


杨博东 17/11/15 22:12:22
一、介绍相关 说Redis : 介绍Redis特性,使用场景,使用Jedis操作Redis等。 二、源码分析 1. 数据结构 Redis源码分析(sds):Redis自己封装的C语言字符串类型。 Redis源码分析(dict):字典的实现,Hash表。 Redis源码分析(adlist):Redis中的双向链表。 Redis源码分析(skiplist) :Redis 中的跳跃表,平均O(log n)的查询效率。 2. 内存编码数据结构 3. 数据类型实现 4. 数据库实现相关 5. 客户端和服务器的相关代码 Redis网络库源码分析(1)之介绍篇 : Redis自己实现的单线程IO多路复用网络库分析(1) Redis网络库源码分析(2)之启动服务器: Redis自己实现的单线程IO多路复用网络库分析(2) Redis网络库源码分析(3)之ae.c: Redis自己实现的单线程IO多路复用网络库分析(3) 三、其他 Redis INFO CPU 信息详解:关于INFO CPU显示的CPU信息解释。 Sha 继续阅读 >>


杨博东 17/11/14 13:08:51
源码版本: redis-4.0.1 源码位置: server.h :zskiplistNode和zskiplist的数据结构定义。 t_zset.c: 以zsl开头的函数是SkipList相关的操作函数。 一、跳跃表简介 跳跃表(SkipList),其实也是解决查找问题的一种数据结构,但是它既不属于平衡树结构,也不属于Hash结构,它的特点是元素是有序的。有关于跳跃表的更多解释,大家可以参考 张铁蕾老师 - Redis内部数据结构详解(6)——skiplist 中有关跳跃表的描述部分,我接下来主要分析有关于Redis跳跃表本身的代码部分,Redis作者antirez提到Redis中的实现的跳跃表与一般跳跃表相比具有以下三个特点: a) this implementation allows for repeated scores. // 允许分值重复 b) the comparison is not just by key (our ‘score’) but by satellite data. //对比的时候不仅比较分值还比较对象 继续阅读 >>


杨博东 17/11/13 19:47:20
源码版本redis-4.0.1 一、adlist简介 Redis中的链表叫adlist(A generic doubly linked list implementation 一个通用的双端链表实现),和普通单链表相比,它的方向可以向前或者向后,这是由于数据结构中定义了next和prev两个指针决定的,下面看下它的数据结构实现。 二、数据结构定义 typedef struct listNode { struct listNode *next; //next指针,指向下一个元素 struct listNode *prev; //prev指针,指向上一个元素 void *value; //void *类型的数据域 } listNode; typedef struct list { struct listNode *head; //head指针指向链表头部 struct listNode *tail; 继续阅读 >>


杨博东 17/11/08 13:52:36
一、dict 简介 dict (dictionary 字典),通常的存储结构是Key-Value形式的,通过Hash函数对key求Hash值来确定Value的位置,因此也叫Hash表,是一种用来解决算法中查找问题的数据结构,默认的算法复杂度接近O(1),Redis本身也叫REmote DIctionary Server (远程字典服务器),其实也就是一个大字典,它的key通常来说是String类型的,但是Value可以是 String、Set、ZSet、Hash、List等不同的类型,下面我们看下dict的数据结构定义。 二、数据结构定义 与dict相关的关键数据结构有三个,分别是: dictEntry 表示一个Key-Value节点。 dictht表示一个Hash表。 dict是Redis中的字典结构,包含两个dictht。 dictEntry结构的代码如下: typedef struct dictEntry { void *key; //key void*表示任意类型指针 union { 继续阅读 >>


杨博东 17/11/07 14:35:08