# xhashmap **Repository Path**: xunmenglong/xhashmap ## Basic Information - **Project Name**: xhashmap - **Description**: 一个线程安全的hashmap实现,特点是读性能高,因为读不加锁,只有写加锁,通过特殊实现保障线程安全。 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-12-06 - **Last Updated**: 2022-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xhashmap # 简介 一个线程安全, 写加锁,读不加锁,追求极致读取性能的hashmap实现。 # 由来 该hashmap主要是作为存储系统/搜索引擎的索引而设计,为了考虑读性能,所以读不加锁,写加锁。 因为在索引当中,往往key值是一个int32/int64,value值是一个磁盘指针位置信息,也就是说大量的key/value都是小内存。 而存储系统/搜索引擎对索引的操作又特别频繁,所以为了避免大量而又频繁的申请和释放内存,做了如下几个优化: 1. 插入需要的新空间不直接问系统malloc,而是按大块内存申请,然后再进行二次的内存分配和管理 1. 删除节点的时候该空间不回收,而是放队列中,下次有新申请需求的时候直接使用 1. 因为读没加锁,删除节点有小概率可能还被访问到,所以增加一个延时回收机制,默认为10秒,即删除节点要10秒钟以后才会被回收 > 因为只有删除节点的时候,正好有读请求遍历到该桶内节点拉链,才有可能出现冲突。 > 而我们认为遍历一个桶内的节点拉链,10秒钟肯定能完成了,所以通过这10秒钟的延时回收,就能保证读不加锁,且保证线程安全。 # 安装教程 ## 依赖模块 1. xunmenlong/xutil 1. 一些辅助函数库 1. 地址:[https://gitee.com/xunmenglong/xutil](https://gitee.com/xunmenglong/xutil) 2. BRPC 1. 其实只依赖rapidjson,直接复用brpc中的rapidjson了 1. 地址:[https://gitee.com/baidu/BRPC](https://gitee.com/baidu/BRPC) ## 安装依赖 工作跟目录下的目录结构如下: ``` . |-- xunmenglong | | -- xutil | ` -- xhashmap `-- third_party ` -- BRPC ``` 如果你相关依赖都安装好了,就直接跳过步骤,如果你现在还是个空目录,请参考如下命令安装好依赖: 如果你已经安装好了部分依赖,请参考注释将没装好的依赖安装好即可。 ```shell cd mkdir third_party cd third_party # 安装和编译brpc git clone https://gitee.com/baidu/BRPC.git cd BRPC sh config_brpc.sh --headers=/usr/include --libs=/usr/lib64 # 大概需要1分钟 make -j16 # 回到根目录,开始安装迅猛龙相关 cd ../.. mkdir xunmenglong cd xunmenglong # 下载xutil, xutil无需编译 git clone https://gitee.com/xunmenglong/xutil.git ``` ## 安装xhashmap 参考如下命令: ```shell # 下载xhashmap git clone https://gitee.com/xunmenglong/xhashmap.git ## 编译x cd xhashmap make ## 编译示例 cd example make ## 没有编译错误,看到日志输出即代表安装成功 ./example ``` # 使用说明 代码使用跟普通的hashmap使用方式类似, 具体可以参考代码中的example/example.cpp