TokeyRoad

Never underestimate your power to change yourself!


  • 首页

  • 标签

  • 分类

  • 归档

Redis设计与实现--简单动态字符串(SDS)

发表于 2019-05-11 | 分类于 Redis设计与实现
字数统计: 1.8k | 阅读时长 ≈ 6

近来对着文档学习一波Redis的设计与实现,一边看一边记笔记。

  1. SDS的定义

    SDS对应的结构体sds.h/sdshdr

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >struct sdshdr{
    > //记录buf数组已存入的字节数
    > //sds结构体存入的字符串的长度
    > int len;
    > //当前sds结构体未使用的字节数(可调整)
    > int free;
    > char buf[];
    >};
    >

下图为SDS一个示例

SDS示例

free的属性值为0,表示当前SDS还有5个可用字节
len的属性值为5,表示当前SDS存入的字符串长度是5个字节
buf是个字符数组,前len个字节保存存入的字符,最后一个字节默认一直是保存空字符‘\0’
SDS默认保存多一个空字符,这样就能沿用C的部分字符串语法,而SDS仅仅是多用了一个字节的空间

  1. 字符串长度时间复杂度

阅读全文 »

STL算法(2)

发表于 2019-05-10 | 分类于 STL
字数统计: 1.6k | 阅读时长 ≈ 7

涉及的算法如下:

adjacent_find&search_n&partition&binary_search&equal_range

准备工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Msg {
int index;
int msg;
};
//用于打印显式
void PrintVec(vector<Msg>::iterator iter_begin, vector<Msg>::iterator iter_end) {
for (auto iter = iter_begin; iter != iter_end; iter++) {
if (iter != iter_begin) {
cout << "--";
}
cout << iter->index << ":" << iter->msg;
}
cout << endl << endl;
}

生成数据(所有的排序针对index,msg只是为了标识稳定与否)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<Msg> v_msg;
//vector<Msg> v_msg_sec;
Msg temp_msg;
int count = 10;
srand((int)time(0));
for (int i = 0; i < count; i++) {
temp_msg.index = rand() % 100;
temp_msg.msg = i;
v_msg.push_back(temp_msg);
//if (rand() % 2 == 0 && i != 0) {
// temp_msg.index = rand() % 100;
// temp_msg.msg = i;
// v_msg_sec.push_back(temp_msg);
//}
}

  • adjacent_find

阅读全文 »

STL算法(1)

发表于 2019-04-29 | 分类于 STL
字数统计: 1.3k | 阅读时长 ≈ 6

本次所有的算法如下:

stable_sort&partial_sort&nth_element&is_sorted&is_sorted_until&merge&inplace_merge&find_if

准备工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Msg {
int index;
int msg;
};
//用于打印显式
void PrintVec(vector<Msg>::iterator iter_begin, vector<Msg>::iterator iter_end) {
for (auto iter = iter_begin; iter != iter_end; iter++) {
if (iter != iter_begin) {
cout << "--";
}
cout << iter->index << ":" << iter->msg;
}
cout << endl << endl;
}

生成数据(所有的排序针对index,msg只是为了标识稳定与否)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<Msg> v_msg;
//vector<Msg> v_msg_sec;
Msg temp_msg;
int count = 10;
srand((int)time(0));
for (int i = 0; i < count; i++) {
temp_msg.index = rand() % 100;
temp_msg.msg = i;
v_msg.push_back(temp_msg);
//if (rand() % 2 == 0 && i != 0) {
// temp_msg.index = rand() % 100;
// temp_msg.msg = i;
// v_msg_sec.push_back(temp_msg);
//}
}

  • stable_sort

阅读全文 »

C++关键字final

发表于 2019-04-29 | 分类于 C++
字数统计: 142 | 阅读时长 ≈ 1

C++ 11的新特性之final

final是说明符而不是关键字,这意味着可以将它用作标识符(override同样)

说明符final,用于阻止派生类覆盖特定的虚方法。或者是阻止一个类成为基类。

阅读全文 »

TCP Socket

发表于 2019-04-21 | 分类于 网络协议
字数统计: 1.4k | 阅读时长 ≈ 7

一个简单的TCP socket通讯的实例。

功能简单说明:
服务端主线程一直阻塞在accept,每连接上一个客户端,就创建一个新的线程去处理这个客户端的消息。
其中新线程中一直处于接收客户端的消息中,每接收一次都回复一个keep alive,当收到来自客户端stop消息时,就断开连接,并关闭当前线程。

一.服务端

  1. 创建套接字

    1
    2
    3
    4
    5
    6
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA wsaData;
    if (WSAStartup(sockVersion, &wsaData) != 0) {
    return 0;
    }
    //WSA(Windows Sockets Asynchronous,Windows异步套接字)的启动命令
  2. 绑定套接字到IP和端口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //创建并初始化socket
    SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (listen_socket == INVALID_SOCKET) {
    printf("socket init error code:%d", WSAGetLastError());
    return 0;
    }
    //绑定结构
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(6666);
    sin.sin_addr.S_un.S_addr = INADDR_ANY;
    //绑定
    if (bind(listen_socket, (LPSOCKADDR)&sin, sizeof(sin)) != 0) {
    printf("bind socket error code:%d", WSAGetLastError());
    closesocket(listen_socket);//注意socket回收
    return 0;
    }
  3. 监听端口

阅读全文 »
1…78910
Tokey

Tokey

48 日志
9 分类
41 标签
  • C++8
  • Const1
  • Final1
  • HTTP2
  • Redis8
  • SDS1
  • STL4
  • TCP1
  • args1
  • atomic1
  • condition_variable1
  • construct1
  • foreach1
  • git2
  • go4
  • hexo1
  • json1
  • libcurl1
  • mutex1
  • operator1
  • override1
  • priority_queue1
  • shared_ptr1
  • stl1
  • unique_ptr1
  • vector1
  • 关键字2
  • 内存分配1
  • 列表对象1
  • 压缩列表2
  • 堆1
  • 字符串对象1
  • 指针和引用1
  • 敏捷开发1
  • 整数集合1
  • 栈1
  • 环境配置1
  • 缓存1
  • 设计模式1
  • 跳跃表1
  • 链表1
GitHub Google
Links
  • Hacker
本站已运行
© 2021 Tokey
博客全站共45.4k字
苏ICP备-20024031号
访问人数 总访问量 次
0%