- 博客(16)
- 问答 (1)
- 收藏
- 关注
原创 redis中epoll事件怎样与读写回调函数绑定
epoll多路分离机制虽然以数组的形式返回所有激活事件的fd及属性(读写),但没有指定对每个事件的操作。事实上,如果需要读写不同激活的fd,只能根据fd、属性来再次判断自己操作的是哪一个事件。在读操作的执行函数一致、写操作的执行函数一致时,这种做法是可行的。但如果读或写操作属性的事件具有不同的执行函数,就不能单纯根据事件的属性决定执行函数了。为了解决这个问题,redis提供了读写回调函数与注册事件...
2019-06-19 09:36:48
1568
2
原创 redis的rehash工作原理
在redis中,键值以哈西表的方式进行存储,在键值对的数目比较多时,哈西值冲突的次数就会变多,这会降低检索效率。为了减少哈西表中的地址冲突次数,redis会增加键值空间,重新定义键值对的映射地址,也就是进行所谓的rehash。本文主要通过redis源码分析rehash原理。主要解决如下几个问题。1,redis中hash表的数据结构是怎样的?2,什么时候开始进行rehash?3,怎样为扩...
2019-06-18 09:38:44
6960
原创 redis客户端连接到服务器的步骤
看了大约3天的redis-cli了,是进行总结的时候了。和大多数客户端连接到服务器一样,redis-cli连接到服务器也主要分为两个阶段,请求连接阶段和数据传送阶段。具体来讲redis-cli做的事情有:1、以socket方式建立连接;2,选择相应的数据库;3,对客户端发送的命令进行编码;4,发送客户端编码的数据(write);5,接收服务器回应的数据(read);6,...
2019-05-20 17:39:25
5486
2
原创 redis下的字符串分割函数
在看redis-cli.c的时候,遇到了字符串分割函数sdssplitargs,我想不就是字符串分割函数吗,我也会写,我到要看看自己写的东西与标准有何不同。一个用C语言写的字符串分割函数需要考虑哪些问题呢?1,分割的字符串用啥存储呢?答案是二重指针,相当于一个字符串数组;2,使用啥函数解决从源字符串复制到新开辟的指针所指向的空间呢?strncpy;3,函数的逻辑问题?嗯,如果遇到‘...
2019-05-20 10:03:16
1327
原创 认识linenoise
在学习redis的client源码的过程中,遇到了linenoise这个函数,知道它是一个处理命令的工具,但它具体能做什么工作,怎样作这些工作还是不清楚。通过查看相关资料,对linenoise的功能及部分使用方法有了初步的认识,下面就让我介绍一下:1,linenoise是个处理指令的交互窗口在redis中,linenoise用在client中,就像是一个交互窗口,在这个窗口中,可以输入指令...
2019-05-18 16:32:02
1569
原创 C语言文件读写
在C语言中,文件的表示符号是整数型的,所以可以通过int定义文件。open可以通过open函数将具体的一个文件与文件描述符连接起来,其中read函数在fcntl.h中定义,如下:int open(const char *path, int oflag, ...);在使用open函数读写时,要首先确定文件的属性,比如后续操作文件时的属性(可写,可读,可追加,可创建)。还需要定义...
2019-01-02 20:31:05
2026
原创 Linux制作动态库
参考文章:https://www.cnblogs.com/jiqingwu/p/linux_dynamic_lib_create.html步骤:1,编写源文件2,编写接口文件3,生成动态库4,生成可执行文件5,添加可以执行文件运行库查找路径 一、编写源文件相当于函数定义int max(int n1, int n2, int n3){ int max...
2018-12-08 14:21:42
1151
原创 C++的异常检测方法(以文件读取为例)
关于C++的异常检测的关键字主要有3个,分别是throw,try,catch。它们的作用如下:throw用于抛出错误,throw invalid_argument("can't open file");try用于尝试执行含有抛出错误的代码;catch用于捕获对应类型的错误对象,catch (invalid_argument& e),由于包含在<stdexcept>中...
2018-12-06 10:00:41
6126
原创 按空格和按换行从文件中提取数据
1,读取文件的类为ifstream,其中“i”代表“in”,针对变量而言,ifstream所在的头文件为fstream;2,ifstream中有open方法,可以打开文件;3,ifstream中有>>方法,可以以空格为分割符,以换行为结束符读取数据;4,iostream中有getline(ifst, strline)方法,可以读取每一行的字符串数据。 以空格为分割符...
2018-12-05 16:18:46
2578
原创 通过pkg-config添加libs和include
首先介绍命令行编译C++项目的方法,指出其问题所在。g++的生成可执行文件语法:g++ -o test test.c -I/home/include -pthread -L/usr/local/lib -llog4cpp其中,1,-I后表示要搜索的头文件的路径,系统默认的搜索路径包括/usr/include、/usr/local/include。添加了/home/include后,...
2018-12-04 21:53:18
2591
原创 为对象动态分配内存
如果类中的数据成员含有指针变量,就需要为指针变量分配动态内存。(通常在编程中,应该尽量避免使用指针,应该用容器替代指针)在本例中,使用二重指针,可以视为一个二维数组,不过该数组的元素个数可变。如下为为指针分配空间的构造函数;//构造函数,创建一个可以指定长度和高度的二维数组SpreadSheet::SpreadSheet(int height, int length){ mCe...
2018-12-04 11:18:43
1775
原创 对象的复制和赋值
对象的复制是在对象声明时进行的操作,而赋值是在声明之后的操作。一般而言,复制的语法为A a(b),A为类,b为已经定义的对象,a为复制b的对象;赋值的语法为A a;a = b;需要先声明对象a,之后再对其进行赋值。有一种特殊的情况,A a=b;虽然是使用了操作符=,但由于是在对象声明时,进行定义,所以依然调用复制方法。下面代码为对象的复制和赋值操作。#include <iost...
2018-12-03 19:40:34
1094
原创 对虚函数的认识
可以在继承类中重写父类的方法,关键字是virtual。如下代码所示,父类是Super,继承类是Sub,在Sub中,重写了Super的go()方法。#include <iostream>using namespace std;class Super{ public : virtual void go() { cout << "go() ca...
2018-11-25 15:26:45
178
原创 strtok函数的使用
函数形式:#include <string.h>char *strtok(char *str, const char *delim);作用:根据某个定界附,将字符串分解成多个部分。方法: 第一次调用该函数时,输入为str,后面再调用该函数时,str为NULL。当分解完成后,函数返回NULL。一个分解字符串,并记录分解次数的例子:...
2018-06-13 11:36:42
2207
原创 字符串二重指针为什么需要动态分配空间
指针的概念:创建一个指针类型的数据,在64位系统中,一个指针类型的数据用8个字节表示。指针类型的数据存储某个数据的地址。编译器,可以根据指针地址处理该地址的数据。问题:字符串指针是指向字符串的指针,初始化字符串指针时,不需要为该字符串指针分配内存;而初始化字符串二重指针时,却需要用malloc为二重指针分配内存?一重字符串指针首先考虑字符串的存储模型,如下图所示。字符串变量s其实是存储...
2018-06-13 10:14:23
1899
2
原创 从一个加减法运算代码理解特殊运算符的重载
class wow(): def __init__(s,x): s.x = x def __add__(s,y): return wow(s.x+y.x) def __sub__(s,y): return wow(s.x-y.x) def __repr__(s): return str(s.x)a=wo
2017-11-29 15:55:15
380
空空如也
ST F103 system memory最后8个word含义请教
2021-10-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人