golang 设计模式之简单工厂模式

简单工厂模式(Sample Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图:提供一个创建对象的工厂,工厂类函数会根据不同的参数创建实现了同一接口的不同产品类。 解决问题:主要解决接口选择的问题 优点 如果要创建一个产品对象只要知道其名字就可以了,不需要关心具体实现 可扩展,只需要实现一个产品类就可以了 缺点 不同的实现都需要实现一个具体的类,提升系统复杂性 新增产品类的时候需要修改创建对象的工厂

设计模式
发布于 5年前

设计模式概述

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与

设计模式
发布于 5年前

从零学习redis(16)--- 源码阅读之链表

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
发布于 5年前

从零学习redis(15)--- 源码阅读之内存分配

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

redis
发布于 5年前

2018 年终总结

今天距离上次更新博客正好一个月的时间,一是因为我过完年准备换工作这段时间一直在忙于整理项目代码、文档,二是最近没有看什么新的内容(因为我博客其实是当做笔记用的,只是用来记录一些知识点方便以后查询)。今天正好刚开完项目交接会闲下来了就总结一下 2018 年和定一下 2019 年的目标。 2018 年 工作 工作上的内容没什么好说的,没什么大的波澜,做了四个项目,项目主要是公司内部平台并且属于”公司机密“,所以就不详细说了。 总结 前端又会用几个库 ant design、vue、nuxtjs、uikit等 语言学习了 go,看了 dart、rust、zephir,又尝试了 c++ mysql 优

杂谈
发布于 5年前

从零学习redis(14)--- 源码阅读之动态字符串

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

redis
发布于 5年前

从零学习redis(13)--- 源码阅读准备

前面12篇笔记对 redis 基本使用、配置、架构等做了简单的总结,内容没什么特别的都是 redis 基础知识。我是非常喜欢 redis 的,所以后面准备去学习 redis 的源码,并根据自己的理解对 redis 源码分篇章的讲下自己的理解。每篇文章会存在一个迭代的过程,因为我会根据自己的读取进度去同步记录笔记,所以我前期对一些内容的理解可能会存在偏差,所以随着我越往后读可能会矫正前面笔记的一些错误。 源码阅读分解 这里根据 redis 的数据结构及功能对 redis 源码进行分解,目录和书籍 << Redis 设计与实现 >> 的目录一致,中间可能会根据自己的理解

redis
发布于 5年前

网站架构之负载均衡方案

什么负载均衡 当我们单台的服务器无法支持用户请求的时候就需要把机器扩充到几台、几十台甚至几百台,而当用户请求到的时候我们合理的把用户请求分发到各个服务器,这就是负载均衡。负载均衡要理解最重要的一点,我这里用了“合理的分发”而不是平均分发,因为负载均衡并不是简简单单的均分流量,我们需要考虑到不同的服务器硬件配置、网络情况来合理的分配分配流量以达到各个服务器均不超载、合理利用集群资源达到最佳的服务质量。当然当我们用多台服务器做负载均衡时一般会选用相同规格的机器,但是不排除网络延迟、机器突发故障灯引起的单台服务器负载飙升处理能力下降等情况。 网站架构中负载均衡的应用 从图中可以看到网站中对负载均衡

架构
发布于 5年前

MySQL 技术内幕阅读笔记(0)--- InnoDB 体系结构和存储引擎

MySQL 体系结构 从图我们可以看出,MySQL 有如下几部分组成: 连接池组件 管理服务和工具组件 SQL 接口组件 查询优化组件 优化器组件 缓冲组件 插件式存储引擎 物理文件 需要注意存储引擎是基于表的而不是库,比如我们可以在建表的时候为表指明存储引擎。 MySQL 存储引擎 常见存储引擎 InnoDB MySQL 5.5.8 版本之后的默认存储引擎,事务性,行锁,支持外键。 MyISAM 存储引擎不支持事务、表锁,支持全文索引,主要面对一些 OLAP 数据库应用。MySQL 5.5.6 版本之前的默认存储引擎。 NDB 存储引擎是一个集群存储引擎。 Memory 存储引擎将表

MySQL
发布于 5年前

从零学习redis(12)--- 大量导入数据

有时候我们需要在短时间内往 redis 里插入大量的数据,我们如果单条单条的出入会浪费很多时间和服务器资源,我们可以使用管道来实现快速的插入。 netcat 我们把需要插入 redis 的数据创建为如下的一个命令集文件 set key1 val1 set key2 val2 ... set key3 val3 我们使用如下命令执行数据导入 > $ cat /tmp/test|nc localhost 6379 +OK +OK +OK pipe mode 使用 netcat 并不是一个可靠地方式,因为用netcat进行大规模插入时不能检查错误。从Redis 2.6开始redis-cli支

redis
发布于 5年前