自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(121)
  • 收藏
  • 关注

原创 基于C++11 可变参数构造对象池

概要:最近写代码时发现需要一个对象池用于减少对象创建与销毁的开销。理想中对象池接口应尽量精简,逻辑尽量精简,并可以支持不同的初始化构造方式。阅读<<深入应用C++11 代码优化与工程级应用>>的对象池,其设计思路满足大部分需求,但示例代码略有瑕疵。在书中的代码基础上进行扩展。核心逻辑:对象核心逻辑与大多数逻辑的优化思路是一致的,用空间换时间,通常来说,对象的创建有些部分是无法避免的,特别是在对系统进行内存申请的时候,所以,当幸苦创建的对象在我们不需要的时候返回给了系统

2020-08-23 00:03:00 395 1

原创 ProtoBuf协议 使用总结《动态加载*.proto文件 通过反射遍历所有子属性》提供一个简易的封装

概要https://github.com/yxinyi/DynamicProtoBufParse本文章是使用protobuf反射的一个总结,假定阅读者已经会搭建proto环境并且已会生成.pb.h文件,阅读完本篇,你会得到以下几个问题的解决方案的参考:Proto 的正常使用对定义的任意结构进行遍历在没有通过protoc.exe生成头文件的情况下,通过动态加载*.proto.来进行结构对象的生成,并可以使用反射机制进行修改为了测试所有常用类型,后续所有结构皆用下面定义syntax

2020-08-17 00:14:08 3008

原创 ant design pro 与服务器交互逻辑链

ant design pro 与服务器交互逻辑链UI 组件交互操作;调用 model 的 effect;调用统一管理的 service 请求函数;使用封装的 request.ts 发送请求;获取服务端返回;然后调用 reducer 改变 state;更新 model。官网对于 adp 与服务器交互过程十分简易,跟着几个文件看了好几遍,才从中找出对应的规律,也对实现思路以及原因有了一定的概念,在此记录一下示例获取adp 自身不带复杂的示例,需要通过npm run fetch:bl

2020-07-28 17:58:06 647

原创 《More Effective C++》 笔记

条款1: 仔细区分 pointers 和 referencespointers 是一个变量,其本身存放实际内容的地址references 是一个引用,其就是实际内容的别名两者都支持多态但是还是有一定区别的pointer 在进行创建的时,不一定要立即给定一个准确值,虽然发生这种情况时,通常会赋予一个 null,来区别当前指针未进行初始化,杜绝由此产生的野指针,而 pointer 也是可以进行...

2020-04-22 00:05:02 284

原创 烛火

我有一支小小烛火带着它穿过飘着雨的森林带着它游过浅浅的湖泊带着它坐在山顶任由微风拂过我只有一支小小烛火带着我走出无边的黑夜带着我排解寂静的孤单带着我做安详的梦最后那小小烛火不敢想当雨开始磅礴不敢想当湖泊泛起浪不敢想当呼啸着起了风那黑夜是否终有有朝阳孤单是否终有尽头是否还有着最后一次梦...

2020-04-18 01:34:44 128

原创 Redis设计与实现 笔记 第十九章 事务

事务Redis 通过MULTI EXEC WATCH 等命令来实现事务功能.通过输入 MULTI 开启事务模式,然后输入命令链,最后执行.19.1 事务的实现一个事务从开始到结束通常经历一下三个阶段.1): 事务开始.2): 命令入队.3): 事务执行.19.1.1 事务开始通过 MULTI 命令来表示事务开始void multiCommand(redisClient *c) ...

2020-02-27 16:58:06 161

原创 Redis设计与实现 笔记 第十八章 发布与订阅

发布与订阅Redis 的发布与订阅功能由 PUBLISH, SUBSCRIBE,PSUBSCRIBE 组成当客户端监听某个频道时,有人发布消息至该频道时,所有的订阅者都会收到这条信息.18.1 频道的订阅与退订当一个客户端执行了 SUBSCRIBE ,这个客户端将与被订阅频道之间就建立起了一种订阅关系.以键值对模式建立相关链接,存入下面结构中, 键为字符串对象, 值为链表对象.stru...

