Level DB --- Cache
class Cache是Level DB中的重要的数据结构,它是一个LRU(Least Recently Used) Cache的实现。这里面的判断条件主要是内存大小(而不是存储entry的个数)。当内存达到上界,会释放不被使用的entry(存储到lru_中的entry)。
HandleTable
说到class Cache先说class Handle Table,它是Level DB作者实现的一个hash map,对于相同哈希值碰撞,Handle Table使用了链地址法---即相同的hash值组成了一个链表,它要比C++ STL中的hash map快5%,同时,Handle Table不是一个通用的hash map,它是定制化LRUHandle(Cache中使用的结构体)使用的hash map,这也是它效率高的一个原因。

图1. Handle Table
核心函数
LRUHandle** FindPointer(const Slice& key, uint32_t hash) {//hash & (length_ - 1),计算slot,ptr是hash值相同链表的head pointerLRUHandle** ptr = &list_[hash & (length_ - 1)];//遍历链表,寻找查询的key-valuewhile (*ptr != nullptr && ((*ptr)->hash != hash || key != (*ptr)->key())) {ptr = &(*ptr)->next_hash;}return ptr;
}
//检索 key & hash 的 pointer
LRUHandle* Lookup(const Slice& key, uint32_t hash)//插入新的entry
LRUHandle* Insert(LRUHandle* h)//删除key & value 的 pointer
LRUHandle* Remove(const Slice& key, uint32_t hash) //当插入的key的数量达到一定的值,为了保证效率,会重新扩大slots(list_)的数量,
//slots数量增加,重新hash,每个slot的链表也会变小,加快链表遍历检索的效率
//这里为了进一步加快效率,我们也可以定义自己的Resize触发条件
void Resize()
Cache
Handle
Handle是Cache计算的entry句柄,它既存在于hash table中,也存在于双向链表(Least Recently Used由双向链表实现)中,它的嵌入方式如图2所示。

图2. LRU Handle
Handle在hash table中的组织形式如图1所示,在双向链表中的组织形式如图3所示。

图3. 双向链表
添加与删除
对于从双向链表中做删除操作很简单,只需要将重置handle的pre和next指针,如图4所示。

图4. 双向链表删除handle
void LRUCache::LRU_Remove(LRUHandle* e) {e->next->prev = e->prev;e->prev->next = e->next;
}
对于从双向链表中插入,需要插入到双向链表的head,如图5所示

图5. 双向链表插入handle
void LRUCache::LRU_Append(LRUHandle* list, LRUHandle* e) {// Make "e" newest entry by inserting just before *liste->next = list;e->prev = list->prev;e->prev->next = e;e->next->prev = e;
}
当内存达到上限的时候,将会循环从lru_中list next开始删除,如图6所示

