最简单的kv db
最基本的网络连接 使用STL map存储key value 作为多线程互斥的简单例子。
以后有机会逐步优化添加功能
1增加ASIO 异步通讯
2优化存储空间 传递指针 避免过多的拷贝操作
3优化代码结构
4优化全局锁 操作map时候 锁定部分区域而不是锁全局 。(思路在之前博客有提过多线程查找大量数据加锁的速度降低)
效果图:
部分代码

1 #include "NetWork.h" 2 #include "Handler.h" 3 #include <thread> 4 5 6 void DEF::NetWorkClass::work() { 7 try { 8 while (1) { 9 std::shared_ptr<boost::asio::ip::tcp::socket> psocket = 10 std::make_shared<boost::asio::ip::tcp::socket>(*pio_service_); 11 pacceptor_->accept(*psocket); 12 std::thread t = std::thread(DEF::Handler, psocket); 13 t.detach(); 14 } 15 } 16 catch (std::exception& e) { 17 std::cerr << __FUNCTION__ << " " << 18 e.what() << std::endl; 19 } 20 return; 21 }

#pragma once #include "PreHead.h" #include <boost/asio.hpp> #include <memory> #include <iostream> using boost::asio::ip::tcp; NAMESPACEBEGIN(DEF) class NetWorkClass { public: NetWorkClass(short port):port_(port),pacceptor_ (nullptr), pio_service_(nullptr){} bool Init() { bool b = false; pio_service_ = std::make_shared<boost::asio::io_service>(); if (nullptr == pio_service_) { std::cerr << __FUNCTION__ << " make io_service() error!" << std::endl; return b; } pacceptor_ = std::make_shared<tcp::acceptor>(*pio_service_, tcp::endpoint(tcp::v4(), port_)); if (nullptr == pio_service_) { std::cerr << __FUNCTION__ << " make acceptor() error!" << std::endl; return b; } b = true; return b; } void work(); private: short port_; std::shared_ptr<tcp::acceptor> pacceptor_; std::shared_ptr<boost::asio::io_service> pio_service_; }; NAMESPACEEND

1 #pragma once 2 #include "PreHead.h" 3 #include <memory> 4 #include <iostream> 5 #include <boost/asio.hpp> 6 7 NAMESPACEBEGIN(DEF) 8 9 bool Handler(std::shared_ptr<boost::asio::ip::tcp::socket> psocket); 10 11 struct Item { 12 std::string command_; 13 std::string key_; 14 std::string value_; 15 std::string result_; 16 }; 17 18 class ParseRecvString { 19 public: 20 static void TestSplitBySpace(); 21 static std::vector<std::string> SplitBySpace(const std::string& recvStr) { 22 std::vector<std::string> vecStr; 23 size_t begPos = recvStr.find_first_not_of(' '); 24 size_t endPos = recvStr.find_first_of(' ', begPos+1); 25 while (begPos != std::string::npos) { 26 endPos = recvStr.find_first_of(' ', begPos); 27 if (endPos != std::string::npos){ 28 vecStr.push_back(recvStr.substr(begPos, endPos - begPos)); 29 begPos = recvStr.find_first_not_of(' ', endPos + 1); 30 } 31 else { 32 vecStr.push_back(recvStr.substr(begPos)); 33 begPos = endPos; 34 } 35 } 36 37 return vecStr; 38 } 39 40 private: 41 }; 42 43 class CommandHandler { 44 public: 45 CommandHandler(const std::vector<std::string>& command) :command_(command) {} 46 47 private: 48 std::vector<std::string> command_; 49 }; 50 51 class Session { 52 public: 53 Session(std::shared_ptr<boost::asio::ip::tcp::socket> psocket): psocket_(psocket){} 54 Session(const Session& s) = delete; 55 Session operator=(const Session& s) = delete; 56 bool LoopHandle(); 57 private: 58 void SetFunc(const std::vector<std::string>& vecStr, Item& item); 59 void GetFunc(const std::vector<std::string>& vecStr, Item& item); 60 void AppendFunc(const std::vector<std::string>& vecStr, Item& item); 61 void PreAppendFunc(const std::vector<std::string>& vecStr, Item& item); 62 void DeleteFunc(const std::vector<std::string>& vecStr, Item& item); 63 void DispatchCommand(const std::vector<std::string>& vecStr, Item& item); 64 bool ParseRecvData(char* recvData,size_t len,Item& item); 65 std::shared_ptr<boost::asio::ip::tcp::socket> psocket_; 66 }; 67 68 69 70 NAMESPACEEND

#include "Handler.h" #include "DbStored.h" #include <iostream> #include <string> extern DEF::DBStored g_dbStored; bool DEF::Handler(std::shared_ptr<boost::asio::ip::tcp::socket> psocket) { bool b = false; Session s(psocket); b = s.LoopHandle(); return b; } bool DEF::Session::ParseRecvData(char* recvData, size_t len, Item& item) { bool b = false; recvData[len] = '