高性能本地缓存Ristretto(四)—— NumCounters 与 MaxCost参数的设置

news2024/10/6 8:36:26

ristretto 参数

我在使用ristretto时,对于参数的设置有些疑问。主要是 NumCounters ,MaxCost 分别表示什么含义,以及如何确定其数值的问题。

在此记录并分享一下,欢迎各位批评指正,谢谢

官方的指导

先看一下官方的例子以及相关的解释:

func main() {
	cache, err := ristretto.NewCache(&ristretto.Config{
		NumCounters: 1e7,     // number of keys to track frequency of (10M).
		MaxCost:     1 << 30, // maximum cost of cache (1GB).
		BufferItems: 64,      // number of keys per Get buffer.
	})
	......

	// set a value with a cost of 1
	cache.Set("key", "value", 1)

	......
}

其中,有三个关键参数:NumCounters,MaxCost,BufferItems。同时,官方也分别给出了解释:

NumCounters int64

NumCounters is the number of 4-bit access counters to keep for admission and eviction. We've seen good performance in setting this to 10x the number of items you expect to keep in the cache when full.

For example, if you expect each item to have a cost of 1 and MaxCost is 100, set NumCounters to 1,000. Or, if you use variable cost values but expect the cache to hold around 10,000 items when full, set NumCounters to 100,000. The important thing is the number of unique items in the full cache, not necessarily the MaxCost value.

MaxCost int64

MaxCost is how eviction decisions are made. For example, if MaxCost is 100 and a new item with a cost of 1 increases total cache cost to 101, 1 item will be evicted.