图6. 当内存导到上限,逐个删除lru_中的least recently used handle
while (usage_ > capacity_ && lru_.next != &lru_) {LRUHandle* old = lru_.next;assert(old->refs == 1);bool erased = FinishErase(table_.Remove(old->key(), old->hash));if (!erased) { // to avoid unused variable when compiled NDEBUGassert(erased);}
}
lru_ 和 in_use_
在设计上,Cache 用了2个双向链表lru_和in_use_,这么设计主要是从计算效率上考虑。当一个新的handle会存储到in_use_中,当这个handle被删除,它会转移到lru_中。而当这个handle需要再次被只用,就可以从lru_重新插入到in_use_,而不需要重新申请资源。
当需要释放资源的时候,直接从lru_中删除。
GUARDED_BY
#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
#define THREAD_ANNOTATION_ATTRIBUTE_(x) __attribute__((x))
所以
#define GUARDED_BY(x) __attribute__((x))(guarded_by(x))
编译器会确保在访问特定变量之前必须先锁定相应的互斥量(mutex),从而防止多个线程同时访问该变量,导致数据竞争和不一致的问题。等于在编译的时候就做了临界区域的保护提醒。
代码中的EXCLUSIVE_LOCKS_REQUIRED也同理。
ShardedLRUCache
ShardedLRUCache,是用来进一步提升Cache的性能,因为Cache里面有临界区域影响了并发写,ShardedLRUCache等于是又做了一次分桶,用来提升并发写。
相关文章:
Level DB --- Cache
class Cache是Level DB中的重要的数据结构,它是一个LRU(Least Recently Used) Cache的实现。这里面的判断条件主要是内存大小(而不是存储entry的个数)。当内存达到上界,会释放不被使用的entry(存…...
学在西电录播课使用python下载,通过解析m3u8协议、多线程下载ts视频块以及ffmpeg合并
本文涵盖的内容仅供个人学习使用,如果侵犯学校权利,麻烦联系我删除。 初衷 研究生必修选逃, 期末复习怕漏过重点题目,但是看学在西电的录播回放课一卡一卡的,于是想在空余时间一个个下载下来,然后到时候就…...
Springboot3介绍
一、Springboot3简介: https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html?spmwolai.workspace.0.0.68b62306Q6jtTw#getting-started.introducing-spring-boot 无论使用XML、注解、Java配置类还是他们的混合用法,配置文件过于…...
Oracle 11G DataGuard GAP 修复过程(通过主库scn增备恢复)
Oracle 11G DataGuard GAP 修复 (通过主库scn增备恢复) 介绍 DG GAP 顾名思义就是:DG不同步,当备库不能接受到一个或多个主库的归档日志文件时候,就发生了 GAP。 那么,如果遇到GAP如何修复呢?…...
WLAN AutoConfig服务假死?重启服务恢复网络连接!
目录 背景: 过程: 可能引起原因: 具体解决步骤: 方法一: 方法二: 总结: 背景: 这个问题困扰我好长一段时间了,每次下班将电脑关机后,次日早上电脑开机…...
【linux】(30)shell-条件判断
if 语句 if 语句是 Shell 脚本中用于条件判断的基本结构。 基本语法 if 语句的基本语法如下: if [ condition ] thencommands ficondition 是要测试的条件。commands 是在条件为真时要执行的命令。 示例 简单条件判断 #!/bin/bashif [ 1 -eq 1 ] thenecho &q…...
docker安装启动问题解决排查
一、安装docker报错 刚开始安装docker报这个错: Error: Transaction test error: file /usr/libexec/docker/cli-plugins/docker-buildx from install of docker-ce-cli-1:20.10.8-3.el8.x86_64 conflicts with file from package docker-buildx-plugin-0:0.14.0…...
《MySQL 查询进阶:复杂查询语句的魅力》
一、引言 MySQL 的复杂查询语句就像是一把神奇的钥匙,能够打开数据世界的大门,展现出数据的无限魅力。本文将带你深入探索 MySQL 查询进阶技巧,从常用查询到子查询,再到视图的运用,让你领略复杂查询语句的强大功能。 …...
OpenHarmony-3.HDF框架(2)
OpenHarmony HDF 平台驱动 1.平台驱动概述 系统平台驱动框架是系统驱动框架的重要组成部分,它基于HDF驱动框架、操作系统适配层(OSAL, operating system abstraction layer)以及驱动配置管理机制,为各类平台设备驱动的实现提供标准模型。 系统平台驱动(…...
人大金仓(KingBaseEs)数据库操作手册
人大金仓数据库(KingbaseES)是由北京人大金仓信息技术股份有限公司(简称人大金仓)自主研发的、具有自主知识产权的通用关系型数据库管理系统。 官方下载地址:KingbaseES 人大金仓数据库 KES技术文档在线手册…...
Flink+Paimon实时数据湖仓实践分享
随着 Paimon 近两年的推广普及,使用 FlinkPaimon 构建数据湖仓的实践也越来越多。在 Flink 实时数据开发中,对于依赖大量状态 state 的场景,如长周期的累加指标计算、回撤长历史数据并更新等,使用实时数仓作为中间存储来代替 Flin…...
w~深度学习~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12663254 #Motion Plan 代码 github.com/liangwq/robot_motion_planing 轨迹约束中的软硬约束 前面的几篇文章已经介绍了,轨迹约束的本质就是在做带约束的轨迹拟合。输入就是waypoint点list,约束…...
KVM 虚拟化
KVM(Kernel-based Virtual Machine)是一种基于内核的虚拟机技术,具有以下优势: 开源性:KVM是完全开源的,这意味着它没有许可费用,适合预算有限的用户。性能:KVM利用Linux内…...
MONI后台管理系统-数据库设计
前言:该文档纯属个人总结设计,如果雷同,纯属巧合,其中还有很不合理之处,请大家批评指正。如有应用于项目,请慎重。 注意: 如有需要该文件的sql脚本,请移步:资源下载 1. 表清单 序号…...
Rigol DP711自动控制--SCPI命令
通过串口的SCPI命令来控制通道输入输出 也可以用UltraSigma UI来发送SCPI 物理连接: Pin2_2, Pin3_3, Pin5_5 串口命令控制: 命令:9600, 8bit, None SCPI CMD(Standard Commands for Programmable Instruments) OUTPut CH1, On…...
总结FastDFS的面试题
目录 一:FastDFS的基础知识 1:定义 2:FastDFS的优点 3:tracker server 4:storage server 二:FastDFS的存储原理 1:小文件存储的问题 2:小文件合并存储 3:文件上…...
Fiddler 5.21.0 使用指南:过滤浏览器HTTP(S)流量下(四)
概述 在上一篇文章中,我们介绍了一部分简单的过滤功能,已经可以帮助我们较为准确的定位到感兴趣的请求;提升我们的工作效率,我们可以通过设置更为复杂的过滤规则,精准到定位的我们想要的请求和响应信息。专注于分析对…...
【踩坑】pip安装依赖卡在Installing build dependencies ...
pip安装依赖卡在Installing build dependencies ... 如图,pip安装依赖一直卡着,最后不得不ctrlC强制终止 用–verbose显示详细安装信息,发现卡在安装numpy pip install -r requirements.txt --verbose大概率是网络问题,用镜像单…...
【WRF-Urban】SLUCM新增空间分布城市冠层参数及人为热排放AHF代码详解(下)
目录 详细解释更改文件内容4 运行模块(run):README.namelist5 输出模块(share):share/module_check_a_mundo.Fshare/output_wrf.F参考SLUCM新增空间分布城市冠层参数及人为热排放AHF代码详解的前两部分内容可参见-【WRF-Urban】SLUCM新增空间分布城市冠层参数及人为热排放A…...
云桌面:云计算桌面
目录 云桌面的定义和核心概念 技术架构详解 主流架构详解 管理成本分析 安全性措施 应用场景详解 云桌面的定义和核心概念 云桌面是一种通过云计算技术提供的虚拟桌面服务,它允许用户通过网络访问远程服务器上的虚拟机,这些虚拟机为用户提供了一个…...
Youtu-VL-4B-Instruct基础教程:system message规范写法避免API响应异常
Youtu-VL-4B-Instruct基础教程:system message规范写法避免API响应异常 你是不是在用Youtu-VL-4B-Instruct的API时,偶尔会遇到一些奇怪的响应?比如模型突然不按套路出牌,或者干脆给你返回一些看不懂的内容? 别担心&a…...
Umi-OCR无界面服务化启动指南:将OCR能力无缝集成到自动化工作流
Umi-OCR无界面服务化启动指南:将OCR能力无缝集成到自动化工作流 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode…...
H3C F1070防火墙console密码恢复实战指南
1. 当console密码成为拦路虎时 刚接手公司网络设备那会儿,我就被H3C F1070防火墙来了个下马威。那天机房搬迁后需要调试设备,结果发现前任管理员留下的console密码早已失效。这种场景就像你拿着钥匙回老家,却发现锁芯被换了一样尴尬。作为网络…...
万兆NAS成本大揭秘:用MicroServer Gen8+二手X520网卡搭建全流程(含读写性能实测)
万兆NAS成本大揭秘:用MicroServer Gen8二手X520网卡搭建全流程(含读写性能实测) 在追求高速网络存储的时代,万兆NAS已成为技术爱好者的新宠。本文将带你深入了解如何以最低成本搭建一套性能不俗的万兆NAS系统,核心硬件…...
SDMatte效果深度评测:复杂发丝与透明物体的抠图表现
SDMatte效果深度评测:复杂发丝与透明物体的抠图表现 1. 开篇:当AI遇到抠图难题 抠图技术发展了几十年,但遇到复杂发丝和透明物体时,传统方法往往束手无策。直到AI技术的介入,这个老大难问题才有了突破性进展。SDMatt…...
【PVE实战】低成本2.5G网卡升级与iperf3性能验证全记录
1. 为什么需要升级到2.5G网络环境 最近几年,随着NAS、视频剪辑、虚拟机等应用场景的普及,传统的千兆网络(1Gbps)越来越显得力不从心。我自己就经常遇到这样的情况:在局域网内传输大文件时,千兆网络的极限速…...
如何快速完成亚马逊SP-API注册:AWS IAM策略与角色配置详解
亚马逊SP-API高效注册指南:从AWS IAM配置到应用上线的全流程解析 当你的电商业务需要与亚马逊平台深度集成时,SP-API(Selling Partner API)将成为不可或缺的工具。作为亚马逊新一代的开发者接口,它比传统的MWS提供了更…...
SDMatte与前端框架React集成:打造交互式在线图片编辑工具
SDMatte与前端框架React集成:打造交互式在线图片编辑工具 1. 引言:为什么需要在线图片编辑工具 电商商家每天需要处理大量商品图片,传统PS操作门槛高且效率低下。而专业设计师又需要更灵活的工具进行创意表达。基于React框架和SDMatte构建的…...
Fish Speech 1.5语音克隆对比实验:5秒vs10秒参考音频效果差异分析
Fish Speech 1.5语音克隆对比实验:5秒vs10秒参考音频效果差异分析 1. 实验背景与目的 语音克隆技术正在改变我们与数字内容互动的方式,而Fish Speech 1.5作为新一代文本转语音模型,在声音克隆方面表现出色。但在实际应用中,一个…...
ncmdump:突破NCM格式限制的音频转换解决方案
ncmdump:突破NCM格式限制的音频转换解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 问题场景:数字音乐格式的兼容性困境 在流媒体音乐服务普及的今天,网易云音乐采用的NCM加密格式成为了…...
