漫话专题

漫话Kubernetes的网络架构,该用NodePort还是Ingress还是load balancer?

目录 一、基本概念 1. Kubernetes pod 2. Kubernetes service 3. Kubernetes NodePort 4. Kubernets Ingress 5. Kubernetes loadbalancer 二、从实际需求谈Kubernetes引入的各种网络概念 问题No 1:NodePort和Ingress好像实现原理差不多,有了NodePort

第一章漫话自动化测试

1-1 课程概述 1-2课程大纲简介 http://naotu.baidu.com/file/889ebdcfcfb2a4d46a1956f2c7f9c9cb?token=705f8fde5fabab81 1-3揭开自动化测试神秘面纱 http://naotu.baidu.com/file/3f9099437e3f7f708f519b58a80d3d0a?token=ab700ae53a

漫话Redis源码之三十六

这里主要是Pubsub相关的API, 大致看看就行,知道他的功能就基本差不多了: #include "server.h"int clientSubscriptionsCount(client *c);/*-----------------------------------------------------------------------------* Pubsub client repl

漫话Redis源码之三十五

早年我写代码时候,也喜欢用#if 0来调试,现在不用了。如下代码主要是跟优化level相关: #ifndef REDIS_STATIC#define REDIS_STATIC static#endif/* Optimization levels for size-based filling.* Note that the largest possible limit is 16k, so e

漫话Redis源码之三十四

这种代码,基本很难看,及时搞懂了细节,也没啥用。针对这种函数,最关键点是知道他的功能,而不是细节。 #include <stdint.h>#define N 16#define MASK ((1 << (N - 1)) + (1 << (N - 1)) - 1)#define LOW(x) ((unsigned)(x) & MASK)#define HIGH(x) LOW((x) >> N

漫话Redis源码之三十三

