东西写的太简单了 都不好意思说是NOSQL

其实就是STL 的map容器记录了写入的信息

解析了下数据仅此。

分析的时候想了很多

比如学习redis的自写hash,动态调整hash表容量。

比如右值或者C语言直接操作内存 提升效率

比如多线程操作互斥 网络连接 记录操作时间等等

但是c++写起来,心智负担太多。

实在是太繁琐 一点激情都没了

还是简单一点 写个完整的获益更多。

最后就是这个简单完整的小代码

  1. #include <iostream>
  2. #include <unordered_map>
  3. #include <string>
  4. #include <map>
  5. #include <vector>
  6. #include <assert.h>
  7. using namespace std;
  8.  
  9. enum Command{
  10. AddKeyValue = 101,
  11. GetKeyValue,
  12. SetValue,
  13. ReplaceValue,
  14. DeleteKeyValue,
  15. AppendValue,
  16. PreappendValue,
  17. InvalidCommand
  18. };
  19.  
  20. enum TokenVecIndex{
  21. commandIndex = 0,
  22. keyIndex,
  23. valueIndex,
  24. invalidIndex
  25. };
  26.  
  27. std::unordered_map<std::string,Command> CommandString =
  28. {
  29. {"add",AddKeyValue},
  30. {"get",GetKeyValue},
  31. {"set",SetValue},
  32. {"replace",ReplaceValue},
  33. {"del",DeleteKeyValue},
  34. {"append",AppendValue},
  35. {"preapp",PreappendValue}
  36. };
  37.  
  38. std::unordered_map<std::string,std::string> ItemHashStorage;
  39.  
  40. void splitWithSTLFind(const string& str, const string& delim, vector<string>& ret)
  41. {
  42. size_t front = str.find_first_not_of(delim);
  43. size_t back = str.find_first_of(delim, front) ;
  44.  
  45. while(back != std::string::npos &&
  46. front != std::string::npos){
  47. ret.emplace(ret.end(),str.substr(front, back - front));
  48. front = str.find_first_not_of(delim, back +1);
  49. back = str.find_first_of(delim, front);
  50. }
  51. if(front != std::string::npos){
  52. ret.emplace(ret.end(),str.substr(front, back - front));
  53. }
  54. }
  55.  
  56. bool CheckToken(std::vector<std::string>& tokenVec)
  57. {
  58. bool bRet = false;
  59.  
  60. if( (tokenVec[commandIndex] == "get" || tokenVec[commandIndex] == "del")
  61. && tokenVec.size() != 2){
  62. return bRet;
  63. }
  64.  
  65. if(tokenVec.size() != 3)
  66. return bRet;
  67.  
  68. bRet = true;
  69. return bRet;
  70. }
  71.  
  72. bool GetCommand(const std::string& input,std::vector<std::string>& tokenVec){
  73. std::string delim = " ";
  74. tokenVec.clear();
  75. splitWithSTLFind(input,delim,tokenVec);
  76. return CheckToken(tokenVec);
  77. }
  78.  
  79. bool SetValueFunc(const std::vector<std::string>& tokenVec){
  80. ItemHashStorage[tokenVec[keyIndex]] = tokenVec[valueIndex];
  81. return true;
  82. }
  83.  
  84. bool AddKeyValueFunc(const std::vector<std::string>& tokenVec){
  85. if( ItemHashStorage.find(tokenVec[keyIndex]) != ItemHashStorage.end())
  86. return true;
  87. SetValueFunc(tokenVec);
  88. return true;
  89. }
  90.  
  91. bool ReplaceValueFunc(const std::vector<std::string>& tokenVec){
  92. if( ItemHashStorage.find(tokenVec[keyIndex]) == ItemHashStorage.end())
  93. return false;
  94. SetValueFunc(tokenVec);
  95. return true;
  96. }
  97.  
  98. bool GetKeyValueFunc(const std::vector<std::string>& tokenVec,string& retValueString){
  99. auto it = ItemHashStorage.find(tokenVec[keyIndex]);
  100. if( it == ItemHashStorage.end())
  101. return false;
  102. retValueString = it->second;
  103. return true;
  104. }
  105.  
  106. bool PreappendValueFunc(const std::vector<std::string>& tokenVec){
  107. auto it = ItemHashStorage.find(tokenVec[keyIndex]);
  108. if( it == ItemHashStorage.end())
  109. return false;
  110. string s = tokenVec[valueIndex];
  111. s.append(it->second);
  112. std::swap(s,it->second);
  113. return true;
  114. }
  115.  
  116. bool DeleteKeyValueFunc(const std::vector<std::string>& tokenVec){
  117. auto it = ItemHashStorage.find(tokenVec[keyIndex]);
  118. if( it == ItemHashStorage.end())
  119. return true;
  120. ItemHashStorage.erase(it);
  121. return true;
  122. }
  123.  
  124. bool AppendValueFunc(const std::vector<std::string>& tokenVec){
  125. auto it = ItemHashStorage.find(tokenVec[keyIndex]);
  126. if( it == ItemHashStorage.end())
  127. return false;
  128. (it->second).append(tokenVec[valueIndex]);
  129. return true;
  130. }
  131.  
  132. bool Excute(const std::vector<std::string>& tokenVec,string& retValueString){
  133. bool bRet = false;
  134. auto it = CommandString.find(tokenVec[commandIndex]);
  135. if( it == CommandString.end())
  136. return bRet;
  137. switch(it->second){
  138. case AddKeyValue:
  139. bRet = AddKeyValueFunc(tokenVec);
  140. break;
  141. case GetKeyValue:
  142. bRet = GetKeyValueFunc(tokenVec,retValueString);
  143. break;
  144. case SetValue:
  145. bRet = SetValueFunc(tokenVec);
  146. break;
  147. case ReplaceValue:
  148. bRet = ReplaceValueFunc(tokenVec);
  149. break;
  150. case DeleteKeyValue:
  151. bRet = DeleteKeyValueFunc(tokenVec);
  152. break;
  153. case AppendValue:
  154. bRet = AppendValueFunc(tokenVec);
  155. break;
  156. case PreappendValue:
  157. bRet = PreappendValueFunc(tokenVec);
  158. break;
  159. default:
  160. break;
  161. }
  162.  
  163. return bRet;
  164. }
  165.  
  166. std::vector<std::string> testStringVec1={
  167. " add ",
  168. " add testkey1 testvalue1",
  169. " add testkey1 testvalue1",
  170. " add testkey1 testvalue1",
  171. " add"
  172. };
  173.  
  174. std::vector<std::string> testStringVec2={
  175. " add ",
  176. " add testkey2 testvalue1",
  177. " add testkey3 testvalue1",
  178. " add testkey4 testvalue1",
  179. " add"
  180. };
  181.  
  182. int main(int argc, char *argv[])
  183. {
  184. // test
  185. for(auto it:testStringVec1 ){
  186. std::vector<std::string> tokenVec;
  187. if( GetCommand(it,tokenVec)){
  188. std::string s;
  189. Excute(tokenVec,s);
  190. }
  191. }
  192. assert(ItemHashStorage.size()==1);
  193.  
  194. for(auto it:testStringVec2 ){
  195. std::vector<std::string> tokenVec;
  196. if( GetCommand(it,tokenVec)){
  197. std::string s;
  198. Excute(tokenVec,s);
  199. }
  200. }
  201. assert(ItemHashStorage.size()==4);
  202.  
  203. {
  204. std::vector<std::string> tokenVec;
  205. string commandStr= "get testkey4";
  206. string s;
  207. GetCommand(commandStr,tokenVec);
  208. Excute(tokenVec,s);
  209. assert(s==string("testvalue1"));
  210. }
  211.  
  212. {
  213. std::vector<std::string> tokenVec;
  214. string commandStr= "get testkey4 testkey4";
  215. string s;
  216. GetCommand(commandStr,tokenVec);
  217. Excute(tokenVec,s);
  218. assert(s==string("testvalue1"));
  219. }
  220.  
  221. {
  222. std::vector<std::string> tokenVec;
  223. string commandStr= "get nothing testkey4";
  224. string s;
  225. GetCommand(commandStr,tokenVec);
  226. assert( false == Excute(tokenVec,s));
  227. assert(s == string(""));
  228. }
  229.  
  230. {
  231. std::vector<std::string> tokenVec;
  232. string commandStr= "set testkey2 testkey4";
  233. string s;
  234. GetCommand(commandStr,tokenVec);
  235. Excute(tokenVec,s);
  236. GetCommand("get testkey2",tokenVec);
  237. Excute(tokenVec,s);
  238. assert(s == ("testkey4"));
  239. }
  240.  
  241. {
  242. std::vector<std::string> tokenVec;
  243. string commandStr= "replace testkey3 testkey33";
  244. string s;
  245. GetCommand(commandStr,tokenVec);
  246. Excute(tokenVec,s);
  247. GetCommand("get testkey3",tokenVec);
  248. Excute(tokenVec,s);
  249. assert(s == ("testkey33"));
  250. }
  251.  
  252. {
  253. std::vector<std::string> tokenVec;
  254. string commandStr= "del testkey3 testkey33";
  255. string s;
  256. GetCommand(commandStr,tokenVec);
  257. assert(Excute(tokenVec,s));
  258. GetCommand("get testkey3",tokenVec);
  259. assert(false == Excute(tokenVec,s));
  260. assert(s== (""));
  261. }
  262.  
  263. {
  264. std::vector<std::string> tokenVec;
  265. string commandStr= "append testkey1 -appendValue";
  266. string s;
  267. GetCommand(commandStr,tokenVec);
  268. assert(Excute(tokenVec,s));
  269. GetCommand("get testkey1",tokenVec);
  270. assert(Excute(tokenVec,s));
  271. assert(s== "testvalue1-appendValue");
  272. }
  273.  
  274. {
  275. std::vector<std::string> tokenVec;
  276. string commandStr= "preapp testkey1 Pre-";
  277. string s;
  278. GetCommand(commandStr,tokenVec);
  279. assert(Excute(tokenVec,s));
  280. GetCommand("get testkey1",tokenVec);
  281. assert(Excute(tokenVec,s));
  282. assert(s== "Pre-testvalue1-appendValue");
  283. }
  284. return 0;
  285. }

  

