嵌套循环性能
下面有两个函数,猜一下哪一个执行的快 func nestFor1() { a := 0 for i := 0; i < 10000000; i++ { for j := 0; j < 2; j++ { a = a + i a = a + j } } } func nestFor2() { a := 0 for i := 0; i < 2; i++ { for j := 0; j < 10000000; j++ {
下面有两个函数,猜一下哪一个执行的快 func nestFor1() { a := 0 for i := 0; i < 10000000; i++ { for j := 0; j < 2; j++ { a = a + i a = a + j } } } func nestFor2() { a := 0 for i := 0; i < 2; i++ { for j := 0; j < 10000000; j++ {
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 介绍 意图:提供一个创建一系列相关或则相互依赖对象的接口,而无需指定他们依赖的类。 解决问题:主要解决接口选择的问题 优点:调用方面向接口编程,不用关心具体实现 缺点:扩展新的产品复杂,新增一个新产品需要修改工厂接口和所有工厂类 可应用场景 系统主题:比如一个游戏主题分为男生主题、女生主题 实现 以系统主题为例 结构 代码 游戏颜色 // 颜色接口 type Color interface {
简单工厂模式(Sample Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图:提供一个创建对象的工厂,工厂类函数会根据不同的参数创建实现了同一接口的不同产品类。 解决问题:主要解决接口选择的问题 优点 如果要创建一个产品对象只要知道其名字就可以了,不需要关心具体实现 可扩展,只需要实现一个产品类就可以了 缺点 不同的实现都需要实现一个具体的类,提升系统复杂性 新增产品类的时候需要修改创建对象的工厂
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与
redis 内部链表的实现比较简单,包括 3 个结构体: src/adlist.h typedef struct listNode { struct listNode *prev; // 前一个节点指针 struct listNode * next; // 后一个节点指针 void *value; // 节点值 } listNode; typedef struct listIter { listNode *next; // 下一个节点 int direction; // 遍历的方向(从头到尾或反向) } listIter; typedef struct list {
redis 中内存管理没有直接使用 C 语言提供的方法而是做了一个可管理已分配内存大小及添加了自己分配策略的实现,下面从 SDS 开始去了解 redis 的内存管理实现及策略。 SDS 内存管理函数定义如下: src/sdsalloc.h #include "zmalloc.h" #define s_malloc zmalloc #define s_realloc zrealloc #define s_free zfree s_malloc 内存申请、s_realloc 内存重新分配、s_free 内存释放,这里定义分别是 zmalloc.h 里三个函数的别名,而 zmalloc zrea
今天距离上次更新博客正好一个月的时间,一是因为我过完年准备换工作这段时间一直在忙于整理项目代码、文档,二是最近没有看什么新的内容(因为我博客其实是当做笔记用的,只是用来记录一些知识点方便以后查询)。今天正好刚开完项目交接会闲下来了就总结一下 2018 年和定一下 2019 年的目标。 2018 年 工作 工作上的内容没什么好说的,没什么大的波澜,做了四个项目,项目主要是公司内部平台并且属于”公司机密“,所以就不详细说了。 总结 前端又会用几个库 ant design、vue、nuxtjs、uikit等 语言学习了 go,看了 dart、rust、zephir,又尝试了 c++ mysql 优
redis 内部字符串没有使用 c 语言传统字符串表示而是用了自己定义的 SDS(simple dynamic string 动态字符串)类型, SDS 相关的定义在 src/sds.h src/sds.c 中,redis 一共定义了以下五种 SDS: sds.h struct __attribute__ ((__packed__)) sdshdr5 { unsigned char flags; /* 低三位标识类型,高五位存储字符串长度 */ char buf[]; }; struct __attribute__ ((__packed__)) sdshdr8 { uint8_t
前面12篇笔记对 redis 基本使用、配置、架构等做了简单的总结,内容没什么特别的都是 redis 基础知识。我是非常喜欢 redis 的,所以后面准备去学习 redis 的源码,并根据自己的理解对 redis 源码分篇章的讲下自己的理解。每篇文章会存在一个迭代的过程,因为我会根据自己的读取进度去同步记录笔记,所以我前期对一些内容的理解可能会存在偏差,所以随着我越往后读可能会矫正前面笔记的一些错误。 源码阅读分解 这里根据 redis 的数据结构及功能对 redis 源码进行分解,目录和书籍 << Redis 设计与实现 >> 的目录一致,中间可能会根据自己的理解
什么负载均衡 当我们单台的服务器无法支持用户请求的时候就需要把机器扩充到几台、几十台甚至几百台,而当用户请求到的时候我们合理的把用户请求分发到各个服务器,这就是负载均衡。负载均衡要理解最重要的一点,我这里用了“合理的分发”而不是平均分发,因为负载均衡并不是简简单单的均分流量,我们需要考虑到不同的服务器硬件配置、网络情况来合理的分配分配流量以达到各个服务器均不超载、合理利用集群资源达到最佳的服务质量。当然当我们用多台服务器做负载均衡时一般会选用相同规格的机器,但是不排除网络延迟、机器突发故障灯引起的单台服务器负载飙升处理能力下降等情况。 网站架构中负载均衡的应用 从图中可以看到网站中对负载均衡