第一个函数是分配新的rax,  返回的是指针。这个函数对异常的考虑也还很全,如果获取不到内存,就返回NULL /* Allocate a new rax and return its pointer. On out of memory the function* returns NULL. */rax *raxNew(void) {rax *rax = rax_malloc(sizeof(*r

漫话Redis源码之三十二

关于report相关的函数,非核心逻辑。我一般是直接忽略,不纠结。这样对理解整个代码也有好处,该忽略就忽略,该屏蔽就屏蔽: #ifdef __GNUC__void rdbReportError(int corruption_error, int linenum, char *reason, ...) __attribute__ ((format (printf, 3, 4)));#endif

漫话Redis源码之三十一

这里没什么特别的,考大家一个问题,为什么在mstime中需要加long long转化?是为了溢出,这里做得非常专业,我曾经踩过这个坑: typedef struct _client {redisContext *context;sds obuf;char **randptr; /* Pointers to :rand: strings inside the command buf

漫话Redis源码之三十

几个读取和函数,挺直接明了,在处理边界问题和异常情况时,尤其要小心: int readLong(FILE *fp, char prefix, long *target) {char buf[128], *eptr;epos = ftello(fp);if (fgets(buf,sizeof(buf),fp) == NULL) {return 0;}if (buf[0] != prefix) {E

漫话Redis源码之二十九

这里主要讲rdb的一些check信息,不是咱们缕清逻辑的重点,不想看的话,可以跳过: struct {rio *rio;robj *key; /* Current key we are reading. */int key_type; /* Current key type if != -1. */unsigned l

漫话Redis源码之二十八

这里主要是一些控制信息,看似复杂,其实还是比较明朗的: /* Cluster Manager Command Info */typedef struct clusterManagerCommand {char *name;int argc;char **argv;int flags;int replicas;char *from;char *to;char **weight;int weigh

漫话Redis源码之八十三

触发并掩码掉给定的fd: static int aeApiLookupPending(aeApiState *state, int fd) {uint_t i;for (i = 0; i < state->npending; i++) {if (state->pending_fds[i] == fd)return (i);}return (-1);}/** Helper function to

漫话Redis源码之八十二

看最后的kqueue, 这是为了兼容不同平台,其实你可以理解为它和select/poll/epoll差不多就行: #include <sys/types.h>#include <sys/event.h>#include <sys/time.h>typedef struct aeApiState {int kqfd;struct kevent *events;/* Events mask fo

漫话Redis源码之八十一

fd_set是网络编程中很重要的结构体,rfds是读描述集, wfds是写描述集合,这是使用需要非常清晰,看最后的select, 知道怎么样了吧: #include <sys/select.h>#include <string.h>typedef struct aeApiState {fd_set rfds, wfds;/* We need to have a copy of the fd s

漫话Redis源码之七十八

bio操作相关的实现,对于线程,互斥量,条件变量,也需要理解清楚哦: #include "server.h"#include "bio.h"static pthread_t bio_threads[BIO_NUM_OPS];static pthread_mutex_t bio_mutex[BIO_NUM_OPS];static pthread_cond_t bio_newjob_cond[

漫话Redis源码之七十七

这里主要讲位域操作,大家要对基本的位操作有深刻的理解: /* The following set.*Bitfield and get.*Bitfield functions implement setting* and getting arbitrary size (up to 64 bits) signed and unsigned integers* at arbitrary positio

漫话Redis源码之七十六

处理非阻塞的client, 整个实现还是比较简单的: /* This function is called in the beforeSleep() function of the event loop* in order to process the pending input buffer of clients that were* unblocked after a blocking op

漫话Redis源码之七十四

SSL大家应该很熟悉,就是为了确保安全的,openssl应该听说过吧: /* Wrapper around redisSecureConnection to avoid hiredis_ssl dependencies if* not building with TLS support.*/int cliSecureConnection(redisContext *c, cliSSLconfi

漫话Redis源码之七十三

加载配置文件中的信息,非重点: /* Load the cluster config from 'filename'.** If the file does not exist or is zero-length (this may happen because* when we lock the nodes.conf file, we create a zero-length one for

漫话Redis源码之七十二

这里主要是枚举和配置相关的: configEnum syslog_facility_enum[] = {{"user", LOG_USER},{"local0", LOG_LOCAL0},{"local1", LOG_LOCAL1},{"local2", LOG_LOCAL2},{"local3", LOG_LOCAL3},{"local4", LOG_LOCAL4},{"loc

漫话Redis源码之一百零七

还不懂多线程使用的朋友,大可借鉴下文中多线程的用法: #define REDISMODULE_EXPERIMENTAL_API#include "redismodule.h"#include <assert.h>#include <stdio.h>#include <pthread.h>#define UNUSED(V) ((void) V)void *sub_worker(void *

漫话Redis源码之一百零六

blocking command相关的操作,简单看一下就行了: #define UNUSED(x) (void)(x)/* Reply callback for blocking command BLOCK.DEBUG */int HelloBlock_Reply(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {UNUSED(

漫话Redis源码之一百零五

fsl相关的代码,都是一些基本的操作: void fsl_rdb_save(RedisModuleIO *rdb, void *value) {fsl_t *fsl = value;RedisModule_SaveUnsigned(rdb,fsl->length);for (long long i = 0; i < fsl->length; i++)RedisModule_SaveSigned(

漫话Redis源码之一百零二

本模块主要实现defrag回调机制,可以细看一下,还挺巧妙的: /* A module that implements defrag callback mechanisms.*/#define REDISMODULE_EXPERIMENTAL_API#include "redismodule.h"static RedisModuleType *FragType;struct FragObjec

漫话Redis源码之一百零一

这里仍是redis module相关的代码,带看redis源码时,建议略看这一看,不重要的东西: #define REDISMODULE_EXPERIMENTAL_API/* define macros for having usleep */#define _BSD_SOURCE#define _DEFAULT_SOURCE#include "redismodule.h"#include

漫话Redis源码之九十九

这里是movable keys command的一个sample, 比较简单: #include "redismodule.h"#include <strings.h>#include <assert.h>#include <unistd.h>#include <errno.h>#define UNUSED(V) ((void) V)/* A sample movable keys co