- 博客(35)
- 问答 (2)
- 收藏
- 关注
原创 计算机相关知识点整理
一致性HASH算法https://www.cnblogs.com/lpfuture/p/5796398.html一致性哈希将整个哈希值空间组织成一个虚拟的圆环缓存服务器端本身不提供分布式cache的一致性,而是由客户端来提供,具体在计算一致性hash时采用如下步骤:先求出缓存服务器节点的哈希值,将其配置到0~2^32的圆(continuum)上采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找
2021-02-21 18:59:27 379
原创 Redis知识点整理——用心整理的,不看真的很可惜
数据结构SDSstruct sdshdr{ int len; // 已使用字节,不包括最后一位 \0 int free; // 未使用字节 char buf[]; // 保存字符串,最后一位为 \0}最后一位为 \0 的好处,可以复用一部分C字符串函数库里面的函数SDS与C字符串的区别常数复杂度获取字符串长度:时间复杂度由O(N)降到O(1)杜绝缓冲区溢出:对SDS修改时会先检查实际空间是否满足需求,如果不够,将扩展空间预分配:减少修改字符串时带来的内存重分配次
2021-02-03 19:55:25 381
原创 安装gRPC(2020-11-15亲测)
下载gRPC源码和相关子模块git clone https://github.com/grpc/grpc.gitcd grpcgit submodule update --init #要很久很久...编译安装protobuf[root@localhost grpc]# cd third_party/protobuf/[root@localhost protobuf]# ./autogen[root@localhost protobuf]# ./configure[root@localhos
2020-11-15 14:48:54 1036 1
原创 Redis设计与实现详解四:其他单机功能
发布与订阅Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscriber):每当有其他客户端向被订阅的频道发送消息(message)时,频道的所有订阅者都会收到这条消息客户端还可以通过执行PSUBSCRIBE命令订阅一个或多个模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会被发送给这个频道的所有订阅者,它还会被发送给所有与这个频道相
2020-08-26 21:54:19 243 1
原创 Redis设计与实现详解三:多机功能实现
复制在Redis中,用户可以通过执行命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave)进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种现象称作“数据库状态一致”旧版复制功能的实现Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作:同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库
2020-08-26 21:52:11 379
原创 Redis设计与实现详解二:Redis数据库实现
数据库服务器中的数据库Redis服务器将所有数据库都保存在服务器状态redis .h/redisServer结构的db数组中,db数组的每个项都是一个redis . h/redisDb结构,每个redisDb结构代表一个数据库,在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库struct redisServer { //... redisDb *db; // 一个数组,保存着服务器中的所有数据库 int dbnum; //服务器的数据库数量 //
2020-08-26 21:48:59 654
原创 Redis设计与实现详解一:数据结构与对象
数据结构简单动态字符串Redis自己构建了一种名为简单动态字符串(simple dynamic string,SDS )的抽象类型,并将SDS用作Redis的默认字符串表示当Redis需要是一个可以被修改的字符串值时,Redis就会使用SDS来表示字符串值,比如在Redis的数据库里面,包含字符串值的键值对在底层都是由SDS实现的比如,如果客户端执行命令:redis> RPUSH fruits "apple" "banana" "cherry"(integer) 3那么Redis将在数
2020-08-26 21:43:48 298
原创 c++内存管理(详解allocator、malloc原理)
第一讲 primitives直接挖一大块,然后切分成一小块一小块的,里面放置要存放的对象(减少了调用malloc的次数,也减少了cookie(只用了头和尾的))概述当c++应用程序想获取一块内存时:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLEXNfHo-1595950494072)(C:\Users\1255109002\AppData\Roaming\Typora\typora-user-images\image-20200618164003710.png)
2020-07-28 23:35:54 3095 1
原创 c++重要概念——右值引用
右值引用左值和右值左值:代表一个在内存中占有确定位置的对象(换句话说就是有一个地址),可以出现于operator=左侧者右值:是不在内存中占有确定位置的表达式(临时对象),只能出现于operator=右侧者自从引入了这个右值引用之后,我们把之前通常叫的引用称为左值引用用&&表示右值引用不同左值引用:我们之前所说的别名右值引用:必须绑定到右值的引用A a;A&& a_rref = a; //errorA&& temp_rref = A
2020-07-28 23:33:54 428
原创 c++内存分区详解
内存分区C++的内存划分为栈区、堆区、全局区/静态区、常量存储区、代码区、映射区和一些其他的小东西虚函数表比较特殊,不同的平台存放的位置不同,gcc编译器将虚表放在常量段栈区由系统进行内存的管理说明:主要存放函数的参数、局部变量以及局部常量。栈区由系统进行内存管理,在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为3M。#include<iostream>using namespace std;void t
2020-07-28 23:33:05 486
原创 c++重要概念——多态
态静态多态类模板int Add(int left, int right){ return left + right;}double Add(double left, int right){ return left + right;}int main(){ Add(10, 20); //Add(10.0, 20.0); //这是一个问题代码 Add(10.0,20); //正常代码 return 0;}//我们以前说过的函数重载就
2020-07-28 23:32:30 184
原创 c++关于转换函数的概念及explicit关键字
转换函数和explicit转换函数(类—>基本类型)重载数据类型,如这下面的 double()class Fraction{public: Fraction(int num,int den=1):m_num(num),m_den(den){} operator double() const { return (double)m_num / m_den; }private: int m_num; int m_den;};int main(){ Fraction f(2
2020-07-28 23:30:37 137
原创 c++函数详解
c++函数调用过程https://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601204.html函数指针每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针#include<iostream>using namespace std;int addfunc(int a, int b) { return a + b;}int main() { int (*add)(in
2020-07-27 23:30:06 319
原创 c++中,extern关键字的作用
externextern 变量告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件或本文件当前位置中定义,但是它是在别的文件中或本文件其它位置定义的全局变量,你要放行!”//one.cppint globe = 10;void out(){ cout << "out" << endl;}//two.cppextern int globe;extern void out(); //使用关键字extern声明后可以访问到全局变量及函数int mai
2020-07-27 23:28:38 491
原创 C++4种cast强制类型转换
注意:尽量少使用转型操作,尤其是dynamic_cast,耗时较高,会导致性能的下降,尽量使用其他方法替代。const_cast定义:const_cast转换符是用来移除变量的const或volatile限定符const int constant = 21;const int* const_p = &constant;int* modifier = const_cast<int*>(const_p);*modifier = 7;//传统方式用指针来实现,因为指针之间在类型
2020-07-27 23:24:43 693
原创 C++必须知道的重要概念(学习路线)
一、语法基础指针和引用的关系指针与内存的关系程序编译过程(extern关键字详解,gcc程序的编译过程和链接原理)c++内存模型C语言和C++的区别二、
2020-05-11 23:03:20 208
原创 #pragma once和#ifndef有什么区别呢?
在c++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性,通常有两种方式:#ifndef指令#ifndef __SOMEFILE_H__#define __SOMEFILE_H__ // 声明语句 #endifpragma once指令(建议使用)//写在文件开头#pragma once区别:#ifndef方式是由C++语言的标准支持,在过去比较...
2020-04-18 00:11:14 210
原创 c++中重要概念----初始化列表
构造函数初始化列表(应尽量使用初始化列表)介绍过去的赋值情况class Function{public: Function(int n1, int n2) { num1 = n1; num2 = n2; }private: int num1; int num2;};使用c++的初始化列表class Function{public: Function(i...
2020-04-16 20:45:00 546
原创 c++中重要概念----转换函数
直接看一段代码:#include<iostream>using namespace std;class Fraction{public: explicit Fraction(int num,int dem=1) :numerator(num), denominator(dem){} operator double() const //转换函数 { retur...
2020-04-16 19:28:26 125
原创 c++中重要的关键字----explicit
先看一段代码:#include<iostream>using namespace std;class Function{public: Function(int n) :num(n){}private: int num;};int main(){ Function f = 5; //成立 system("pause"); return 0;}在代...
2020-04-16 19:15:46 109
原创 虚函数的安全问题
由于非public的虚函数也会存在在虚函数表中,可以通过子类的指针很容易调用到该函数#include<iostream>using namespace std;class Base {private: virtual void f() { cout << "Base::f" << endl; };};class Derive : public...
2020-04-16 13:21:39 232
原创 c++的重要概念----引用(左值引用)
引用的实质是指针常量//发现ref是引用,自动转换为 int* const ref = &a;void test(int& ref){ ref = 100;////发现ref是引用,自动转换为 *ref = 100;}int main(){ int a = 10; int& ref = a;//自动转换为 int * const ref = &...
2020-03-30 18:25:40 715
原创 c++空指针和野指针
空指针:定义:是一个被赋值为NULL的指针,它不指向任何的对象或者函数。注意事项:1、使用指针的第一件事就是需要看这个指针是否是空指针(坚决不能使用空指针,否则程序就会崩。意思就是:为一个指针赋值为空指针不会报错,但是在我们想访问的时候会报错(系统不允许我们读取地址为0的数据)判断空指针的方法:if(p!=NULL){};//NULL是空指针的意思//若明确指针该指针有指向,则不需要做判...
2020-03-29 16:27:56 1678
原创 c++中重要概念----内联函数
什么时候该使用内联函数?什么是内联函数:当编译器在编译时发现内联函数时,它会将该函数的代码整段插入到调用位置。这样做可以省去调用的时间,大大加快程序运行速度。(函数调用过程)。什么时候使用:在函数体代码本身不是很长,建议使用内联函数。(一般不超过10行)如果被调用的函数非常庞大,即调用的时间小于它执行的时间的时候。若这种情况下依旧采用内联函数,它的效率就和普通函数执行效率一样了。并且如果...
2020-03-29 15:47:50 595
原创 c++函数重载为什么不能以返回值类型区分
c++函数重载为什么不能以返回值类型区分?看一段简单代码#include <iostream>#include<string>using namespace std;void fun(int a, int b){ cout << "a+b=" << a + b << endl;}int fun(int a, int ...
2020-03-29 14:14:57 5299
原创 c++中的常量指针与指针常量
常量指针(被指向的对象是常量)形式:const int *a 或 int const *a//指针指向的值不可以修改,指针的指向可以修改const int * a = &n;//*a=20 错误a=&m 正确 指针常量(指针本身是常量)形式:int * const a//指针指向的值可以修改,指针的指向不能修改int * cons...
2020-03-25 18:51:02 168
原创 逻辑或和逻辑与运算符细节
逻辑或和逻辑与运算符细节||逻辑或运算:若第一个为真,后面的不执行;第一个为假,才执行后面&&逻辑与运算符:若第一个为假,后面的不用在判断;第一个为真,才执行后面...
2020-03-25 15:03:26 673
原创 变量名为什么不能以数字开头
变量名为什么不能以数字开头?基本上所有语言中都会有这样一条规定:数字不允许作为首字符出现,这是为什么呢?如果允许变量名以数字开头,分析器每读取下一个字符的时候需要回溯来确定是否是数字、变量名还是词法错误(#等),直到符号出现非数字再转成变量名,很显然这是一种极大的浪费。而且如果当变量名全为数字时,这时候分析器就不知道是数字还是变量名了。而加上这一条规定,能很简单的避免上述问题参考链接(更专...
2020-03-25 14:42:23 3808
空空如也
c++关于初始化的内存分配问题
2020-03-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人