tc_rbtree.h 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #ifndef __TC_RBTREE_H
  17. #define __TC_RBTREE_H
  18. #include <iostream>
  19. #include <string>
  20. #include <cassert>
  21. #include <functional>
  22. #include "util/tc_ex.h"
  23. #include "util/tc_pack.h"
  24. #include "util/tc_mem_chunk.h"
  25. using namespace std;
  26. namespace tars
  27. {
  28. /////////////////////////////////////////////////
  29. /**
  30. * @file tc_rbtree.h
  31. * @brief rbtree map类
  32. *
  33. */
  34. /////////////////////////////////////////////////
  35. /**
  36. * @brief RBTree map异常类
  37. */
  38. struct TC_RBTree_Exception : public TC_Exception
  39. {
  40. TC_RBTree_Exception(const string &buffer) : TC_Exception(buffer){};
  41. ~TC_RBTree_Exception() throw(){};
  42. };
  43. /**
  44. * @brief 内存rbtree,不要直接使用该类,通过jmem组件来使用
  45. *
  46. * 该红黑树通过TC_MemMutilChunkAllocator来分配空间,支持不同大小的内存块的分配,
  47. *
  48. * 分配器分配的是内存索引,减少自身消耗的空间(尤其是64位OS下面);
  49. *
  50. * 支持内存和共享内存,对接口的所有操作都需要加锁;
  51. *
  52. * 内部有脏数据链,支持数据缓写;
  53. *
  54. * 当数据超过一个数据块时,则会拼接多个数据块;
  55. *
  56. * Set时当数据块用完,自动淘汰最长时间没有访问的数据,也可以不淘汰,直接返回错误;
  57. *
  58. * 支持dump到文件,或从文件load;
  59. */
  60. class TC_RBTree
  61. {
  62. public:
  63. struct RBTreeLockIterator;
  64. struct RBTreeIterator;
  65. friend struct Block;
  66. friend struct BlockAllocator;
  67. friend struct RBTreeLockIterator;
  68. friend struct RBTreeLockItem;
  69. /**
  70. * @brief 操作数据
  71. */
  72. struct BlockData
  73. {
  74. string _key; /**数据Key*/
  75. string _value; /**数据value*/
  76. bool _dirty; /**是否是脏数据*/
  77. time_t _synct; /**sync time, 不一定是真正的回写时间*/
  78. BlockData()
  79. : _dirty(false)
  80. , _synct(0)
  81. {
  82. }
  83. };
  84. ///////////////////////////////////////////////////////////////////////////////////
  85. /**
  86. * @brief 内存数据块,读取和存放数据
  87. */
  88. class Block
  89. {
  90. public:
  91. /**
  92. * @brief block数据头
  93. */
  94. struct tagBlockHead
  95. {
  96. uint16_t _iSize; /**block的容量大小*/
  97. char _iColor; /**颜色*/
  98. uint32_t _iParent; /**父节点*/
  99. uint32_t _iLeftChild; /**左子树*/
  100. uint32_t _iRightChild; /**右子树*/
  101. uint32_t _iSetNext; /**Set链上的上一个Block*/
  102. uint32_t _iSetPrev; /**Set链上的上一个Block*/
  103. uint32_t _iGetNext; /**Get链上的上一个Block*/
  104. uint32_t _iGetPrev; /**Get链上的上一个Block*/
  105. time_t _iSyncTime; /**上次缓写时间*/
  106. bool _bDirty; /**是否是脏数据*/
  107. bool _bOnlyKey; /**是否只有key, 没有内容*/
  108. bool _bNextChunk; /**是否有下一个chunk*/
  109. union
  110. {
  111. uint32_t _iNextChunk; /**下一个Chunk块, _bNextChunk=true时有效, tagChunkHead*/
  112. uint32_t _iDataLen; /**当前数据块中使用了的长度, _bNextChunk=false时有效*/
  113. };
  114. char _cData[0]; /**数据开始部分*/
  115. };
  116. /**
  117. * @brief 非头部的block, 称为chunk
  118. */
  119. struct tagChunkHead
  120. {
  121. uint16_t _iSize; /**block的容量大小*/
  122. bool _bNextChunk; /**是否还有下一个chunk*/
  123. union
  124. {
  125. uint32_t _iNextChunk; /**下一个数据块, _bNextChunk=true时有效, tagChunkHead*/
  126. uint32_t _iDataLen; /**当前数据块中使用了的长度, _bNextChunk=false时有效*/
  127. };
  128. char _cData[0]; /**数据开始部分*/
  129. };
  130. /**
  131. * @brief 构造函数
  132. * @param Map
  133. * @param 当前MemBlock的地址
  134. * @param pAdd
  135. */
  136. Block(TC_RBTree *pMap, uint32_t iAddr)
  137. : _pMap(pMap)
  138. , _iHead(iAddr)
  139. {
  140. _pHead = getBlockHead(_iHead);
  141. }
  142. /**
  143. * @brief copy
  144. * @param mb
  145. */
  146. Block(const Block &mb)
  147. : _pMap(mb._pMap)
  148. , _iHead(mb._iHead)
  149. {
  150. _pHead = getBlockHead(_iHead);
  151. }
  152. /**
  153. * @brief 获取block头绝对地址
  154. * @param iAddr
  155. *
  156. * @return tagChunkHead*
  157. */
  158. tagBlockHead *getBlockHead(uint32_t iAddr) { return ((tagBlockHead*)_pMap->getAbsolute(iAddr)); }
  159. /**
  160. * @brief 获取MemBlock头地址
  161. *
  162. * @return void*
  163. */
  164. tagBlockHead *getBlockHead() { return _pHead; }
  165. /**
  166. * @brief 是否有左子节点
  167. *
  168. * @return bool
  169. */
  170. bool hasLeft();
  171. /**
  172. * 当前元素移动到左子节点
  173. * @return true, 移到下一个block了, false, 没有下一个block
  174. *
  175. */
  176. bool moveToLeft();
  177. /**
  178. * @brief 是否有右子节点
  179. *
  180. * @return bool
  181. */
  182. bool hasRight();
  183. /**
  184. * @brief 当前元素移动右子节点
  185. * @return true, 移到下一个block了, false, 没有下一个block
  186. *
  187. */
  188. bool moveToRight();
  189. /**
  190. * @brief 是否有父节点
  191. *
  192. * @return bool
  193. */
  194. bool hasParent();
  195. /**
  196. * @brief 当前元素移动父
  197. * @return true, 移到下一个block了, false, 没有下一个block
  198. *
  199. */
  200. bool moveToParent();
  201. /**
  202. * @brief 头部
  203. *
  204. * @return uint32_t
  205. */
  206. uint32_t getHead() { return _iHead;}
  207. /**
  208. * 最新Get时间
  209. *
  210. * @return time_t
  211. */
  212. time_t getSyncTime() { return getBlockHead()->_iSyncTime; }
  213. /**
  214. * 设置回写时间
  215. * @param iSyncTime
  216. */
  217. void setSyncTime(time_t iSyncTime) { getBlockHead()->_iSyncTime = iSyncTime; }
  218. /**
  219. * 获取Block中的数据
  220. *
  221. * @return int
  222. * TC_RBTree::RT_OK, 正常, 其他异常
  223. * TC_RBTree::RT_ONLY_KEY, 只有Key
  224. * 其他异常
  225. */
  226. int getBlockData(TC_RBTree::BlockData &data);
  227. /**
  228. * 获取数据
  229. * @param pData
  230. * @param iDatalen
  231. * @return int,
  232. * TC_RBTree::RT_OK, 正常
  233. * 其他异常
  234. */
  235. int get(void *pData, uint32_t &iDataLen);
  236. /**
  237. * 获取数据
  238. * @param s
  239. * @return int
  240. * TC_RBTree::RT_OK, 正常
  241. * 其他异常
  242. */
  243. int get(string &s);
  244. /**
  245. * 设置数据
  246. * @param pData
  247. * @param iDatalen
  248. * @param vtData, 淘汰的数据
  249. */
  250. int set(const string& k, const string& v, bool bNewBlock, bool bOnlyKey, vector<TC_RBTree::BlockData> &vtData);
  251. /**
  252. * 是否是脏数据
  253. *
  254. * @return bool
  255. */
  256. bool isDirty() { return getBlockHead()->_bDirty; }
  257. /**
  258. * 设置数据
  259. * @param b
  260. */
  261. void setDirty(bool b);
  262. /**
  263. * 是否只有key
  264. *
  265. * @return bool
  266. */
  267. bool isOnlyKey() { return getBlockHead()->_bOnlyKey; }
  268. /**
  269. * 释放block的所有空间
  270. */
  271. void deallocate();
  272. /**
  273. * 新block时调用该函数
  274. * 分配一个新的block
  275. * @param iAllocSize, 内存大小
  276. */
  277. void makeNew(uint32_t iAllocSize);
  278. /**
  279. * 插入新节点
  280. *
  281. * @param i
  282. * @param k
  283. */
  284. void insertRBTree(tagBlockHead *i, const string &k);
  285. /**
  286. * 从Block链表中删除当前Block
  287. * 只对Block有效, 对Chunk是无效的
  288. * @return
  289. */
  290. void erase();
  291. /**
  292. * 刷新set链表, 放在Set链表头部
  293. */
  294. void refreshSetList();
  295. /**
  296. * 刷新get链表, 放在Get链表头部
  297. */
  298. void refreshGetList();
  299. protected:
  300. Block& operator=(const Block &mb);
  301. bool operator==(const Block &mb) const;
  302. bool operator!=(const Block &mb) const;
  303. /**
  304. * 获取Chunk头绝对地址
  305. *
  306. * @return tagChunkHead*
  307. */
  308. tagChunkHead *getChunkHead() {return getChunkHead(_iHead);}
  309. /**
  310. * 获取chunk头绝对地址
  311. * @param iAddr
  312. *
  313. * @return tagChunkHead*
  314. */
  315. tagChunkHead *getChunkHead(uint32_t iAddr) { return ((tagChunkHead*)_pMap->getAbsolute(iAddr)); }
  316. /**
  317. * 从当前的chunk开始释放
  318. * @param iChunk 释放地址
  319. */
  320. void deallocate(uint32_t iChunk);
  321. /**
  322. * 如果数据容量不够, 则新增加chunk, 不影响原有数据
  323. * 使新增加的总容量大于iDataLen
  324. * 释放多余的chunk
  325. * @param iDataLen
  326. *
  327. * @return int,
  328. */
  329. int allocate(uint32_t iDataLen, vector<TC_RBTree::BlockData> &vtData);
  330. /**
  331. * 挂接chunk, 如果core则挂接失败, 保证内存块还可以用
  332. * @param pChunk
  333. * @param chunks
  334. *
  335. * @return int
  336. */
  337. int joinChunk(tagChunkHead *pChunk, const vector<uint32_t> chunks);
  338. /**
  339. * 分配n个chunk地址, 注意释放内存的时候不能释放正在分配的对象
  340. * @param fn, 分配空间大小
  341. * @param chunks, 分配成功返回的chunks地址列表
  342. * @param vtData, 淘汰的数据
  343. * @return int
  344. */
  345. int allocateChunk(uint32_t fn, vector<uint32_t> &chunks, vector<TC_RBTree::BlockData> &vtData);
  346. /**
  347. * 获取数据长度
  348. *
  349. * @return uint32_t
  350. */
  351. uint32_t getDataLen();
  352. /**
  353. * 左旋
  354. *
  355. * @param i
  356. */
  357. void rotateLeft(tagBlockHead *i, uint32_t iAddr);
  358. /**
  359. * 右旋
  360. *
  361. * @param i
  362. */
  363. void rotateRight(tagBlockHead *i, uint32_t iAddr);
  364. /**
  365. * 删除后调整
  366. *
  367. * @param i
  368. */
  369. void eraseFixUp(tagBlockHead *i, uint32_t iAddr, tagBlockHead *p, uint32_t iPAddr);
  370. /**
  371. * 删除
  372. *
  373. * @param i
  374. */
  375. void erase(tagBlockHead *i, uint32_t iAddr);
  376. /**
  377. * 插入后调整
  378. *
  379. * @param i
  380. */
  381. void insertFixUp(tagBlockHead *i, uint32_t iAddr);
  382. /**
  383. * 插入到get/set链表中
  384. */
  385. void insertGetSetList(TC_RBTree::Block::tagBlockHead *i);
  386. private:
  387. /**
  388. * Map
  389. */
  390. TC_RBTree *_pMap;
  391. /**
  392. * block区块首地址, 相对地址
  393. */
  394. uint32_t _iHead;
  395. /**
  396. * 头区块指针
  397. */
  398. tagBlockHead * _pHead;
  399. };
  400. ////////////////////////////////////////////////////////////////////////
  401. /*
  402. * 内存数据块分配器
  403. *
  404. */
  405. class BlockAllocator
  406. {
  407. public:
  408. /**
  409. * 构造函数
  410. */
  411. BlockAllocator(TC_RBTree *pMap)
  412. : _pMap(pMap)
  413. , _pChunkAllocator(new TC_MemMultiChunkAllocator())
  414. {
  415. }
  416. /**
  417. * 析够函数
  418. */
  419. ~BlockAllocator()
  420. {
  421. if(_pChunkAllocator != NULL)
  422. {
  423. delete _pChunkAllocator;
  424. }
  425. _pChunkAllocator = NULL;
  426. }
  427. /**
  428. * 初始化
  429. * @param pHeadAddr, 地址, 换到应用程序的绝对地址
  430. * @param iSize, 内存大小
  431. * @param iMinBlockSize, 最小数据块大小
  432. * @param iMaxBlockSize, 最大数据块大小
  433. * @param fFactor, 因子
  434. */
  435. void create(void *pHeadAddr, size_t iSize, size_t iMinBlockSize, size_t iMaxBlockSize, float fFactor)
  436. {
  437. _pChunkAllocator->create(pHeadAddr, iSize, iMinBlockSize, iMaxBlockSize, fFactor);
  438. }
  439. /**
  440. * 连接上
  441. * @param pAddr, 地址, 换到应用程序的绝对地址
  442. */
  443. void connect(void *pHeadAddr)
  444. {
  445. _pChunkAllocator->connect(pHeadAddr);
  446. }
  447. /**
  448. * 扩展空间
  449. * @param pAddr
  450. * @param iSize
  451. */
  452. void append(void *pAddr, size_t iSize)
  453. {
  454. _pChunkAllocator->append(pAddr, iSize);
  455. }
  456. /**
  457. * 重建
  458. */
  459. void rebuild()
  460. {
  461. _pChunkAllocator->rebuild();
  462. }
  463. /**
  464. * 获取每种数据块头部信息
  465. *
  466. * @return TC_MemChunk::tagChunkHead
  467. */
  468. vector<TC_MemChunk::tagChunkHead> getBlockDetail() const { return _pChunkAllocator->getBlockDetail(); }
  469. /**
  470. * 内存大小
  471. *
  472. * @return size_t
  473. */
  474. size_t getMemSize() const { return _pChunkAllocator->getMemSize(); }
  475. /**
  476. * 真正的数据容量
  477. *
  478. * @return size_t
  479. */
  480. size_t getCapacity() const { return _pChunkAllocator->getCapacity(); }
  481. /**
  482. * 每种block中的chunk个数(每种block中的chunk个数相同)
  483. *
  484. * @return vector<size_t>
  485. */
  486. vector<size_t> singleBlockChunkCount() const { return _pChunkAllocator->singleBlockChunkCount(); }
  487. /**
  488. * 所有block的chunk个数
  489. *
  490. * @return size_t
  491. */
  492. size_t allBlockChunkCount() const { return _pChunkAllocator->allBlockChunkCount(); }
  493. /**
  494. * 在内存中分配一个新的Block
  495. *
  496. * @param iAllocSize: in/需要分配的大小, out/分配的块大小
  497. * @param vtData, 返回释放的内存块数据
  498. * @return uint32_t, 相对地址,0表示没有空间可以分配
  499. */
  500. uint32_t allocateMemBlock(uint32_t &iAllocSize, vector<TC_RBTree::BlockData> &vtData);
  501. /**
  502. * 为地址为iAddr的Block分配一个chunk
  503. *
  504. * @param iAddr,分配的Block的地址
  505. * @param iAllocSize, in/需要分配的大小, out/分配的块大小
  506. * @param vtData 返回释放的内存块数据
  507. * @return uint32_t, 相对地址,0表示没有空间可以分配
  508. */
  509. uint32_t allocateChunk(uint32_t iAddr, uint32_t &iAllocSize, vector<TC_RBTree::BlockData> &vtData);
  510. /**
  511. * 释放Block
  512. * @param v
  513. */
  514. void deallocateMemBlock(const vector<uint32_t> &v);
  515. /**
  516. * 释放Block
  517. * @param v
  518. */
  519. void deallocateMemBlock(uint32_t v);
  520. protected:
  521. //不允许copy构造
  522. BlockAllocator(const BlockAllocator &);
  523. //不允许赋值
  524. BlockAllocator& operator=(const BlockAllocator &);
  525. bool operator==(const BlockAllocator &mba) const;
  526. bool operator!=(const BlockAllocator &mba) const;
  527. public:
  528. /**
  529. * map
  530. */
  531. TC_RBTree *_pMap;
  532. /**
  533. * chunk分配器
  534. */
  535. TC_MemMultiChunkAllocator *_pChunkAllocator;
  536. };
  537. ////////////////////////////////////////////////////////////////
  538. // map的数据项
  539. class RBTreeLockItem
  540. {
  541. public:
  542. /**
  543. *
  544. * @param pMap
  545. * @param iAddr
  546. */
  547. RBTreeLockItem(TC_RBTree *pMap, uint32_t iAddr);
  548. /**
  549. *
  550. * @param mcmdi
  551. */
  552. RBTreeLockItem(const RBTreeLockItem &mcmdi);
  553. /**
  554. *
  555. */
  556. RBTreeLockItem(){};
  557. /**
  558. *
  559. * @param mcmdi
  560. *
  561. * @return RBTreeLockItem&
  562. */
  563. RBTreeLockItem &operator=(const RBTreeLockItem &mcmdi);
  564. /**
  565. *
  566. * @param mcmdi
  567. *
  568. * @return bool
  569. */
  570. bool operator==(const RBTreeLockItem &mcmdi);
  571. /**
  572. *
  573. * @param mcmdi
  574. *
  575. * @return bool
  576. */
  577. bool operator!=(const RBTreeLockItem &mcmdi);
  578. /**
  579. * 是否是脏数据
  580. *
  581. * @return bool
  582. */
  583. bool isDirty();
  584. /**
  585. * 是否只有Key
  586. *
  587. * @return bool
  588. */
  589. bool isOnlyKey();
  590. /**
  591. * 最后Sync时间
  592. *
  593. * @return time_t
  594. */
  595. time_t getSyncTime();
  596. /**
  597. * 获取值, 如果只有Key(isOnlyKey)的情况下, v为空
  598. * @return int
  599. * RT_OK:数据获取OK
  600. * RT_ONLY_KEY: key有效, v无效为空
  601. * 其他值, 异常
  602. *
  603. */
  604. int get(string& k, string& v);
  605. /**
  606. * 获取值
  607. * @return int
  608. * RT_OK:数据获取OK
  609. * 其他值, 异常
  610. */
  611. int get(string& k);
  612. /**
  613. * 数据块相对地址
  614. *
  615. * @return uint32_t
  616. */
  617. uint32_t getAddr() const { return _iAddr; }
  618. protected:
  619. /**
  620. * 设置数据
  621. * @param k
  622. * @param v
  623. * @param vtData, 淘汰的数据
  624. * @return int
  625. */
  626. int set(const string& k, const string& v, bool bNewBlock, vector<TC_RBTree::BlockData> &vtData);
  627. /**
  628. * 设置Key, 无数据
  629. * @param k
  630. * @param vtData
  631. *
  632. * @return int
  633. */
  634. int set(const string& k, bool bNewBlock, vector<TC_RBTree::BlockData> &vtData);
  635. /**
  636. *
  637. * @param pKey
  638. * @param iKeyLen
  639. *
  640. * @return bool
  641. */
  642. bool equal(const string &k, string &k1, string &v, int &ret);
  643. /**
  644. *
  645. * @param pKey
  646. * @param iKeyLen
  647. *
  648. * @return bool
  649. */
  650. bool equal(const string& k, string &k1, int &ret);
  651. /**
  652. * 下一个item
  653. *
  654. * @return RBTreeLockItem
  655. */
  656. void nextItem(int iType);
  657. /**
  658. * 上一个item
  659. * @param iType
  660. */
  661. void prevItem(int iType);
  662. friend class TC_RBTree;
  663. friend struct TC_RBTree::RBTreeLockIterator;
  664. private:
  665. /**
  666. * map
  667. */
  668. TC_RBTree *_pMap;
  669. /**
  670. * block的地址
  671. */
  672. uint32_t _iAddr;
  673. };
  674. /////////////////////////////////////////////////////////////////////////
  675. // 定义迭代器
  676. struct RBTreeLockIterator
  677. {
  678. public:
  679. //定义遍历方式
  680. enum
  681. {
  682. IT_RBTREE = 1, //rbtree大小遍历
  683. IT_SET = 2, //Set时间顺序
  684. IT_GET = 3, //Get时间顺序
  685. };
  686. //遍历顺序
  687. enum
  688. {
  689. IT_NEXT = 0,
  690. IT_PREV = 1,
  691. };
  692. /**
  693. *
  694. */
  695. RBTreeLockIterator();
  696. /**
  697. * 构造函数
  698. * @param iAddr, 地址
  699. * @param type
  700. */
  701. RBTreeLockIterator(TC_RBTree *pMap, uint32_t iAddr, int iType, int iOrder);
  702. /**
  703. * copy
  704. * @param it
  705. */
  706. RBTreeLockIterator(const RBTreeLockIterator &it);
  707. /**
  708. * 复制
  709. * @param it
  710. *
  711. * @return RBTreeLockIterator&
  712. */
  713. RBTreeLockIterator& operator=(const RBTreeLockIterator &it);
  714. /**
  715. *
  716. * @param mcmi
  717. *
  718. * @return bool
  719. */
  720. bool operator==(const RBTreeLockIterator& mcmi);
  721. /**
  722. *
  723. * @param mv
  724. *
  725. * @return bool
  726. */
  727. bool operator!=(const RBTreeLockIterator& mcmi);
  728. /**
  729. * 前置++
  730. *
  731. * @return RBTreeLockIterator&
  732. */
  733. RBTreeLockIterator& operator++();
  734. /**
  735. * 后置++
  736. *
  737. * @return RBTreeLockIterator&
  738. */
  739. RBTreeLockIterator operator++(int);
  740. /**
  741. *
  742. *
  743. * @return RBTreeLockItem&i
  744. */
  745. RBTreeLockItem& operator*() { return _iItem; }
  746. /**
  747. *
  748. *
  749. * @return RBTreeLockItem*
  750. */
  751. RBTreeLockItem* operator->() { return &_iItem; }
  752. /**
  753. * 设置顺序
  754. * @param iOrder
  755. */
  756. void setOrder(int iOrder) { _iOrder = iOrder; }
  757. public:
  758. /**
  759. *
  760. */
  761. TC_RBTree *_pMap;
  762. /**
  763. *
  764. */
  765. RBTreeLockItem _iItem;
  766. /**
  767. * 迭代器的方式
  768. */
  769. int _iType;
  770. /**
  771. * 顺序
  772. */
  773. int _iOrder;
  774. };
  775. ////////////////////////////////////////////////////////////////
  776. // map的数据项
  777. class RBTreeItem
  778. {
  779. public:
  780. /**
  781. *
  782. * @param pMap
  783. * @param key
  784. */
  785. RBTreeItem(TC_RBTree *pMap, const string &key, bool bEnd);
  786. /**
  787. *
  788. * @param mcmdi
  789. */
  790. RBTreeItem(const RBTreeItem &mcmdi);
  791. /**
  792. *
  793. */
  794. RBTreeItem() : _bEnd(true)
  795. {
  796. }
  797. /**
  798. *
  799. * @param mcmdi
  800. *
  801. * @return RBTreeLockItem&
  802. */
  803. RBTreeItem &operator=(const RBTreeItem &mcmdi);
  804. /**
  805. *
  806. * @param mcmdi
  807. *
  808. * @return bool
  809. */
  810. bool operator==(const RBTreeItem &mcmdi);
  811. /**
  812. *
  813. * @param mcmdi
  814. *
  815. * @return bool
  816. */
  817. bool operator!=(const RBTreeItem &mcmdi);
  818. /**
  819. * 获取当前数据
  820. *
  821. * @return RT_OK, 获取成功
  822. * RT_ONLY_KEY, 是onlykey
  823. * RT_NO_DATA, 无数据
  824. * RT_EXCEPTION_ERR, 异常
  825. */
  826. int get(TC_RBTree::BlockData &stData);
  827. protected:
  828. /**
  829. * 获取key
  830. *
  831. * @return string
  832. */
  833. string getKey() const { return _key; }
  834. /**
  835. * 空数据
  836. *
  837. * @return bool
  838. */
  839. bool isEnd() const { return _bEnd; }
  840. /**
  841. * 下一个item
  842. *
  843. * @return
  844. */
  845. void nextItem();
  846. /**
  847. * 上一个item
  848. */
  849. void prevItem();
  850. friend class TC_RBTree;
  851. friend struct TC_RBTree::RBTreeIterator;
  852. private:
  853. /**
  854. * map
  855. */
  856. TC_RBTree *_pMap;
  857. /**
  858. * block的地址
  859. */
  860. string _key;
  861. /**
  862. * 是否是结尾
  863. */
  864. bool _bEnd;
  865. };
  866. /////////////////////////////////////////////////////////////////////////
  867. // 定义迭代器
  868. struct RBTreeIterator
  869. {
  870. public:
  871. //遍历顺序
  872. enum
  873. {
  874. IT_NEXT = 0,
  875. IT_PREV = 1,
  876. };
  877. /**
  878. *
  879. */
  880. RBTreeIterator();
  881. /**
  882. * 构造函数
  883. * @param iAddr, 地址
  884. * @param type
  885. */
  886. RBTreeIterator(TC_RBTree *pMap, const string &key, bool bEnd, int iOrder);
  887. /**
  888. * copy
  889. * @param it
  890. */
  891. RBTreeIterator(const RBTreeIterator &it);
  892. /**
  893. * 复制
  894. * @param it
  895. *
  896. * @return RBTreeIterator&
  897. */
  898. RBTreeIterator& operator=(const RBTreeIterator &it);
  899. /**
  900. *
  901. * @param mcmi
  902. *
  903. * @return bool
  904. */
  905. bool operator==(const RBTreeIterator& mcmi);
  906. /**
  907. *
  908. * @param mv
  909. *
  910. * @return bool
  911. */
  912. bool operator!=(const RBTreeIterator& mcmi);
  913. /**
  914. * 前置++
  915. *
  916. * @return RBTreeIterator&
  917. */
  918. RBTreeIterator& operator++();
  919. /**
  920. * 后置++
  921. *
  922. * @return RBTreeIterator&
  923. */
  924. RBTreeIterator operator++(int);
  925. /**
  926. *
  927. *
  928. * @return RBTreeItem&i
  929. */
  930. RBTreeItem& operator*() { return _iItem; }
  931. /**
  932. *
  933. *
  934. * @return RBTreeItem*
  935. */
  936. RBTreeItem* operator->() { return &_iItem; }
  937. public:
  938. /**
  939. *
  940. */
  941. TC_RBTree *_pMap;
  942. /**
  943. *
  944. */
  945. RBTreeItem _iItem;
  946. /**
  947. * 顺序
  948. */
  949. int _iOrder;
  950. };
  951. public:
  952. //////////////////////////////////////////////////////////////////////////////////////////////////
  953. // map定义
  954. //
  955. /**
  956. * map头
  957. */
  958. #pragma pack(1)
  959. struct tagMapHead
  960. {
  961. char _cMaxVersion; //大版本
  962. char _cMinVersion; //小版本
  963. bool _bReadOnly; //是否只读
  964. bool _bAutoErase; //是否可以自动淘汰
  965. char _cEraseMode; //淘汰方式:0x00:按照Get链淘汰, 0x01:按照Set链淘汰
  966. size_t _iMemSize; //内存大小
  967. uint32_t _iMinDataSize; //最小数据块大小
  968. uint32_t _iMaxDataSize; //最大数据块大小
  969. float _fFactor; //因子
  970. uint32_t _iElementCount; //总元素个数
  971. uint32_t _iEraseCount; //每次删除个数
  972. uint32_t _iDirtyCount; //脏数据个数
  973. uint32_t _iSetHead; //Set时间链表头部
  974. uint32_t _iSetTail; //Set时间链表尾部
  975. uint32_t _iGetHead; //Get时间链表头部
  976. uint32_t _iGetTail; //Get时间链表尾部
  977. uint32_t _iDirtyTail; //脏数据链尾部
  978. time_t _iSyncTime; //回写时间
  979. uint32_t _iUsedChunk; //已经使用的内存块
  980. uint32_t _iGetCount; //get次数
  981. uint32_t _iHitCount; //命中次数
  982. uint32_t _iBackupTail; //热备指针
  983. uint32_t _iSyncTail; //回写链表
  984. uint32_t _iOnlyKeyCount; // OnlyKey个数
  985. uint32_t _iRootAddr; //根元素地址
  986. uint32_t _iReserve[4]; //保留
  987. };
  988. /**
  989. * 需要修改的地址
  990. */
  991. struct tagModifyData
  992. {
  993. size_t _iModifyAddr; //修改的地址
  994. char _cBytes; //字节数
  995. size_t _iModifyValue; //值
  996. };
  997. /**
  998. * 修改数据块头部
  999. */
  1000. struct tagModifyHead
  1001. {
  1002. char _cModifyStatus; //修改状态: 0:目前没有人修改, 1: 开始准备修改, 2:修改完毕, 没有copy到内存中
  1003. uint32_t _iNowIndex; //更新到目前的索引, 不能操作1000个
  1004. tagModifyData _stModifyData[1000]; //一次最多1000次修改
  1005. };
  1006. #pragma pack()
  1007. //64位操作系统用基数小版本号, 32位操作系统用偶数小版本
  1008. //注意与hashmap的版本差别
  1009. #if __WORDSIZE == 64 || defined _WIN64
  1010. //定义版本号
  1011. enum
  1012. {
  1013. MAX_VERSION = 2, //当前map的大版本号
  1014. MIN_VERSION = 1, //当前map的小版本号
  1015. };
  1016. #else
  1017. //定义版本号
  1018. enum
  1019. {
  1020. MAX_VERSION = 2, //当前map的大版本号
  1021. MIN_VERSION = 0, //当前map的小版本号
  1022. };
  1023. #endif
  1024. //定义淘汰方式
  1025. enum
  1026. {
  1027. ERASEBYGET = 0x00, //按照Get链表淘汰
  1028. ERASEBYSET = 0x01, //按照Set链表淘汰
  1029. };
  1030. const static char RED = 0; //红色节点
  1031. const static char BLACK = 1; //黑色节点
  1032. /**
  1033. * get, set等int返回值
  1034. */
  1035. enum
  1036. {
  1037. RT_OK = 0, //成功
  1038. RT_DIRTY_DATA = 1, //脏数据
  1039. RT_NO_DATA = 2, //没有数据
  1040. RT_NEED_SYNC = 3, //需要回写
  1041. RT_NONEED_SYNC = 4, //不需要回写
  1042. RT_ERASE_OK = 5, //淘汰数据成功
  1043. RT_READONLY = 6, //map只读
  1044. RT_NO_MEMORY = 7, //内存不够
  1045. RT_ONLY_KEY = 8, //只有Key, 没有Value
  1046. RT_NEED_BACKUP = 9, //需要备份
  1047. RT_NO_GET = 10, //没有GET过
  1048. RT_DECODE_ERR = -1, //解析错误
  1049. RT_EXCEPTION_ERR = -2, //异常
  1050. RT_LOAD_DATA_ERR = -3, //加载数据异常
  1051. RT_VERSION_MISMATCH_ERR = -4, //版本不一致
  1052. RT_DUMP_FILE_ERR = -5, //dump到文件失败
  1053. RT_LOAL_FILE_ERR = -6, //load文件到内存失败
  1054. RT_NOTALL_ERR = -7, //没有复制完全
  1055. };
  1056. //定义迭代器
  1057. typedef RBTreeLockIterator lock_iterator;
  1058. typedef RBTreeIterator nolock_iterator;
  1059. //定义key比较处理器
  1060. using less_functor = std::function<bool (const string& , const string& )>;
  1061. /**
  1062. * 缺省的小写比较符号
  1063. */
  1064. struct default_less
  1065. {
  1066. bool operator()(const string &k1, const string &k2)
  1067. {
  1068. return k1 < k2;
  1069. }
  1070. };
  1071. //////////////////////////////////////////////////////////////////////////////////////////////
  1072. //map的接口定义
  1073. /**
  1074. * 构造函数
  1075. */
  1076. TC_RBTree()
  1077. : _iMinDataSize(0)
  1078. , _iMaxDataSize(0)
  1079. , _fFactor(1.0)
  1080. , _lock_end(this, 0, 0, 0)
  1081. , _nolock_end(this, "", true, 0)
  1082. , _pDataAllocator(new BlockAllocator(this))
  1083. , _lessf(default_less())
  1084. {
  1085. }
  1086. /**
  1087. * 初始化数据块平均大小
  1088. * 表示内存分配的时候,会分配n个最小块, n个(最小快*增长因子), n个(最小快*增长因子*增长因子)..., 直到n个最大块
  1089. * n是hashmap自己计算出来的
  1090. * 这种分配策略通常是数据块记录变长比较多的使用, 便于节约内存,如果数据记录基本不是变长的, 那最小块=最大快,增长因子=1就可以了
  1091. * @param iMinDataSize: 最小数据块大小
  1092. * @param iMaxDataSize: 最大数据块大小
  1093. * @param fFactor: 增长因子
  1094. */
  1095. void initDataBlockSize(uint32_t iMinDataSize, uint32_t iMaxDataSize, float fFactor);
  1096. /**
  1097. * 初始化, 之前需要调用:initDataAvgSize和initHashRadio
  1098. * @param pAddr 绝对地址
  1099. * @param iSize 大小
  1100. * @return 失败则抛出异常
  1101. */
  1102. void create(void *pAddr, size_t iSize);
  1103. /**
  1104. * 链接到内存块
  1105. * @param pAddr, 地址
  1106. * @param iSize, 内存大小
  1107. * @return 失败则抛出异常
  1108. */
  1109. void connect(void *pAddr, size_t iSize);
  1110. /**
  1111. * 原来的数据块基础上扩展内存, 注意通常只能对mmap文件生效
  1112. * (如果iSize比本来的内存就小,则返回-1)
  1113. * @param pAddr, 扩展后的空间
  1114. * @param iSize
  1115. * @return 0:成功, -1:失败
  1116. */
  1117. int append(void *pAddr, size_t iSize);
  1118. /**
  1119. * 获取每种大小内存块的头部信息
  1120. *
  1121. * @return vector<TC_MemChunk::tagChunkHead>: 不同大小内存块头部信息
  1122. */
  1123. vector<TC_MemChunk::tagChunkHead> getBlockDetail() { return _pDataAllocator->getBlockDetail(); }
  1124. /**
  1125. * 所有block中chunk的个数
  1126. *
  1127. * @return size_t
  1128. */
  1129. size_t allBlockChunkCount() { return _pDataAllocator->allBlockChunkCount(); }
  1130. /**
  1131. * 每种block中chunk的个数(不同大小内存块的个数相同)
  1132. *
  1133. * @return vector<size_t>
  1134. */
  1135. vector<size_t> singleBlockChunkCount() { return _pDataAllocator->singleBlockChunkCount(); }
  1136. /**
  1137. * 元素的个数
  1138. *
  1139. * @return size_t
  1140. */
  1141. uint32_t size() { return _pHead->_iElementCount; }
  1142. /**
  1143. * 脏数据元素个数
  1144. *
  1145. * @return size_t
  1146. */
  1147. uint32_t dirtyCount() { return _pHead->_iDirtyCount;}
  1148. /**
  1149. * OnlyKey数据元素个数
  1150. *
  1151. * @return uint32_t
  1152. */
  1153. uint32_t onlyKeyCount() { return _pHead->_iOnlyKeyCount;}
  1154. /**
  1155. * 设置每次淘汰数量
  1156. * @param n
  1157. */
  1158. void setEraseCount(uint32_t n) { _pHead->_iEraseCount = n; }
  1159. /**
  1160. * 获取每次淘汰数量
  1161. *
  1162. * @return uint32_t
  1163. */
  1164. uint32_t getEraseCount() { return _pHead->_iEraseCount; }
  1165. /**
  1166. * 设置只读
  1167. * @param bReadOnly
  1168. */
  1169. void setReadOnly(bool bReadOnly) { _pHead->_bReadOnly = bReadOnly; }
  1170. /**
  1171. * 是否只读
  1172. *
  1173. * @return bool
  1174. */
  1175. bool isReadOnly() { return _pHead->_bReadOnly; }
  1176. /**
  1177. * 设置是否可以自动淘汰
  1178. * @param bAutoErase
  1179. */
  1180. void setAutoErase(bool bAutoErase) { _pHead->_bAutoErase = bAutoErase; }
  1181. /**
  1182. * 是否可以自动淘汰
  1183. *
  1184. * @return bool
  1185. */
  1186. bool isAutoErase() { return _pHead->_bAutoErase; }
  1187. /**
  1188. * 设置淘汰方式
  1189. * TC_RBTree::ERASEBYGET
  1190. * TC_RBTree::ERASEBYSET
  1191. * @param cEraseMode
  1192. */
  1193. void setEraseMode(char cEraseMode) { _pHead->_cEraseMode = cEraseMode; }
  1194. /**
  1195. * 获取淘汰方式
  1196. *
  1197. * @return bool
  1198. */
  1199. char getEraseMode() { return _pHead->_cEraseMode; }
  1200. /**
  1201. * 设置回写时间(秒)
  1202. * @param iSyncTime
  1203. */
  1204. void setSyncTime(time_t iSyncTime) { _pHead->_iSyncTime = iSyncTime; }
  1205. /**
  1206. * 获取回写时间
  1207. *
  1208. * @return time_t
  1209. */
  1210. time_t getSyncTime() { return _pHead->_iSyncTime; }
  1211. /**
  1212. * 获取头部数据信息
  1213. *
  1214. * @return tagMapHead&
  1215. */
  1216. tagMapHead& getMapHead() { return *_pHead; }
  1217. /**
  1218. * dump到文件
  1219. * @param sFile
  1220. *
  1221. * @return int
  1222. * RT_DUMP_FILE_ERR: dump到文件出错
  1223. * RT_OK: dump到文件成功
  1224. */
  1225. int dump2file(const string &sFile);
  1226. /**
  1227. * 从文件load
  1228. * @param sFile
  1229. *
  1230. * @return int
  1231. * RT_LOAL_FILE_ERR: load出错
  1232. * RT_VERSION_MISMATCH_ERR: 版本不一致
  1233. * RT_OK: load成功
  1234. */
  1235. int load5file(const string &sFile);
  1236. /**
  1237. * 清空hashmap
  1238. * 所有map的数据恢复到初始状态
  1239. */
  1240. void clear();
  1241. /**
  1242. * 检查数据干净状态
  1243. * @param k
  1244. *
  1245. * @return int
  1246. * RT_NO_DATA: 没有当前数据
  1247. * RT_ONLY_KEY:只有Key
  1248. * RT_DIRTY_DATA: 是脏数据
  1249. * RT_OK: 是干净数据
  1250. * 其他返回值: 错误
  1251. */
  1252. int checkDirty(const string &k);
  1253. /**
  1254. * 设置为脏数据, 修改SET时间链, 会导致数据回写
  1255. * @param k
  1256. *
  1257. * @return int
  1258. * RT_READONLY: 只读
  1259. * RT_NO_DATA: 没有当前数据
  1260. * RT_ONLY_KEY:只有Key
  1261. * RT_OK: 设置脏数据成功
  1262. * 其他返回值: 错误
  1263. */
  1264. int setDirty(const string& k);
  1265. /**
  1266. * 设置为干净数据, 修改SET链, 导致数据不回写
  1267. * @param k
  1268. *
  1269. * @return int
  1270. * RT_READONLY: 只读
  1271. * RT_NO_DATA: 没有当前数据
  1272. * RT_ONLY_KEY:只有Key
  1273. * RT_OK: 设置成功
  1274. * 其他返回值: 错误
  1275. */
  1276. int setClean(const string& k);
  1277. /**
  1278. * 获取数据, 修改GET时间链
  1279. * @param k
  1280. * @param v
  1281. * @param iSyncTime:数据上次回写的时间
  1282. *
  1283. * @return int:
  1284. * RT_NO_DATA: 没有数据
  1285. * RT_ONLY_KEY:只有Key
  1286. * RT_OK:获取数据成功
  1287. * 其他返回值: 错误
  1288. */
  1289. int get(const string& k, string &v, time_t &iSyncTime);
  1290. /**
  1291. * 获取数据, 修改GET时间链
  1292. * @param k
  1293. * @param v
  1294. *
  1295. * @return int:
  1296. * RT_NO_DATA: 没有数据
  1297. * RT_ONLY_KEY:只有Key
  1298. * RT_OK:获取数据成功
  1299. * 其他返回值: 错误
  1300. */
  1301. int get(const string& k, string &v);
  1302. /**
  1303. * 设置数据, 修改时间链, 内存不够时会自动淘汰老的数据
  1304. * @param k: 关键字
  1305. * @param v: 值
  1306. * @param bDirty: 是否是脏数据
  1307. * @param vtData: 被淘汰的记录
  1308. * @return int:
  1309. * RT_READONLY: map只读
  1310. * RT_NO_MEMORY: 没有空间(不淘汰数据情况下会出现)
  1311. * RT_OK: 设置成功
  1312. * 其他返回值: 错误
  1313. */
  1314. int set(const string& k, const string& v, bool bDirty, vector<BlockData> &vtData);
  1315. /**
  1316. * 设置key, 但无数据
  1317. * @param k
  1318. * @param vtData
  1319. *
  1320. * @return int
  1321. * RT_READONLY: map只读
  1322. * RT_NO_MEMORY: 没有空间(不淘汰数据情况下会出现)
  1323. * RT_OK: 设置成功
  1324. * 其他返回值: 错误
  1325. */
  1326. int set(const string& k, vector<BlockData> &vtData);
  1327. /**
  1328. * 删除数据
  1329. * @param k, 关键字
  1330. * @param data, 被删除的记录
  1331. * @return int:
  1332. * RT_READONLY: map只读
  1333. * RT_NO_DATA: 没有当前数据
  1334. * RT_ONLY_KEY:只有Key, 删除成功
  1335. * RT_OK: 删除数据成功
  1336. * 其他返回值: 错误
  1337. */
  1338. int del(const string& k, BlockData &data);
  1339. /**
  1340. * 淘汰数据, 每次删除一条, 根据Get时间淘汰
  1341. * 外部循环调用该接口淘汰数据
  1342. * 直到: 元素个数/chunks * 100 < radio, bCheckDirty 为true时,遇到脏数据则淘汰结束
  1343. * @param radio: 共享内存chunks使用比例 0< radio < 100
  1344. * @param data: 当前被删除的一条记录
  1345. * @return int:
  1346. * RT_READONLY: map只读
  1347. * RT_OK: 不用再继续淘汰了
  1348. * RT_ONLY_KEY:只有Key, 删除成功
  1349. * RT_DIRTY_DATA:数据是脏数据,当bCheckDirty=true时会有可能产生这种返回值
  1350. * RT_ERASE_OK:淘汰当前数据成功, 继续淘汰
  1351. * 其他返回值: 错误, 通常忽略, 继续调用erase淘汰
  1352. */
  1353. int erase(int radio, BlockData &data, bool bCheckDirty = false);
  1354. /**
  1355. * 回写, 每次返回需要回写的一条
  1356. * 数据回写时间与当前时间超过_pHead->_iSyncTime则需要回写
  1357. * _pHead->_iSyncTime由setSyncTime函数设定, 默认10分钟
  1358. * 外部循环调用该函数进行回写
  1359. * map只读时仍然可以回写
  1360. * @param iNowTime: 当前时间
  1361. * 回写时间与当前时间相差_pHead->_iSyncTime都需要回写
  1362. * @param data : 回写的数据
  1363. * @return int:
  1364. * RT_OK: 到脏数据链表头部了, 可以sleep一下再尝试
  1365. * RT_ONLY_KEY:只有Key, 删除成功, 当前数据不要缓写,继续调用sync回写
  1366. * RT_NEED_SYNC:当前返回的data数据需要回写
  1367. * RT_NONEED_SYNC:当前返回的data数据不需要回写
  1368. * 其他返回值: 错误, 通常忽略, 继续调用sync回写
  1369. */
  1370. int sync(time_t iNowTime, BlockData &data);
  1371. /**
  1372. * 开始回写, 调整回写指针
  1373. */
  1374. void sync();
  1375. /**
  1376. * 开始备份之前调用该函数
  1377. *
  1378. * @param bForceFromBegin: 是否强制重头开始备份
  1379. * @return void
  1380. */
  1381. void backup(bool bForceFromBegin = false);
  1382. /**
  1383. * 开始备份数据, 每次返回需要备份的一条数据
  1384. * @param data
  1385. *
  1386. * @return int
  1387. * RT_OK: 备份完毕
  1388. * RT_NEED_BACKUP:当前返回的data数据需要备份
  1389. * RT_ONLY_KEY:只有Key, 当前数据不要备份
  1390. * 其他返回值: 错误, 通常忽略, 继续调用backup
  1391. */
  1392. int backup(BlockData &data);
  1393. /**
  1394. * 设置比较方式
  1395. * @param lessf
  1396. */
  1397. void setLessFunctor(less_functor lessf) { _lessf = lessf; }
  1398. /**
  1399. * 获取比较方式
  1400. *
  1401. * @return less_functor&
  1402. */
  1403. less_functor &getLessFunctor() { return _lessf; }
  1404. /////////////////////////////////////////////////////////////////////////////////////////
  1405. // 以下是遍历map函数, 无需要对map加大面积锁, 但是遍历效率有一定影响
  1406. // (只在get以及迭代器++的时候加锁)
  1407. // 获取的迭代器和数据不保证实时有效,可能已经被删除了,获取数据时需要判断数据的合法性
  1408. /**
  1409. * 结束
  1410. *
  1411. * @return
  1412. */
  1413. nolock_iterator nolock_end() { return _nolock_end; }
  1414. /**
  1415. * 按从小到大排序
  1416. *
  1417. * @return nolock_iterator
  1418. */
  1419. nolock_iterator nolock_begin();
  1420. /**
  1421. * 按从大到小排序
  1422. *
  1423. * @return nolock_iterator
  1424. */
  1425. nolock_iterator nolock_rbegin();
  1426. /////////////////////////////////////////////////////////////////////////////////////////
  1427. // 以下是遍历map函数, 需要对map加大面积锁(及迭代器存在有效范围内全部都加锁)
  1428. // 获取的数据以及迭代器都是实时有效
  1429. /**
  1430. * 结束
  1431. *
  1432. * @return
  1433. */
  1434. lock_iterator end() { return _lock_end; }
  1435. /**
  1436. * 按从小到大排序(sort顺序)
  1437. *
  1438. * @return lock_iterator
  1439. */
  1440. lock_iterator begin();
  1441. /**
  1442. * 按从大到小序(sort逆序)
  1443. *
  1444. * @return lock_iterator
  1445. */
  1446. lock_iterator rbegin();
  1447. /**
  1448. * 查找(++表示顺序)
  1449. *
  1450. * @param k
  1451. *
  1452. * @return lock_iterator
  1453. */
  1454. lock_iterator find(const string& k);
  1455. /**
  1456. * 查找(++表示逆序)
  1457. *
  1458. * @param k
  1459. *
  1460. * @return lock_iterator
  1461. */
  1462. lock_iterator rfind(const string& k);
  1463. /**
  1464. * 返回查找关键字的下界(返回键值>=给定元素的第一个位置)
  1465. * map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的就是3
  1466. * @param k
  1467. *
  1468. * @return lock_iterator
  1469. */
  1470. lock_iterator lower_bound(const string &k);
  1471. /**
  1472. * 返回查找关键字的上界(返回键值>给定元素的第一个位置)
  1473. * map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的就是3
  1474. * @param k
  1475. *
  1476. * @return lock_iterator
  1477. */
  1478. lock_iterator upper_bound(const string &k);
  1479. /**
  1480. * 查找
  1481. * @param k1
  1482. * @param k2
  1483. *
  1484. * @return pair<lock_iterator,lock_iterator>
  1485. */
  1486. pair<lock_iterator, lock_iterator> equal_range(const string& k1, const string &k2);
  1487. //////////////////////////////////////////////////////////////////////////////////////
  1488. //
  1489. /**
  1490. * 以Set时间排序的迭代器
  1491. *
  1492. * @return lock_iterator
  1493. */
  1494. lock_iterator beginSetTime();
  1495. /**
  1496. * Set链逆序的迭代器
  1497. *
  1498. * @return lock_iterator
  1499. */
  1500. lock_iterator rbeginSetTime();
  1501. /**
  1502. * 以Get时间排序的迭代器
  1503. *
  1504. * @return lock_iterator
  1505. */
  1506. lock_iterator beginGetTime();
  1507. /**
  1508. * Get链逆序的迭代器
  1509. *
  1510. * @return lock_iterator
  1511. */
  1512. lock_iterator rbeginGetTime();
  1513. /**
  1514. * 获取脏链表尾部迭代器(最长时间没有操作的脏数据)
  1515. *
  1516. * 返回的迭代器++表示按照时间顺序==>(最短时间没有操作的脏数据)
  1517. *
  1518. * @return lock_iterator
  1519. */
  1520. lock_iterator beginDirty();
  1521. ///////////////////////////////////////////////////////////////////////////
  1522. /**
  1523. * 描述
  1524. *
  1525. * @return string
  1526. */
  1527. string desc();
  1528. protected:
  1529. //禁止copy构造
  1530. TC_RBTree(const TC_RBTree &mcm);
  1531. //禁止复制
  1532. TC_RBTree &operator=(const TC_RBTree &mcm);
  1533. struct FailureRecover
  1534. {
  1535. FailureRecover(TC_RBTree *pMap) : _pMap(pMap)
  1536. {
  1537. _pMap->doRecover();
  1538. }
  1539. ~FailureRecover()
  1540. {
  1541. _pMap->doUpdate();
  1542. }
  1543. protected:
  1544. TC_RBTree *_pMap;
  1545. };
  1546. /**
  1547. * 初始化
  1548. * @param pAddr
  1549. */
  1550. void init(void *pAddr);
  1551. /**
  1552. * 增加脏数据个数
  1553. */
  1554. void incDirtyCount() { saveValue(&_pHead->_iDirtyCount, _pHead->_iDirtyCount+1); }
  1555. /**
  1556. * 减少脏数据个数
  1557. */
  1558. void delDirtyCount() { saveValue(&_pHead->_iDirtyCount, _pHead->_iDirtyCount-1); }
  1559. /**
  1560. * 增加数据个数
  1561. */
  1562. void incElementCount() { saveValue(&_pHead->_iElementCount, _pHead->_iElementCount+1); }
  1563. /**
  1564. * 减少数据个数
  1565. */
  1566. void delElementCount() { saveValue(&_pHead->_iElementCount, _pHead->_iElementCount-1); }
  1567. /**
  1568. * 增加OnlyKey数据个数
  1569. */
  1570. void incOnlyKeyCount() { saveValue(&_pHead->_iOnlyKeyCount, _pHead->_iOnlyKeyCount+1); }
  1571. /**
  1572. * 减少OnlyKey数据个数
  1573. */
  1574. void delOnlyKeyCount() { saveValue(&_pHead->_iOnlyKeyCount, _pHead->_iOnlyKeyCount-1); }
  1575. /**
  1576. * 增加Chunk数
  1577. * 直接更新, 因为有可能一次分配的chunk个数
  1578. * 多余更新区块的内存空间, 导致越界错误
  1579. */
  1580. void incChunkCount() { saveValue(&_pHead->_iUsedChunk, _pHead->_iUsedChunk+1); }
  1581. /**
  1582. * 减少Chunk数
  1583. * 直接更新, 因为有可能一次释放的chunk个数
  1584. * 多余更新区块的内存空间, 导致越界错误
  1585. */
  1586. void delChunkCount() { saveValue(&_pHead->_iUsedChunk, _pHead->_iUsedChunk-1); }
  1587. /**
  1588. * 增加hit次数
  1589. */
  1590. void incGetCount() { saveValue(&_pHead->_iGetCount, _pHead->_iGetCount+1); }
  1591. /**
  1592. * 增加命中次数
  1593. */
  1594. void incHitCount() { saveValue(&_pHead->_iHitCount, _pHead->_iHitCount+1); }
  1595. /**
  1596. * 相对地址换成绝对地址
  1597. * @param iAddr
  1598. *
  1599. * @return void*
  1600. */
  1601. void *getAbsolute(uint32_t iAddr) { if(iAddr == 0) return NULL; return _pDataAllocator->_pChunkAllocator->getAbsolute(iAddr); }
  1602. /**
  1603. * 淘汰iNowAddr之外的数据(根据淘汰策略淘汰)
  1604. * @param iNowAddr, 当前Block不能正在分配空间, 不能被淘汰
  1605. * 0表示做直接根据淘汰策略淘汰
  1606. * @param vector<BlockData>, 被淘汰的数据
  1607. * @return uint32_t,淘汰的数据个数
  1608. */
  1609. uint32_t eraseExcept(uint32_t iNowAddr, vector<BlockData> &vtData);
  1610. /**
  1611. * 根据key获得最后一个大于当前key的block
  1612. * @param k
  1613. *
  1614. * @return size_t
  1615. */
  1616. Block getLastBlock(const string &k);
  1617. /**
  1618. * 从某个地址开始超找
  1619. *
  1620. * @param iAddr
  1621. * @param k
  1622. * @param ret
  1623. *
  1624. * @return lock_iterator
  1625. */
  1626. lock_iterator find(uint32_t iAddr, const string& k, int &ret, bool bOrder = true);
  1627. /**
  1628. * 从某个地址开始查找
  1629. *
  1630. * @param iAddr
  1631. * @param k
  1632. * @param v
  1633. * @param ret
  1634. *
  1635. * @return lock_iterator
  1636. */
  1637. lock_iterator find(uint32_t iAddr, const string& k, string &v, int &ret);
  1638. /**
  1639. * 修改具体的值
  1640. * @param iModifyAddr
  1641. * @param iModifyValue
  1642. */
  1643. template<typename T>
  1644. void saveValue(void* iModifyAddr, T iModifyValue, bool bModify = true)
  1645. {
  1646. //获取原始值
  1647. T tmp = *(T*)iModifyAddr;
  1648. //保存原始值
  1649. _pstModifyHead->_stModifyData[_pstModifyHead->_iNowIndex]._iModifyAddr = (char*)iModifyAddr - (char*)_pHead;
  1650. _pstModifyHead->_stModifyData[_pstModifyHead->_iNowIndex]._iModifyValue = tmp;
  1651. _pstModifyHead->_stModifyData[_pstModifyHead->_iNowIndex]._cBytes = sizeof(iModifyValue);
  1652. _pstModifyHead->_iNowIndex++;
  1653. _pstModifyHead->_cModifyStatus = 1;
  1654. if(bModify)
  1655. {
  1656. //修改具体值
  1657. *(T*)iModifyAddr = iModifyValue;
  1658. }
  1659. assert(_pstModifyHead->_iNowIndex < sizeof(_pstModifyHead->_stModifyData) / sizeof(tagModifyData));
  1660. }
  1661. /**
  1662. * 恢复数据
  1663. */
  1664. void doRecover();
  1665. /**
  1666. * 确认处理完毕
  1667. */
  1668. void doUpdate();
  1669. protected:
  1670. /**
  1671. * 区块指针
  1672. */
  1673. tagMapHead *_pHead;
  1674. /**
  1675. * 最小的数据块大小
  1676. */
  1677. uint32_t _iMinDataSize;
  1678. /**
  1679. * 最大的数据块大小
  1680. */
  1681. uint32_t _iMaxDataSize;
  1682. /**
  1683. * 变化因子
  1684. */
  1685. float _fFactor;
  1686. /**
  1687. * 尾部
  1688. */
  1689. lock_iterator _lock_end;
  1690. /**
  1691. * 尾部
  1692. */
  1693. nolock_iterator _nolock_end;
  1694. /**
  1695. * 修改数据块
  1696. */
  1697. tagModifyHead *_pstModifyHead;
  1698. /**
  1699. * block分配器对象
  1700. */
  1701. BlockAllocator *_pDataAllocator;
  1702. /**
  1703. * 比较公式
  1704. */
  1705. less_functor _lessf;
  1706. };
  1707. }
  1708. #endif