首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

從零打造 memcached 客戶端庫:網路協議封裝與阻塞 Socket 實作

     編輯:關於.NET

memcached 核心概念

  • 高效能分散式快取系統,以 Key-Value 形式將資料存於記憶體。
  • 基於 libevent 的獨立網路伺服器程序,透過 TCP 通訊(預設埠 11211)。
  • 客戶端 API 本質:封裝網路層通訊,讓上層呼叫 add/get 等介面即可操作,感知不到網路存在。

Windows 環境部署

官方無提供 Windows 可執行檔,可從 jehiah.cz 下載移植版。安裝/啟動指令:

memcached.exe -d install  // 安裝為 Windows 服務
memcached.exe -d start    // 啟動服務

memcached 協議精要

  • 行基礎協議:請求與回應皆以 \r\n 結尾。
  • 兩類資料:命令(互動控制)與使用者資料(實際快取內容)。
  • 命令分類:儲存、刪除、讀取、資訊查詢。核心僅 add/get/del。
  • Key 限制:不超過 255 字元字串,類似 std::map 概念。

儲存命令格式

<command> <key> <flags> <exptime> <bytes> [noreply]\r\n

注意:noreply 選項在 1.2.2 版不支援,請參考 changelog。

阻塞 Socket 通訊完整流程

1. 建立連線

SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(11211);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(s, (sockaddr*)&addr, sizeof(addr));

2. 發送儲存命令與資料塊

char cmd[256], data[] = "test data";
sprintf(cmd, "set TestKey 0 0 %d\r\n", strlen(data));
send(s, cmd, strlen(cmd), 0);        // 命令行
send(s, data, strlen(data), 0);      // 資料塊
send(s, "\r\n", 2, 0);               // 資料結束符

3. 接收回應

char reply[256];
int ret = recv(s, reply, sizeof(reply)-1, 0);
reply[ret] = 0;
printf("server reply: %s\n", reply);  // 成功回傳 "STORED"

其他操作與原始碼

取得、刪除等操作遵循相同模式。完整封裝原始碼可供下載,採阻塞 Socket 對應協議,閱讀輕鬆。適合作為網路程式設計練習題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved