c++
江江蒋
这个作者很懒,什么都没留下…
展开
-
redis对象编码源码阅读——有序集合编码和转码
redis对象编码源码阅读——有序集合编码和转码1. 有序集合对象的编码类型类型编码对象REDIS_ZSETREDIS_ENCODING_ZIPLIST使用压缩列表对象实现的有序集合对象REDIS_ZSETREDIS_ENCODING_SKIPLIST使用跳跃表和字典实现的有序集合对象2. 两种编码的转换void zsetConvert(robj *zobj, int encoding) { zset *zs; zskiplistNode *n原创 2020-12-06 15:52:40 · 280 阅读 · 0 评论 -
redis自顶向下源码阅读(十二)——读取 RDB 文件2
redis自顶向下源码阅读(十二)——读取 RDB 文件21. 读取value/* Read value */// if ((val = rdbLoadObject(type,&rdb)) == NULL) goto eoferr;/* Load a Redis object of the specified type from the specified file.* On success a newly allocated object is returned, otherwise原创 2020-12-05 21:48:33 · 358 阅读 · 0 评论 -
字节日常实习三面
游戏中台三面2020/12/3/15: 05(45分钟)问基本情况自我介绍实习经历做了什么东西遇到了什么困难学到了什么东西项目经历:描述项目有想过怎么改进吗redis数据结构说一下跳表跳表的效率集群相关(不知道)写个sql,在某段时间内0109-0111之间,每天的销售额最高的商品(group不熟,其他的写出来了,没写完)从n大小的数据中等概率取出m个数讲出了步骤,但是没记住证明过程(面试前看了这道题,但是偷懒没记证明)面试官:你原创 2020-12-03 21:41:14 · 1118 阅读 · 1 评论 -
字节日常实习一面
字节游戏中台一面2020/12/1/14:00(一个小时)闲聊自我介绍:只说了学校实习时间上一段实习时间(两个月?)实习经历实习经历++++++++++++++++++++++++++++++++++++用的数据库,mysqlmysql你一般用的什么存储引擎:默认那个innodb事务的四种隔离性:未提交读提交读可重复读序列化序列化解决了什么问题:幻读什么是幻读用什么实现了可重复读:mvcc具体讲一讲mvcc版本链原创 2020-12-01 17:12:22 · 1183 阅读 · 0 评论 -
字节日常实习二面
游戏中台二面2020/12/3/14: 00/一小时自我介绍自我介绍C++新特性介绍一下c++11新特性:lambda表达式、智能指针、类型转换、右值引用什么类型转换:static_cast, const_cast这些这些和强(制)转(换)有什么区别:封装了错误处理吧,具体的我也不太清楚了还有其他特性吗(提示:关键字):哦哦,还有类型推导那个。可以拼出来吗:de(**)type,中间两个字符不太记得了。。。那新的遍历方式知道吗:哦哦,auto,它可以直接推断出右边的类型它有哪些作用原创 2020-12-03 21:37:18 · 1173 阅读 · 0 评论 -
redis对象编码源码阅读——集合编码与转码
redis数据结构源码阅读——集合编码与转码1. 集合对象的编码类型类型编码对象REDIS_SETREDIS_ENCODING_INTSET使用整数集合实现的集合对象REDIS_SETREDIS_ENCODING_HT使用字典实现的集合对象2. 集合的转码过程/* Convert the set to specified encoding. The resulting dict (when converting * to a hash table) is p原创 2020-11-26 16:34:53 · 163 阅读 · 0 评论 -
redis自顶向下源码阅读(十一)——读取 RDB 文件1
redis自顶向下源码阅读(十一)——读取 RDB 文件11. 声明变量int rdbLoad(char *filename) { uint32_t dbid; int type, rdbver; redisDb *db = server.db+0; char buf[1024]; long long expiretime, now = mstime(); FILE *fp; // 专门用于 io 的数据结构 rio rdb; /原创 2020-11-17 22:55:13 · 374 阅读 · 0 评论 -
redis对象编码源码阅读——列表对象编码与创建
redis数据结构源码阅读——列表对象编码与创建1. 列表对象的编码类型类型编码对象REDIS_LISTREDIS_ENCODING_ZIPLIST使用压缩列表对象实现的列表对象REDIS_LISTREDIS_ENCODING_LINKEDLIST使用双端链表实现的列表对象摘自《Redis设计与实现》第63页2. 双端链表对象的创建robj *createListObject(void) { list *l = listCreate();原创 2020-11-17 21:48:40 · 150 阅读 · 0 评论 -
redis对象编码源码阅读——字符串编码过程
redis数据结构源码阅读——字符串编码过程对于RAW类型的字符串,需要进一步进行编码,判断它是不是可以表示为整型数;更进一步地,看它能否成为共享变量。当然这都是为了节约内存。/* Try to encode a string object in order to save space */robj *tryObjectEncoding(robj *o) { long value; sds s = o->ptr; size_t len;1. 判断是不是能编码原创 2020-11-17 00:41:23 · 466 阅读 · 0 评论 -
redis对象编码源码阅读——字符串编码与创建
redis数据结构源码阅读——字符串的创建1. 创建字符串对象在创建字符串对象的时候,有两种创建方式,一种是EMBSTR,一种是RAW.REDIS_ENCODING_EMBSTR_SIZE_LIMIT是一个比较小的值39。所以两者最大的区别就是长度。EMBSTR表示短字符串,RAW表示长字符串。robj *createStringObject(char *ptr, size_t len) { if (len <= REDIS_ENCODING_EMBSTR_SIZE_LIMIT)原创 2020-11-17 00:25:45 · 246 阅读 · 0 评论 -
redis自顶向下源码阅读(十)——加载 AOF 文件
redis自顶向下源码阅读(十)——读取 AOF 文件1. 检查 linux 中的内存设置 // #ifdef __linux__ // linuxMemoryWarnings(); // #endifvoid linuxMemoryWarnings(void) { if (linuxOvercommitMemoryValue() == 0) { redisLog(REDIS_WARNING,"WARNING overcommit_memory i原创 2020-11-10 21:50:14 · 277 阅读 · 0 评论 -
redis自顶向下源码阅读(九)——设置进程名
redis自顶向下源码阅读(九)——设置进程名1. 设置进程名把进程名设置成“argv[0] bindaddr[0]:port mode"的形式,便于ps查询和观看// redisSetProcTitle(argv[0]);void redisSetProcTitle(char *title) {#ifdef USE_SETPROCTITLE char *server_mode = ""; if (server.cluster_enabled) server_mode = " [原创 2020-11-10 14:14:14 · 280 阅读 · 0 评论 -
redis自顶向下源码阅读(八)——初始化监听
把第一个地址设为 0.0.0.0int listenToPort(int port, int *fds, int *count) { int j; /* Force binding of 0.0.0.0 if no bind address is specified, always * entering the loop if j == 0. */ // 如果没有指定绑定地址,则强制绑定为 0.0.0.0 if (server.bindaddr_count ==原创 2020-11-06 21:31:09 · 184 阅读 · 0 评论 -
redis自顶向下源码阅读(七)——服务器初始化
1. 信号量操作忽略两个信号量 signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN);SIGHUP: hong up,挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。SIGPIPE: 对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.SIG_IGN: 表示对前面的信号量参数进原创 2020-11-05 23:27:25 · 222 阅读 · 0 评论 -
redis自顶向下源码阅读(六)——守护进程启动
1. 进行与守护进程有关的预处理如果配置文件中要求已守护进程启动redis,则进行守护进程的一些预处理。摆脱父进程把 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO重定位到"/dev/null"文件中。void daemonize(void) { int fd; if (fork() != 0) exit(0); /* parent exits */ setsid(); /* create a new session */原创 2020-11-05 15:58:05 · 125 阅读 · 0 评论 -
redis自顶向下源码阅读(五)——加载配置
redis自顶向下源码阅读(五)——加载配置1. 判断是不是查看version或help /* Handle special options --help and --version */ if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) version(); if (strcmp(argv[1], "--help") == 0 ||原创 2020-10-30 16:45:22 · 189 阅读 · 0 评论 -
redis自顶向下源码阅读(四)——哨兵设置
redis自顶向下源码阅读(四)——哨兵设置1. main 函数代码 /* We need to init sentinel right now as parsing the configuration file * in sentinel mode will have the effect of populating the sentinel * data structures with master nodes to monitor. */ /* 我们现在需要初始化原创 2020-10-30 16:44:01 · 114 阅读 · 0 评论 -
redis自顶向下源码阅读(三)——配置初始化
redis自顶向下源码阅读(三)——配置初始化initServerConfig()1. 设置服务器运行 IDgetRandomHexChars()用SHA1加密算法对ID进行加密,确保每个服务器的ID都不一样。即如果ID不同,那么它肯定是另一台服务器,或者是同一台机器重启了。void getRandomHexChars(char *p, unsigned int len) { char *charset = "0123456789abcdef"; unsigned int原创 2020-10-29 22:18:41 · 198 阅读 · 0 评论 -
redis自顶向下源码阅读(二)——服务器初始化
redis自顶向下源码阅读(一)——服务器初始化先放出主函数前面一段的代码int main(int argc, char **argv) { struct timeval tv; /* We need to initialize our libraries, and the server configuration. */#ifdef INIT_SETPROCTITLE_REPLACEMENT spt_init(argc, argv);#endif setlocal原创 2020-10-29 19:43:28 · 201 阅读 · 0 评论 -
redis自顶向下源码阅读(一)——序
redis自顶向下源码阅读(一)——序九月份回到学校,把《redis设计与实现》读完之后,觉得自己只是把理论知识泛泛地了解了一下,很多底层的实现(真正的代码部分)还是不够了解。所以,决定直接对源码进行阅读和博客记录。不知道需要花费多少时间哈哈。完成这部分计划就决定去面实习。gogogoredis版本redis3.0阅读的初步计划个人习惯喜欢从头到尾穿起来读,比较有连续性,所以采用自顶向下的阅读顺序,从主函数开始,一步一步地进入代码的逻辑。初步看了一下 redis.c 主函数,大概分为以下几个部分原创 2020-10-29 14:26:16 · 172 阅读 · 0 评论 -
google gflags命令行参数处理(c++)
google gflags介绍它可以直接从命令行中提取预定义好的参数。宏定义例子:// test.cpp#include <gflags/glags.h>// 三个参数:1.定义的参数名;2.默认值;3.提示语句DEFINE_string(query, "", "The keyword you need to query");DEFINE_uint64(search_type, 0, "It is the businessType. You can see the details原创 2020-07-24 11:42:36 · 335 阅读 · 0 评论 -
c++ Json文件处理
Json库Json::ValueJson::Reader()Json::Write()Json::Valuejson的数据类型,类似于map,但是不用指定key和value的类型。mentor说key不要为中文Json::Reader()常用函数parse(),使用方法如下// s为一个字符串格式的json数据;Json::Value json_data;// 这里把字符串直接转换为json格式Json::Reader().parse(s, json_data);// 然后就原创 2020-07-24 11:20:49 · 729 阅读 · 0 评论