# 1、整体架构
每个缓存节点,均可暴露http接口,以接受用户的查询请求,此外,每个缓存节点,均保存了其它节点的ip地址,以及真实节点与hash环中虚拟节点的映射关系,可以找到对应的key应该在哪个节点进行查询,并与该节点进行通信。
用户携带key发送查询请求进来后的流程如下:
1. 在当前节点进行查询,若当前节点存在key对应的value,则直接将结果返回给用户;
2. 当前节点不存在key对应的值,则使用一致性hash算法,找到key值对应的虚拟节点,通过map中存储的映射关系找到真实节点,去真实节点中进行查询。
3. 若缓存中存在key,则将查询结果返回;
4. 缓存中不存在key,则使用设置的回调函数,去数据库进行查询,并将查询结果返回,并将查询到的key-value队存入数据库。
![image.png](./images/框架.png)
# 2、一致性hash算法
目前默认3个真实节点对应哈希环中50倍的虚拟节点(150个),也就是说1个真实节点对应hash环中50个虚拟节点,虚拟节点按照真实节点的url+序号通过crc32.ChecksumIEEEhash算法,随机的对应2^32个hash环中槽的一个位置。保证了相同的key每次都能对应同一个节点的同时,防止了hash环倾斜的问题。
但是目前的服务是在启动时,就确定了节点的数量和通信ip,不支持动态的扩容和删除节点,这是未来可以改良的部分。
# 3、LRU淘汰机制
使用带头结点的双向链表存储数据,使用map存储了每个key对应的结点,保证了查找的O(1)复杂度。
+ 淘汰数据:从尾结点开始删除结点。
+ 插入数据:数据插入在root后面;
+ 已经在缓存中的数据被查询后:移至root后;
![image.png](./images/LRU.png)
# 4、屏障锁机制
为了防止某个key短期内大量查询,导致缓存穿透,使用屏障锁,使得短期内相同key的查询只通过一个(这个短期的时间有多长?取决于当前状态的底层数据库,响应该key的请求时间);锁屏障原理如下:
1. key查询请求过来时,申请锁,获得锁的请求将继续下去,其它请求阻塞在该位置;
2. 判断要查找的key是否已经存在设置的map中,存在则进入map中的逻辑,不存在则继续向下去读取数据,(第一次进来map中肯定未存储key),若存在则等待设置的信号量锁;
3. 实例化一个值的结构体,将其存入map中,以查询的key为键,此时添加信号量锁,在释放读写锁;(此时1中等待的请求将全部进入2中,等待信号量锁的释放);
4. 读取数据,存入实例化好的结构体中,释放信号量锁,此时2中所有请求将时间读取存储在map中的数据;
5. 最后情况map中键值对。
# 5、protobuf
1. 创建.ptoto文件,定义请求和响应参数,使用protoc生成go文件;
2. 将请求和响应改为生成go文件的结构体;
3. 使用proto序列号与反序列化请求和响应数据即可。
# 6、运行
1. 拉取到本地
```git
git clone https://github.com/2563347014/DistributedCache.git
```
2. 切换目录
```git
cd ./DistributedCache
```
3. 授予运行权限
```git
chmod 777 ./start.sh
```
4. 启动服务
```shell
./start.sh
```
# 7、测试
默认开启的端口是9999,使用Get格式传输查询的key值。
```shell
curl "http://localhost:9999/api?key=Tom"
```
龙年行大运
- 粉丝: 1384
- 资源: 3960
最新资源
- 基于模型预测控制的永磁同步电机并网发电控制系统 simulink仿真,效果非常好
- matlab 小波阈值降噪,经典信号分解及降噪程序,模态
- 基于comsol的储层降压开采过程中的渗流-应力耦合算例 提供基于comsol的储层降压开采过程中的渗流-应力耦合算例,可在此基础上熟悉降压开采过程中的渗流-应力耦合计算方法
- 固高运动控制卡GTS400系列用C#语言写的二轴取放料学习模板,扩展性强,轴参数,登录界面,轴点位数据都用INI配置文件保存读取,是学习用C#运动控制的好案例,代码有注释,便于理解吸收, 录制的,超级
- 深度神经网络(DNN)做多特征输入单输出的二分类及多分类模型 程序内注释详细,直接替数据就可以用 程序语言为matlab 程序可出分类效果图,迭代优化图,混淆矩阵图具体效果如下所示 PS:以
- 永磁同步电机PMSM的MTPA+弱磁控制 包含参考资料,搭建步骤
- 自动驾驶基于阿克曼模型的控制算法仿真测试 , 基于ROS扣取单独的阿克曼控制算法模块进行测试,能够帮助朋友们学习基于阿克曼模型的控制算法实现以及对该控制算法的理解 阿克曼实现部分带有代码注释,帮助您
- 汇川H5U系列PLC程序 汇川H5U PLC程序,搭配汇川伺服驱动器,运动控制总线轴运动 PLC程序+昆仑通态触摸屏程序 ,模板程序,高端大气上档次UI设计,工控模板 优秀的触摸屏模板
- MATLAB对矩阵数据输出二维图和三维图m文件源码资料包 便于目视判读
- SiC MOSFET碳化硅MOS管驱动电路设计与Pspice仿真(基于同步整流电路,具有防直通互锁、米勒钳位、短路电流保护、负压关断等功能) 原理图和pcb满足减少寄生电感等优化布局,还有buck、
- matlab simulink光伏储能并网交直流发电系统仿真模型,2018a版本,2021a版本 1)光伏采用扰动观察法最大功率跟踪 2)蓄电池为双向DC-DC变器,采用电压环和电流环控制的双闭环控制
- 遗传算法优化用于分类 回归 时序预测 遗传算法优化支持向量机SVM,最小二乘支持向量机LSSVM,随机森林RF,极限学习机ELM,核极限学习机KELM,深度极限学习机DELM,BP神经网络,长短时记忆
- MATLAB代码:基于主从博弈理论的共享储能与综合能源微网优化运行研究 关键词:主从博弈 共享储能 综合能源微网 优化调度 参考文档:《基于主从博弈理论的共享储能与综合能源微网优化运行研究》完全复现
- ZZU物联网工程专业数据结构相关整合
- MATLAB代码:基于遗传算法的电动汽车有序充放电优化 关键词:遗传算法 电动汽车 有序充电 优化调度 参考文档:《精英自适应混合遗传算法及其实现-江建》算法部分;电动汽车建模部分相关文档太多,自
- MATLAB代码:基于储能电站服务的冷热电多微网系统双层优化配置 关键词:储能电站 共享储能电站 冷热电多微网 双层优化配置 参考文档:《基于储能电站服务的冷热电多微网系统双层优化配置》完全复
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