低配NOSQL的更多相关文章

  1. [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)

    [评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...

  2. 【Java】利用注解和反射实现一个"低配版"的依赖注入

    在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入. 下面是我们 ...

  3. Linux笔记 #08# shell编程从零开始到低配学生管理系统

    先熟悉一下基本语法(运行环境是装git的时候一起装的那个windows下的bash): #!/bin/bash # 实现两个函数 # appendToFile()追加一行到文件 # readFile( ...

  4. GTX 750等低配显卡如何玩转Deepfakes?

    这里说的Deepfakes软件还是DeepFaceLab,人工智能换脸,是使用深度学习方法来实现的.而深度学习程序对电脑配置要求是非常高的,尤其是跑模型这个环节.很多低配电脑,根本就跑步起来.比如像G ...

  5. 【Node/JavaScript】论一个低配版Web实时通信库是如何实现的( WebSocket篇)

    引论 simple-socket是我写的一个"低配版"的Web实时通信工具(相对于Socket.io),在参考了相关源码和资料的基础上,实现了前后端实时互通的基本功能 选用了Web ...

  6. 【JavaScript】论一个低配版Web实时通信库是如何实现的之二( EventSource篇)

    前情提要 「 话说上回说到!那WebSocket大侠,巧借http之内力,破了敌阵的双工鸳鸯锁,终于突出重围. 然而玄难未了,此时web森林中飞出一只银头红缨枪,划破夜色. "莫非!?&qu ...

  7. Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

    随着项目的不断增多,最开始单体项目手动执行 docker build 命令,手动发布项目就不再适用了.一两个项目可能还吃得消,10 多个项目每天让你构建一次还是够呛.即便你的项目少,每次花费在发布上面 ...

  8. 搭建react项目(低配版)

    react项目低配版,可作为react相关测试的基础环境,方便快速进行测试. git clone git@github.com:whosMeya/simple-react-app.git git ch ...

  9. 基于canvas和web audio实现低配版MikuTap

    导言 最近发掘了一个特别happy的网页小游戏--MikuTap.打开之后沉迷了一下午,导致开发工作没做完差点就要删库跑路了,还好boss瞥了我一眼就没下文了.于是第二天我就继续沉迷,随着一阵抽搐,这 ...

随机推荐

  1. selenium+python自动化95-弹出框死活定位不到

    前言 部分小伙伴学了selenium的alert后,就不管啥弹出框都去用alert,这是行不通的,看到弹出框,先要确定是不是alert,是才能用,不是的话肯定不能用. 有些弹出框是div层,这种跟平常 ...

  2. leetcode263

    public class Solution { private bool Judge(int x) { ) { return false; } int bound = Convert.ToInt32( ...

  3. vue深入了解组件——处理边界情况

    一.访问元素&组件 在绝大多数情况下,我们最好不要触达另一个组件实例内部或手动操作DOM元素.不过也确实在一些情况下做这些事情是合适的. 1.1 访问根实例 在每个 new Vue 实例的子组 ...

  4. eclipse 注释字体不一致的问题

    eclipse中 1.解决注释的文字大小不一的情况 2.想让注释和代码大小不一样 3.win10系统下,设置Text Font时找不到Courier New字体 1.解决注释的文字大小不一的情况 打开 ...

  5. 播放一个wav文件

    use mmsystem;SndPlaySound('hello.wav',SND_FILENAME or SND_SYNC) ///////////////////////////////////u ...

  6. delphi XE3解析JSON数据

    测试数据如下: Memo1.text中的数据: { "date":"周二(今天, 实时:12℃)", "dayPictureUrl":&qu ...

  7. java作用域public ,private ,protected 及不写时的区别

    说明部分转自:http://yangmingjiayou.iteye.com/blog/151865 在说明这四个关键字之前,我想就class之间的关系做一个简单的定义,对于继承自己的class,ba ...

  8. HDFS 好的文章链接

    http://www.cnblogs.com/linuxprobe/p/5594431.html http://www.daniubiji.cn/archives/596 http://blog.cs ...

  9. scikit Flow ,tensor flow 做ml模型

    [https://github.com/ilblackdragon/tf_examples/blob/master/titanic.py] [keras 高层tensorflow] https://k ...

  10. post与get的区别

    GET请求在URL中传送的参数大多数浏览器限制该长度为2kb的,而POST没有. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息. GET参数通过URL传递,POST放 ...