MaxCost can also be used to denote the max size in bytes. For example, if MaxCost is 1,000,000 (1MB) and the cache is full with 1,000 1KB items, a new item (that's accepted) would cause 5 1KB items to be evicted.

MaxCost could be anything as long as it matches how you're using the cost values when calling Set.

BufferItems int64

BufferItems is the size of the Get buffers. The best value we've found for this is 64.

If for some reason you see Get performance decreasing with lots of contention (you shouldn't), try increasing this value in increments of 64. This is a fine-tuning mechanism and you probably won't have to touch this.

BufferItem已经说了,最好是设置为64,再根据实际情况微调。但是对于MaxCost 和 NumCounters 如何设置的问题, 什么都说了,又好像什么都没说。

索性大概搜索了一下,发现有人直接翻译为如下的内容:

在这里插入图片描述

这真的对吗?NumCouters是指频率?MaxCost是存储容量?带着这些疑问,我翻阅了一下代码,发现并非如此。

MaxCost 的含义,以及作用

先看一下MaxCost 参数,明白了这个之后,NumCounters就很容易了。

Cost在这里可以翻译为“成本”,但是我觉得此时理解为“资源”或者“预算”更合理,MaxCost即最大资源或者最大预算。这个资源可以是key的数量,可以是存储空间,可以是任何维度的概念。只要在Set的时候,cost参数赋予相同的概念就行了。

例子1

假如你计划只放置100个数据在缓存中,即有100个位置用于放置数据;那么你每次set的时候,cost设置为1,即表示你消耗了一个位置。当100个位置消耗完时,就会开始执行淘汰策略。对于这种场景,maxcost的值应设置为100,且在set操作时,cost值为1。

在这里插入图片描述

例子2

假如你不关心有多少个数据要缓存,你只是希望划分100k的内存用于缓存数据;同时可能每个数据的大小是不同的,有的占1k,有的占5k,有的占3k; 当剩余内存空间不够用于分配给新数据时,就会执行淘汰策略。对于这种场景,maxcost就是你计划划分的空间,即100;而每次set时的cost参数即数据的大小。
在这里插入图片描述

至此,你会明白,Maxcost的含义是资源的最大数量,它的作用是杜绝无限制地使用资源,并及时的触发淘汰策略。maxcost要配合set函数的cost参数使用,使两者具有对等的意义。

NumCounters 的含义,以及作用

上一节提到,当总的资源占用超过maxcost的限制时,会触发淘汰策略,那么如何确定要淘汰哪一个数据呢,根据TinyLFU算法,会尽可能淘汰被访问次数最少的数据,即不经常用的数据,自然就没有缓存的价值。

那么如何确定访问被次数最少的数据呢?显然需要每次访问时,都记录一下。

那么如何记录每一个key的被访问次数呢? 最简单是为每一个数据设置一个计数器(实际情况不是这样,实际用到了Count-Min sketch算法,利用该算法就无需为每一个数据都设置一个计数器,更节省资源,具体的算法内容不是这里要讨论的内容,请自行查阅相关资料)。

总之,我们需要记录每一个数据被访问的次数,即每一个数据都有其对应的计数器。那么NumCounters就是指计数器的数量,即数据的个数,进步一理解为key的数量(所有的key的数量,不仅仅是要缓存的数据的数量)。

那么难题来了,我们怎么知道总共会出现多少个key呢?例如我要以用户名为key,缓存用户信息,那用户名可多了去了,无法估算,怎么办?莫慌,官方预判了你的预判,你不知道总共有多少key,但是你大概可以知道,你计划缓存多少个key吧? 把这个数量乘10 , 就是你NumCounters的数值。

举个例子:我的系统里有10万个用户,但是我计划缓存1000个活跃用户,那么NumCounters为1000 * 10 = 10000。

*另外需要注意,不能简单地认为,NumCounters = MaxCountter 10 ,这只能对应上一节例子1的场景。再举个例子:我计划用1000k的内存空间缓存用户数据(maxcost=1000),但是有的用户信息很完整占用空间很多,假为如20k,有的用户数据很少,只有2k。大概平均计算下来,我只能缓存500个数据,这时NumCounters 就不是1000 * 10 ,而是500 *10。

写在最后:
以上就是我个人对于这两个关键参数的理解,如有问题欢迎交流,谢谢。祝愿各位的程序用上缓存之后,快的飞起!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模糊测试面面观 | 模糊测试工具知多少

自1988年威斯康星大学的Barton Miller首次提出模糊测试这一概念以来&#xff0c;模糊测试领域经历了持续长久发展。模糊测试作为一种软件测试方法&#xff0c;旨在通过向程序输入模糊、随机、异常的数据&#xff0c;探测和发现潜在的漏洞和错误。这种方法备受安全研究人员的青睐…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价

近年来&#xff0c;国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究&#xff0c;他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合&#xff0c;评价不同类型研究区的生态脆弱特征&#xff0c;其研究内容…

win下qwidget全屏弹窗后其他窗口鼠标样式无法更新的问题

在win平台下&#xff0c;实现截取选桌面执行推理功能&#xff0c;用一个qwidget(j对象名为m_selectWidget)来显示选取范围的边框&#xff0c;但这个qwidget显示后&#xff0c;其他窗口在他下面可以接受鼠标相应的事件&#xff0c;但原来的鼠标形状功能失效&#xff08;mac正常&…

构建去中心化微服务集群,满足高可用性和高并发需求的实践指南!

随着互联网技术的不断发展&#xff0c;微服务架构已经成为了开发和部署应用程序的一种主流方式。然而&#xff0c;当应用程序需要满足高可用性和高并发需求时&#xff0c;单一中心化的微服务架构可能无法满足性能和可靠性的要求。因此&#xff0c;构建一个去中心化的微服务集群…

Fine tune简介

目录 Intro Related work Example .1 重新训练 .2 使用新的数据集进行fine tune .3 修改net结构 References 移学习不是一种算法而是一种机器学习思想,应用到深度学习就是微调(Fine-tune)。通过修改预训练网络模型结构(如修改样本类别输出个数),选择性载入预训练网络…

BOXTRADE-天启量化分析平台 主要功能介绍

BOXTRADE-天启量化分析平台 主要功能介绍 potato 数学 web 缘起 月晕而风&#xff0c;础润而雨 BOXTRADE-天启量化 欢迎来到天启量化&#xff01;这是一个专注于量化分析的网站。我们致力于为用户提供市场行情技术指标和量化策略分析方面的优质内容和资源。 我们的使命是 做…

马斯克为何说大模型中R语言会替代Python

为什么不是Python&#xff1f; 当今的LLM应用程序&#xff0c;包括推理应用程序和代理&#xff0c;大多是用 Python 编写的。但这种情况即将改变。对于新一波的开发人员来说&#xff0c;Python 实在是太慢、太臃肿&#xff0c;而且要命的是太笨拙了。事实上&#xff0c; LLVM、…

安防视频汇聚平台EasyCVR视频监控综合管理平台H.265转码功能更新,新增分辨率配置的具体步骤

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

sql server安装报错 合成活动模板库(ATL) 失败

错误 “合成活动模板库(ATL) 规则失败“ 解决办法&#xff1a; 进入SQL Server 2008R2安装包目录找到文件&#xff1a;sqlsupport_msi&#xff0c;安装此文件之后&#xff0c;再安装SQL Server&#xff0c;便可解决该问题。C:\SQL Server 2008R2\new\SQL Server 2008R2\2052_CH…

专访阿里云席明贤,视频云如何运用大模型与小模型来破茧升级2.0

不久前&#xff0c;LiveVideoStack与阿里云视频云负责人席明贤&#xff08;花名右贤&#xff09;展开一场深度的对话&#xff0c;一个是圈内专业的社区媒体&#xff0c;一个是20年的IT老兵&#xff0c;双方有交集、有碰撞、有火花。 面对风云变幻的内外环境&#xff0c;阿里云…

【开发】视频云存储EasyCVR视频汇聚平台AI智能算法定制

安防视频集中存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

Golang 基础语法问答

使用值为 nil 的 slice、map 会发生什么&#xff1f; 允许对值为 nil 的 slice 添加元素&#xff0c;但是对值为 nil 的 map 添加元素时会造成运行时 panic。 // map错误示例 func main() {var m map[string]intm["one"] 1 // error: panic: assignment to entry …

构建高可用的去中心化微服务集群架构指南

随着云计算、大数据和物联网的快速发展&#xff0c;企业对于可扩展的、高性能的微服务架构的需求也日益增长。传统的集中式架构已经不能满足这些需求&#xff0c;因此出现了去中心化的微服务集群架构。本文将介绍如何构建高可用的去中心化微服务集群架构&#xff0c;以满足企业…

多路复用epoll函数组

epoll函数组 /*创建epoll句柄*/ int epoll_create(int size);//size参数实际上已经被弃用 /*epoll句柄的控制接口*/ int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event); epfd:epoll专用的文件描述符&#xff0c;epoll_create()的返回值 op:表示动作&#x…

美国大模型风向速报(一)为何重视提示工程?LangChain+向量数据库+开源大模型真香...

多家&#xff0c;且独家来自美国的信源同时向“亲爱的数据”表示&#xff0c; 提示工程&#xff08;Prompt Engineering&#xff09;在美国大模型领域备受重视。 读者都要聊&#xff0c; 那就干活。 &#xff08;一&#xff09;开源真香 现阶段&#xff0c;AI开源极客大展身手&…

认识容器,走进Docker

文章目录 容器技术简介容器的核心技术容器平台技术容器的支持技术 Docker理念Docker安装配置阿里云镜像加速器 容器技术简介 一切在云端&#xff0c;万物皆容器&#xff0c;说到容器&#xff0c;大家都会想到Docker,Docker现在几乎是容器的代名词&#xff0c;什么是Docker&…

故障011:dmap服务缺失libnsl.so修复

故障011&#xff1a;dmap服务缺失libnsl.so修复 1. 问题描述2. 解决方法2.1 初步分析2.2 动手实操2.2.1 模糊搜索大法2.2.2 僵桃代李大法 DM技术交流QQ群&#xff1a;940124259 1. 问题描述 今天遇二期XC环境&#xff0c;达梦DM 7.6的DmAPService备份辅助进程服务无法启动&a…

SpringBoot 响应头添加版本号、打包项目后缀添加版本号和时间

文章目录 响应头添加版本号获取版本号添加响应处理器请求结果 打包项目后缀添加版本号和时间实现打包结果 响应头添加版本号 获取版本号 在 pom.xml 中&#xff0c;在 project.version 下定义版本号 在 application.yml 获取 pom.xml 中 project.version 中的信息 添加响应处…

JetBrains IDE远程开发功能可供GitHub用户使用

JetBrains与GitHub去年已达成合作&#xff0c;提供GitHub Codespaces 与 JetBrains Gateway 之间的集成。 GitHub Codespaces允许用户创建安全、可配置、专属的云端开发环境&#xff0c;此集成意味着您可以通过JetBrains Gateway使用在 GitHub Codespaces 中运行喜欢的IDE进行…

【002】学习笔记之typescript的【任意类型】

任意类型 顶级类型&#xff1a;any类型和 unknown 类型 any类型 声明变量的时候没有指定任意类型默认为any任意类型都可以赋值给any&#xff0c;不需要检查类型。也是他的弊端如果使用any 就失去了TS类型检测的作用 unknown 类型 TypeScript 3.0中引入的 unknown 类型也被认为…