源码

Redis客户端Lettuce源码【四】Lettuce是如何断线重连的

风流意气都作罢 提交于 2020-01-25 22:04:43
上一篇主要介绍了RedisCommand在Lettuce中是如何流转的,以及Lettuce是如何通过单一连接处理多线程请求的。这一篇主要介绍一下Lettuce中是如何实现Redis断线重连的,在介绍之前先看一张图回忆一下RedisComman流转过程中牵扯到的几个类,以及类之间的关系。 如上图所示RedisCommand在Lettuce中经历了如下流程: RedisAsyncCommands调用StatefulRedisConnectionImpl的dispatch StatefulRedisConnectionImpl调用DefaultEndpoint的writeCommand 与Redis连接正常,autoFlush为true是,DefaultEndpoint会直接把Command通过Netty的channel发送出去 Netty收到RedisCommand之后,会在EventLoop中回调我们的初始化Bootstrap时配置的CommandHandler的write方法,在这个write方法中CommandHandler会把RedisCommand放入stack(双向队列)的尾部 把RedisCommand序列化之后发送给Redis Netty在收到Redis的response之后会在EventLoop中回调CommandHandler的channelRead方法

redis 5.0.7 源码阅读——双向链表

戏子无情 提交于 2020-01-25 19:35:35
redis中动态字符串sds相关的文件为:adlist.h与adlist.c 一、数据结构 redis里定义的双向链表,与普通双向链表大致相同 单个节点: 1 typedef struct listNode { 2 struct listNode *prev; 3 struct listNode *next; 4 void *value; 5 } listNode; 链表: 1 typedef struct list { 2 listNode *head; 3 listNode *tail; 4 void *(*dup)(void *ptr); 5 void (*free)(void *ptr); 6 int (*match)(void *ptr, void *key); 7 unsigned long len; 8 } list; 链表以函数指针的方式,实现了复制、销毁与比较的方法的多态。 迭代器: 1 typedef struct listIter { 2 listNode *next; 3 int direction; 4 } listIter; 迭代器中有个成员变量direction,用于表示当前遍历的方向。 大致结构: 1 /* 2 +-------------------+ +----------------> +--------------+ <-------+ 3

Linux4.0源码目录组成

依然范特西╮ 提交于 2020-01-25 18:00:52
Linux4.0源码目录组成 前言 arch block crypto documentation drivers fs include以及linux/include init ipc kernel lib mm net scripts security sound usr 前言 本文主要阐述linux4.0源码目录的组成,主要包括对arch,block,crypto,documentation,drivers,fs,include,init,ipc,kernel,lib,mm,net,scripts,security,sound,usr,include这些文件夹的介绍。 arch 包含了和硬件体系结构相关的代码,如arm,mips,powerpc等。 对应架构的目录内,有适用于该架构的芯片驱动。 block 块设备驱动程序I/O调度。 crypto 常用的加密、散列、压缩以及CRC校验算法。 documentation 内核各部分的通用注释 drivers 设备驱动程序,如char、block、net、mtd、i2c、spi等 fs 所支持的文件系统,如EXT,FAT,JFFS2等。 include以及linux/include 内核中所需要的头文件。 init 内核初始化代码。初始化的开始位于init/main.c ipc 进程间通信的代码 kernel 内核核心部分

centos7 yum安装、Ubuntu1804源码编译安装NGINX 笔记

只愿长相守 提交于 2020-01-25 15:34:42
文章目录 简介: Centos 7 yum安装nginx 1.官方下载步骤: 2.EPEL源下载Nginx Ubuntu1804编译安装nginx: 1.手动加载编译环境 2.相关程序包 3.下载源码包 4.安装的先决条件 5.添加编译参数: 6.验证版本及编译参数: 7.Nginx自启动脚本配置 验证Nginx⾃启动脚本: 绝对路径启动 四大目录: conf: html: logs: sbin: 安装小记 1.PID文件位置 2.nginx启动报错范例: 命令使用示例: 简介: Nginx是当下作为流行和方便使用的 web 服务器和负载均衡器 Centos 7 yum安装nginx 1.官方下载步骤: 安装的先决条件 # sudo yum install yum-utils 要设置yum存储库,请创建/etc/yum.repos.d/nginx.repo 包含以下内容的文件 : [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx

[Abp 源码分析]十一、权限验证

有些话、适合烂在心里 提交于 2020-01-25 14:48:56
0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证。在 Abp 框架内部,权限分为两块,一个是功能(Feature),一个是权限项(Permission),在更多的时候两者仅仅是概念不同而已,大体处理流程还是一样的。 由于 Abp 本身是针对多租户架构进行设计的,功能是相对于租户而言,比如针对 A 租户他每月的短信发送配额为 10000 条,而针对 B 租户其配额为 5000 条,可能 C 租户该功能都没有开通。 本篇文章仅针对基本的验证机制进行解析,后续文章会进行详解。 0.1 验证流程图 1.启动流程 1.1 流程图 1.2 代码流程 首先在注入 Abp 框架的时候,通过注入过滤器一起将权限验证过滤器进行了注入。 internal static class AbpMvcOptionsExtensions { // ... 其他代码 private static void AddFilters(MvcOptions options) { // ... 其他注入的过滤器 options.Filters.AddService(typeof(AbpAuthorizationFilter)); // ... 其他注入的过滤器 } // ... 其他代码 } Abp 除了拦截验证 API 接口

使用那各VUE的打印功能(print.js)出现多打印一个空白页的问题

心已入冬 提交于 2020-01-25 11:59:31
最近这段时间,用VUE写东西,有个打印功能。 百度了一下,铺天盖地的VUE打印的两种实现方法。 很感激这些千篇一律的帖子,虽然不知道他们是否真的用过,还是只是复制粘贴。 至少这些帖子告诉我,是有两个可以选择的,并且多看几篇帖子,总算把这两个打印方法,都试了一遍。 下面简单总结一下: 先说结论:请使用第二种方法,下载print.js到本地,然后放到项目中导入。原因后边说。 一、使用vue-print-nb方法 具体的使用这里就不详细说明了,因为网上真的太多太多了。千篇一律的。 在本地直接npm安装一下就好。按照步骤一点一点来。 然后在自己项目的配置文件里import进来就可以了。 使用就更简单了。选好区域直接调用即可。 打印效果超出预期的好。感谢这个插件的作者! 二、使用print.js方法 这个简单的程度更不用说了。就是一个JS下载下来,直接放到项目中(libs目录) 然后同样import导入,并use就可以使用了。 使用方法同样简单,只是写法上看着比第一种感觉上low那么一丢丢,但是真的是超级的简单好用哦。 同时,效果上和第一个基本上一模一样。 使用说完了,说说问题吧。 对比: 1、安装和使用 方法一,需要npm安装,说简单也简单,说复杂也复杂。并且所有项目参与者都要安装,否则会报错。 方法二,不需要做什么,只要有一个搞到项目中,其他人版本库中拉代码即可。维护简单方便。 2

为什么要看源码、如何看源码,高手进阶!

十年热恋 提交于 2020-01-25 10:26:01
正文 今天来简单总结一下对为什么要看源码、如何看源码这两个问题的思考。原文地址:https://www.cnblogs.com/xybaby/p/10794700.html 看源码的意义 看源码只是一种方法、手段,而不是目的。我也曾经给自己制定过“阅读xxx源码”的目标,现在看起来真的很蠢,一点不smart(specific、measurable、attainable、relevant、time-bound)。只有搞清楚了阅读代码的目标,才能有的放矢,抓住重点,高效达成任务。 看源码的意义总结起来包含但不限于以下几点: 第一:解决问题(BUG) 只要是代码,就会有bug,只是说bug的多与少、深与浅罢了。现在大家都喜欢发布、使用开源项目,不同的开源项目社区成熟度、代码质量又会有较大的差异,遇到bug就不足为奇了。 当然,遇到bug肯定是先在网上搜索是否有类似的问题,一般可以在google、Stack Overflow、项目的issues里面有对应的关键词搜索。如果搜不到,那么就只能看源码解决了 第二:知其所以然 我在如何学习新技术、团队技术选型时要注意些什么里面提到过,如果我们需要将一个开源项目用到自己的项目中,那么就必须了解这项项目的优缺点,并深知原理,对部分细节(尤其是项目的优势、feature)进行深入研究。如果是成熟的开源项目,遇到问题也许能google到很多答案

Nginx内存池源码解读

孤街醉人 提交于 2020-01-25 08:13:08
首先解释一下Nginx内存池的结构: 内存池接口概览 //内存池创建,重置和销毁 ngx_pool_t * ngx_create_pool ( size_t size , ngx_log_t * log ) ; void ngx_destroy_pool ( ngx_pool_t * pool ) ; void ngx_reset_pool ( ngx_pool_t * pool ) ; //内存分配 void * ngx_palloc ( ngx_pool_t * pool , size_t size ) ; void * ngx_pnalloc ( ngx_pool_t * pool , size_t size ) ; void * ngx_pcalloc ( ngx_pool_t * pool , size_t size ) ; void * ngx_pmemalign ( ngx_pool_t * pool , size_t size , size_t alignment ) ; ngx_int_t ngx_pfree ( ngx_pool_t * pool , void * p ) ; //内存池clean资源 ngx_pool_cleanup_t * ngx_pool_cleanup_add ( ngx_pool_t * p , size_t size ) ; void

linux下使用g++编译cpp工程

浪尽此生 提交于 2020-01-25 08:01:10
C++ 编程中相关文件后缀 1. 单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: 1 /* helloworld.cpp */ 2 #include <iostream> 3 int main(int argc,char *argv[]) 4 { 5 std::cout << "hello, world" << std::endl; 6 return(0); 7 } 程序使用定义在头文件 iostream 中的 cout ,向标准输出写入一个简单的字符串。该代码可用以下命令编译为可执行文件: 1 $ g++ helloworld.cpp 编译器 g++ 通过检查命令行中指定的文件的后缀名可识别其为 C++ 源代码文件。编译器默认的动作:编译源代码文件生成对象文件 (object file) ,链接对象文件和 libstdc++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out 。程序可以这样来运行: 1 $ ./a.out 2 3 hello, world 更普遍的做法是通过 -o 选项指定可执行程序的文件名。下面的命令将产生名为 helloworld 的可执行文件: 1 $ g++ helloworld.cpp -o helloworld

Java Agent入门实战(二)-Instrumentation源码概述

梦想的初衷 提交于 2020-01-25 07:48:07
Instrumentation接口设计初衷是为了收集Java程序运行时的数据,用于监控运行程序状态,记录日志,分析代码用的。接下来从源码的流程来介绍一下 实现类InstrumentationImpl的 void addTransformer(ClassFileTransformer transformer, boolean canRetransform); 从这段代码知道,转换器ClassFileTransformer的实现是存储在TransformerManager的TransformerInfo数组中的,数组初始长度为0,每添加一个,数组长度为原来的长度+1,将原数组内容拷贝到新数组中。 VirtualMachine.attach 进入 AttachProvider.providers() ,这里面会初始化 AttachProvider ,并返回一个 AttachProvider List 。 进入 ServiceLoader.load(AttachProvider.class, AttachProvider.class.getClassLoader()); 继续跟进方法 new LazyIterator(service, loader) 看一下 com.sun.tools jar包下的 META-INF/services/ 目录,打开 com.sun.tools.attach