2020-02-27 13:10:28 185

原创 Redis设计与实现 笔记 第十七章 集群 cluster

集群Redis 集群是 Redis 提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能17.1 节点一个 Redis 集群通常由多个节点组成,在刚开始的时候,每个节点都处于一个只包含自己的集群中,如果需要将各个独立的节点连接起来,构成一个包含多个节点的集群.命令如下CLUSTER MEET <ip> <port>if (!strcas...

2020-02-25 21:09:47 411

原创 Redis设计与实现 笔记 第十六章 哨兵 Sentinel

Sentinel 哨兵哨兵是程序高可用性的一个保障.通过一个或多个哨兵程序组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动从其从服务器中选出升级为主服务器,由新服务器来替代已下线的主服务器继续处理命令请求.后续内容就是详细介绍 Sentinel 系统对主服务器执行故障转移的整个过程16.1 启动并初始化 S...

2020-02-23 21:46:32 1346

原创 Redis设计与实现 笔记 第十五章 复制

复制在 Redis 中,可以用一台服务器来复制另一台服务器的数据,复制的服务器称为从服务器,被复制的服务器称为主服务器.这一概念也就是我们时常会看到的主从服务器概念,主从服务器可以用来负载均衡,进行定时的备份,用来保持数据库的安全性和维持高效.Redis 通过SLAVEOF ip port进行主从服务器的配置.进行主从配置之后,从服务器将完全和主服务器一样,保持完全的一致性.主服务...

2020-02-23 01:14:48 138

原创 Redis设计与实现 笔记 第十四章 服务器

服务器上一张了解了客户端以一个对象的方式来表明自己的身份以及当前所处的阶段,这章对应的会进行一个服务器的介绍.Redis 服务器负责与多个客户端建立网络链接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来位置服务器自身的运转14.1 命令请求的执行过程以客户端向服务器发送命令为例,来进行客户端与服务器交互的过程说明.当客户端发出SET KEY VA...

2020-02-22 16:41:06 295

原创 Redis设计与实现 笔记 第十三章 客户端

客户端原本以为这一章是针对客户端程序的一个编写,带着这种思维去阅读,然后发现其实是指代在 redisServer 中的客户端对象,也就是客户端在服务器上的一个实体映射.具体结构如下typedef struct redisClient { // 套接字描述符 int fd; // 当前正在使用的数据库 redisDb *db; // 当前正在使用的数...

2020-02-21 22:42:37 146 1

原创 Redis设计与实现 笔记 第十二章 事件

事件本章介绍了 Redis 驱动的两大事件, 文件事件 和 时间事件.文件事件(file event): Redis 通过套接字与客户端进行连接,而文件时间就是服务器对套接字的抽象.服务器与客户端的通信会产生相应的文件时间,而服务器则通过监听并处理这些时间来完成一系列网络通信操作.时间时间(time event): Redis 服务器中的一些操作(serverCron) 需要在给定的时间点执...

2020-02-21 12:38:08 134

原创 2020年2月21日 面试小计

失眠今天面试了一家心仪的公司,总的来说,问的都在我的能力点上.但是真的好紧张,完全没回答完整.有一些肯定能证明自己能力的点没有明确的说明.有点失眠,也没心情看书,做下笔记,虽然这次可能没戏,但是还是希望下次能以此为戒总结1): 过于紧张感觉自身还是缺乏面对高压时候正常思维的能力,而且是十分缺乏,在平时工作中就能体现,在与平级同事进行沟通时候非常顺畅,但是面对高阶级的人,也会紧张,说话结巴...

2020-02-21 01:04:16 220

原创 Redis设计与实现 笔记 第十一章 AOF持久化

AOF 持久化APPEND ONLY FILEAOF持久化相对于 RDB 持久化不同, RDB 发起初始化时,会一次性将当前数据库中的对象都进行一次持久化操作,即使有 BGSAVE 命令这样的保存方式,在进行保存时,还是会占用一定的资源.且可能大部分的数据也根本没有变化.在面对上述描写的情况, AOF 持久化模式就出现了, 其记录了命令的输入,用增量的方式进行数据的持久化.11.1 AO...

2020-02-19 20:36:59 298

原创 Redis设计与实现 笔记 第十章RDB持久化

RDB 持久化Redis 是一个键值对数据库服务器,是在内存中存储的,当发生崩溃时,存储的数据将会丢失,所以需要一个落地策略.在此基础上, Redis 提供了 RDB 持久化功能, 这个功能可以将 Redis 在内存中的数据库状态保存到磁盘里面,避免数据意外丢失.RDB 持久化功能所生成的 RDB 文件是一个通过压缩的二进制文件,通过改文件可以还原成 RDB 文件生成时的数据库状态.SAV...

2020-02-19 16:32:01 123

原创 Redis设计与实现 笔记 第九章 数据库

数据库本章主要是围绕着 redisServer 结构简单的介绍了一下大致情况,包括客户端切换数据库的方法,数据库保存键值对的方法,以及真对数据的添加,查看,删除,更新操作的实现方法等,还包括键的过期处理,事件的通知,9.1 服务器中的数据库struct redisServer { /* General */ // 配置文件的绝对路径 char *configfi...

2020-02-18 16:43:56 203

原创 Redis设计与实现 笔记 第八章 对象

对象对象这一章节可以理解为前面七个章节的总结篇,仿佛是我在前七章中获取了七个拼图,而这一章中,我们将使用七章拼图来进行实际的拼接操作.Redis 并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创造了一个对象系统,每种对象都用到了至少一种我们前面所介绍的数据结构.8.1 对象的类型和编码Redis 使用对象来表示数据库中的键和值,每一个键值对都是两个对象,键是一个对象,值...

2020-02-17 21:10:14 193

原创 Redis设计与实现 笔记 第七章 压缩列表

压缩列表压缩列表是列表键和哈希键的底层实现之一,当一个列表键值包含少量列表项,并且每个列表项,要么是小整数,要么是长度比较短的字符串,那么 Redis 就会使用压缩列表来做列表键的底层实现.7.1 压缩列表的构成zlbytes 4字节zltail 4字节zllen 2字节entryX 列表字节entryX 列表字节…zlend 1字节//zlbytes + zlt...

2020-02-16 17:05:27 284

原创 Redis设计与实现 笔记 第六章 整数集合

整数集合整数集合(intset) 是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时, Redis 就会使用整数集合作为集合间的底层实现.6.1 整数集合的实现typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length;...

2020-02-16 02:44:05 108

原创 Redis设计与实现 笔记 第五章 跳跃表

跳跃表跳跃表是一种有序的数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的.跳跃表支持平均 O(logN) , 最坏 O(N) 的复杂度节点查找,还可以通过顺序性操作批量节点.节点整体效率接近红黑树,且代码复杂度低于红黑树.跳表的实现思路也类似于红黑树,区别于红黑树通过大于小于等于某一个节点,跳表是通过判断目标值是否在两个节点之间来确定区间,进而进行范围缩小,...

2020-02-15 21:21:45 86

原创 Redis设计与实现 笔记 第四章 字典

字典字典是 Redis 中相当重要的结构,可以说, Redis 数据库的底层就是用字典实现的,而对数据库的增删改查,也是基于对字典的操作实现的.字典的基本结构如下4.1.1 哈希表/* This is our hash table structure. Every dictionary has two of this as we * implement incremental rehas...

2020-02-15 16:15:01 152

原创 Redis设计与实现 笔记 第三章 链表

链表和链表节点的实现typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value;} listNode;typedef struct list { // 表头节点 ...

2020-02-14 15:51:15 74

原创 Redis设计与实现 笔记 第二章 简单动态字符串

SDS的定义redis使用自定义字符串来替代c语言传统的字符串,struct sdshdr { int len; // 当前字符串长度 int free; // 当前未使用的长度 char buf[]; // 字节数组,用于保存字符串,和 C 语言字符串一样用 '\0' 结尾};可以使用printf("%s",s->buff)来输出1:...

2020-02-14 14:21:43 93

原创 Zeromq 源码全解析(4)

zmq内存分配文件\libzmq\src\yqueue.hpp如何节省内存分配开销怎么优化内存分配,先了解以下内存分配开销流程,分配内存这个操作,在c++使用new,delete关键字,c中使用malloc, free组合关键组,通过传入大小来申请一段连续的内存,当然这里的连续指的是逻辑连续,在物理上不一定是连续的,但是操作系统会帮我们屏蔽掉这些细节,分配给我们一块内存.所以可以得出内存...

2020-02-12 16:29:24 466

原创 Zeromq 源码全解析(3)

ZMQ任务分发设计经典的线程池经典的线程池多数是抢占式在主线程上有个任务池,当有任务进入时,唤醒一个线程进行任务执行,以下是一个简单线程池的代码//首先是一个线程数据,用来控制线程的struct threadData { std::mutex mtx_; //互斥量 std::condition_variable co...

2020-02-09 12:04:41 584

原创 Zeromq 源码全解析(2)

在开始前,建议先阅读一遍Zeromq中文指南https://github.com/anjuke/zguide-cn目的是学习基本的使用方法,以及面对高扩展需求时,Zeromq官方的解决方案有些代码示例接口已经改变,但是不妨碍对Zeromq的理解与使用.关于各APi的介绍会在源代码目录和网页中分别有介绍代码中路径为libzmq\doc网页地址为http://api.zeromq.or...

2020-02-08 11:00:09 1290

原创 写于 2020年2月4日 从事程序员4年

前言自2015年学习编程以来,对编程以及生活中的经历有很多很多想说的,但没有一处合适的平台可以让我可以发泄,现在也是有空,而且在这也没人认识我,就在这说。正文关于收获和大多数现在从事编程的人不同,我并非科班出身,且是在毕业之后自学的编程而且是c++,学习过程也大多数一样,很痛苦,更是有很多收获,最大的收获就是让我拥有了独立思考的能力。网上有种说法,内向的人擅长思考,但这也没什么科学论据,...

2020-02-05 00:12:55 837

原创 Zeromq 源码全解析(1)

全解析日记:https://www.processon.com/view/link/5e1b0b63e4b0f5a7ed0c7f0c以上为大致类的继承结构,可以很明显的看出,虽然类复杂并繁多,但是类之间还是有较清晰的区分,从局部入手,逐层分析,再看整体设计...

2020-01-13 22:09:30 910

原创 CZmq 在windows下的安装

CZmq为在Zeromq之上进行封装的一个API库,也是zguide中提到的头文件库通过阅读README.md可得知有多个安装途径:这里介绍使用vcpkg首先安装vcpkg在 power shell 中执行git clonehttps://github.com/microsoft/vcpkg.\bootstrap-vcpkg.bat执行完后会生成vcpkg.exe...

2020-01-05 11:35:09 778

转载 配置Boost.Asio环境

https://blog.csdn.net/u014454538/article/details/86026206

2019-11-16 15:46:21 257

原创 内存池

什么是内存池在了解内存池之前,首先要知晓内存碎片的概念。内存碎片又分为内部碎片和外部碎片,而内部碎片是由于固定大小的内存分区,当一个进程不能完全使用分给他的固定内存区域时就产生了内部碎片,该种碎片无法完全避免。而外部碎片是因为我们在申请内存时候习惯使用new和malloc,且每次申请的内存大小不一,如果频繁的使用,会导致内存碎片的产生,如我们连续申请了,4,2,4,3,4大小的内存,在...

2019-10-11 23:30:37 197

原创 什么是同步,异步

同步:当发起一个函数调用时,如果函数调用结果没有返回,就一直等待结果不进行下一个函数执行,所以如果函数调用涉及磁盘IO以及网络请求事件,就是一直阻塞直到接收到结果。磁盘IO和网络请求显然是慢于函数调用的,所以当在一段时间内对一个需要进行磁盘UI和网络请求的函数大量调用时,会有大量的慢调用,程序一直阻塞在消息的等待返回再执行后续的调用,导致了效率不高。异步:当发起一个函数调用时,把函数调用拆分成...

2019-09-08 17:57:26 1785

原创 基于魔兽RPG对当前游戏发展趋势的分析,以及尝试一个高游戏性玩法的设计

游戏发展中有这么一束分支,玩家可以从魔兽争霸3:冰封王座基本游戏模式开始延伸,并通过地图编辑器降低游戏开发门槛,创造开发自己的游戏模式,即魔兽RPG。如果客观的看,魔兽RPG符合一个优胜劣汰的进化守则,在2008年左右,当时并没有推广,引流,投放等向玩家群体增加曝光率等的相关手段,所以游戏性几乎成为了在玩家群体中唯一的传播属性,低游戏性的玩法就不会在玩家中传播,但是由于魔兽的画风,受众群体等局...

2019-07-15 23:36:38 1002

原创 算法4:归并排序

https://github.com/yxinyi/algorithm/tree/master归并排序:/*归并排序是基于分治的思想,两个有序的数组进行合并的效率为On所以将所需要排序的数据不断的进行拆分,拆分成单位数量为1的数组,就可以视为该数组为有序的,然后逐级进行合并,最终完成排序用树形结构进行分析,该排序的效率是排序算法的上限,为Nlg(N)*/2.2...

2019-05-11 17:56:41 497

原创 go程序设计语言 第一章

练习1.5,1.6package mainimport ( "image" "image/gif" "image/color" "io" "math" "math/rand" "os")var palette = []color.Color{color.White,color.Black,color.RGBA{0xff,0,0,0xff},

2018-12-02 13:58:01 388

原创 skynet源码解析 skynet_module

#ifndef SKYNET_MODULE_H#define SKYNET_MODULE_Hstruct skynet_context;typedef void * (*skynet_dl_create)(void);typedef int (*skynet_dl_init)(void * inst, struct skynet_context *, const char * par...

2018-09-18 16:27:35 515

原创 skynet 源码解析 message queue

#ifndef SKYNET_MESSAGE_QUEUE_H#define SKYNET_MESSAGE_QUEUE_H#include &lt;stdlib.h&gt;#include &lt;stdint.h&gt;struct skynet_message { uint32_t source; //消息源的句柄 int session; // void * dat...

2018-09-18 16:24:41 445

原创 第九章 广播和本地组播(IGMP和MLD)

引言 IPv4可以使用单播(unicast),任播(anycast),组播(multicast),广播(broadcast) IPv6可以使用单播(unicast),任播(anycast),组播(multicast),不支持广播地址使用 广播和组播为应用程序提供了两种服务: 数据分组交付至多个目的地 有许多应用程序将信息交付至多个收件方,没有广播或组播,这些类型的服务往往倾...

2018-08-30 14:45:56 1604

原创 第八章ICMPv4和ICMPv6 Internet控制报文协议

引言: ICMP负责传递可能需要主义的差错和控制报文 鉴于ICMP能够影响重要的系统功能操作和获取配置信息,黑客们已经在大量攻击中使用ICMP报文,由于担心这种攻击,网络管理员经常会用防火墙封阻ICMP报文,会导致大量的诊断程序将无法正常工作 ICMPv6不仅可以用于错误报告,还可以用于邻居发现ND,与ARP有相同的作用,还能配置主机和管理组播地址的路由器发现RD功能 在IPv4和...

2018-08-29 10:29:33 7224

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除