商业公链之区块链技术使用的常见库(七)------Go语言缓存LRU库"github.com/hashicorp/golang-lru"

golang-lru Cache (一)LRU 简介 Golang 第三方库golang-lru基于双向链表实现了三种LRU及变种Cache:LRU,Q2,ARC。今天看了一下代码,简单优雅,整理一下笔记。 双向链表 双向链表在golang标准库container/list中实现。定义了两个核心结构体Element和List。 Element 双向链表的一个节点信息。 type Element struct { ... 阅读详情

Golang 第三方库golang-lru基于双向链表实现了三种LRU及变种Cache:LRU,Q2,ARC。LRU算法:若数据已经在缓存中,将其移到队首,并返回结果。若数据不在缓存中,将新记录添加到队首。若缓存超长,清理队尾缓存数据。

2Q算法有两个缓存队列,一个是FIFO队列,用于保存最近访问的数据;一个是LRU队列,用于保存热点数据。recent 用于保存最近访问的数据,frequent用于保存热点数据,recentEvict保存从最近队列中剔除的数据。当增加一个新记录时:

如果frequent队列中存在该数据则更新,否则下一步;

如果recent队列存在该数据,则将其移至frequent队列,否则下一步;

如果recentEvict队列存在该数据,则确保队列有空间后将其移至frequent,否则下一步;

确保队列有空闲,并将其添加至recent。

第一步,frequent 长度不变,整个2q Cache长度不变;第二步recent长度减一,frequent长度加一,总长度不变;第三步,recentEvict长度减一,frequent要增加新数据,由于recentEvict不计算在cache size内,总长度加一,所以需要确认队列是否有空闲,如果没有则remove oldest;第四步,recent长度加1,总长度加一,需要判断队列是否有空闲。

1.安装缓存库: go get "github.com/hashicorp/golang-lru"

2.导入缓存库:import "github.com/hashicorp/golang-lru"

3.创建给定大小3的LRU:kvch, err := lru.New(3)

4.将值添加到缓存:kvch.Add("1", "9")

5.获得缓存中key对应的value,不存在返回nil,false:kvch.Get("1")

6.获得缓存长度:Kvch.Len()

示例源码:阅读原文,用法文档:https://godoc.org/github.com/hashicorp/golang-lru#New

希望大家关注我的微信公众号,推荐给更多技术极客,日更一篇区块链技术博客不易,有疑问可以后台留言。

本地缓存库分析(一):golang-lru 如果用go自带的map实现本地缓存,大概有两种实现方式: 1. sync.Map 2. map + mutex.RWLock 但有以下缺点: 1. 锁竞争严重 2. 大量缓存写入,导致gc标记阶段占用cpu多 3. 内存占用不可控 4. 不支持缓存按时效性淘汰 5. 不支持缓存过期 6. 缓存数据可以被污染:如果缓存的V是指针,那么业务修改了V的某个值为当前请求用户自己的值,在缓存中的V就被污染了 阅读详情

相关推荐

Velero代码深入分析(三)-- Velero的插件系统之go-plugin库的集成

本文展开讨论了插件库的集成

weixin_54323634的博客 737

探索高效内存缓存:Golang-LRU 库

是 HashiCorp 公司开发的一个轻量级、高效的 Go 语言实现的 Least Recently Used (LRU) 缓存库。LRU 算法是一种常见的内存管理策略,当内存空间不足时,它会优先淘汰最近最少使用的数据项。 ## 技术分析 Golang-LRU 的设计简洁而实用,主要由以下几个核心组件组成: 1. **`LRUCache` 结构**:这是 LRUCache 实例的主要容器,负...

gitblog_00046的博客 815

Go-一个简单高效用于go的LRU缓存包

一个简单高效用于go的LRU缓存包

Golang:golang-lru一个基于双向链表实现的LRU缓存工具

译文:这提供了实现固定大小线程安全lru缓存的lru包。它基于Groupcache中的缓存。

彭世瑜的博客 1408

锐捷交换机配置SSH

锐捷交换机配置ssh 一、组网需求 通过ssh功能可以远程登录管理设备 二、配置步骤 全局开启ssh服务,并且指定ssh版本 Ruijie>enable Ruijie#configure terminal Ruijie(config)#enable service ssh-server ------>开启SSH服务,默认关闭 Ruijie(config)#ip ssh version 2 ------>默认1.99版本,设置为版本2 添加登

Loners_fan的博客 1万+

CANoe实战:LIN Slave一致性测试全流程解析

本文详细解析了使用CANoe进行LIN Slave一致性测试的全流程,包括测试概述、环境搭建、模块集成、测试用例详解及报告分析。通过实际案例分享,帮助工程师掌握LIN 2.0/2.1/2.2、SAE J2602和ISO 17987等标准的自动化测试方法,提升汽车电子从节点的可靠性和兼容性验证效率。

weixin_42665725的博客 532

Golang groupcache LRU 缓存简介与用法

在 Go 中,如果想使用 LRU 缓存,可以使用 Google Golang 团队官方出品的开源库 groupcache ,开源地址见。LRU 缓存通过 groupcache/lru/lru.go实现,它主要是封装了一系列 LRU 缓存操作的相关接口。//创建一个 LRU Cache//向 Cache 中插入一个 KV//从 Cache 中获取一个 key 对应的 value//从 Cache 中删除一个 key//从 Cache 中删除最久未被访问的数据//获取 Cache 中当前的元素个数。

Doublelv 的博客专栏。 2963

Infinite-Canvas:一站式AI绘画工作流平台部署与实战指南

在 AI 绘画和内容创作领域,你是否经常遇到这样的困扰:灵感来了,却要在多个工具间来回切换——找素材、写提示词、调整参数、批量生成,整个过程繁琐且低效。创作一个系列作品时,管理不同版本的图片和提示词更是让人头疼。如果你渴望一个能整合所有流程,实现从素材管理、提示词工程到批量出图一站式完成的工作台,那么今天介绍的 Infinite-Canvas 正是为你量身打造的解决方案。 Infinite-Canvas 是一个开源的本地网页应用,它将 AI 绘画的完整工作流集成在一个界面中。无论你是想快速生成单张图片,还是

weixin_28707535的博客 338

golang-lru 使用方法

  package main import ( "fmt" "github.com/hashicorp/golang-lru" ) func main() { kvch, err := lru.New(3) fmt.Println(kvch, err) kvch.Add("1", "9") kvch.Add("2", "8") kvch.Add("3&q

Geek猫的专栏 2451

出现Command ‘vim‘ is available in the following places,vim: command not found等解决方法

内置命令无法识别,说明系统变量有误,导致无法识别,既然系统变量有误,将其注释或者更改为正确的即可,但是现在打不开,又怎么注释掉。替换vim来打开编辑,打开之前错误的全局变量文件,发现变量有误,要么注释要么改为。系统变量有全局变量(通过命令行printenv或者echo)和局部变量。对应通过vim修改错误的变量文件,不然source也无法让配置文件生效。本身vim是系统内置的命令,连vim都出现问题。修改为正确的即可,之后还需要重启服务器,使用。之后即可成功,通过即可查看命令是否有写入。...

码农研究僧的博客 5883

YOLOv12改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov12精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 684

缓存淘汰算法--LRU算法

1. LRU 1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 1.2. 实现 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下: 1. 新数据插入到链表头部; 2. 每当缓存命中(即缓存数

分享专栏一一一每天进步一点点 1716

Freeswitch DTMF 按键无法接收问题修复

freeswitch 在接收到 update后,会更新成新的 payload type,但是给的200响应,仍然是旧的,这时候就会导致手机侧认识需要发送旧的payload,所以发到 fs 后就会导致直接丢包,不去处理RTP包了。呼叫时需要设置通道变量 rtp_manual_rtp_bugs=ACCEPT_ANY_PAYLOAD ,这时候FS 就不会对包的payload进行判断,直接判定通过。应该修复 freeswitch 给响应时,应该根据收到的 payload 发送给手机,但是一直未找到正确的路径。

2301_81507069的博客 373

go实现LRU

package main import ( "container/list" ) // Cache 代表LRU缓存实现,暂时未考虑线程安全 type Cache struct { // MaxEntries 表示缓存容量的最大值,0表示是一个空缓存 MaxEntries int ll *list.List cache map[string]*list.Element } ...

星霜换得浮生梦 286

高熵合金AlCoCrFeNi/金刚石摩擦案例代码

本文介绍金刚石与高熵合金AlCoCrFeNi摩擦的案例。 在之前的文章中,介绍过使用fix indent命令实现虚拟球的摩擦,本文介绍使用金刚石实体球实现高熵合金摩擦的方法。 主要的模拟过程如下: (1)基体建模 建使用原子替换法获得高熵合金初始模型,升温到3000K驰豫后,冷却至300K,获得平衡组织。 (2)摩擦球建模 在高熵合金平衡组织的模型中添加金刚石摩擦球,使用change_box命令扩大box尺寸,添加金刚石摩擦球,并设置混合力场。 (3)摩擦过程 摩擦球下压一定深度后,沿y方向进行摩擦,摩擦

lammps_jiayou的博客 2900

DISK配置服务器软RAID工作任务(RAID1+BITLOCKER)-winserver4

DISK配置服务器软RAID工作任务(RAID1+BITLOCKER)-winserver4

新时代先锋的博客 7299

八分钟掌握GO实现LRU的核心思想

GO实现Redis的LRU例子 常见的三种缓存淘汰算法有三种:FIFO,LRU和LFU 实现LRU缓存淘汰算法 1.FIFO/LFU/LRU 算法简介 缓存全部存在内存中,内存是有限的,因此不可能无限制的添加数据,假定我们能够最大使用的内存为Max,那么在一个时间点之后,添加了某一条缓存记录之后,占用内存超过了N,这个时候就需要从缓存中移除一些数据,那么该移除或者淘汰谁呢?我们肯定希望去移除没用的数据,将热点数据留在缓存中,下面几种就是对应的几种策略! FIFO (First in First Out

jiohfgj的博客 912

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Golang实现LRU算法~

原文地址:Golang实现LRU算法~ LRU是LeastRecentlyUsed的缩写,即最近最少使用,是一种常用的缓存淘汰算法,选择最近最久未使用的数据予以淘汰,该算法赋予每个数据一个访问字段,用来记录一个元素自上次被访问以来所经历的时间t,当须淘汰一个数据时,选择现有数据中其t值最大的,即最近最少使用的页面予以淘汰。 Go可用链表数据结构来省去设置访问时间t字段,可将经常访问的数据插入链表头,而链表尾部的数据自然就成为最久未访问的数据。 代码实现如下: package mainim...

luyaran的博客 2541

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

golang实现LRU缓存

写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );// 返回 -1 (未找到)cache.get(1);// 返回 -1 (未找到)cache.get(1);

oHeXianRen007的博客 727

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

基于 golang 实现 LRU 算法

LRU 是 Least Recently Used 的缩写,即最近最少使用,是一种常见的页面置换算法

weixin_44728824的博客 1643

探索高效缓存之道:深入解析golang-lru库

在软件开发中,有效的数据缓存策略对于提升应用性能至关重要。今天,我们有幸向您推荐一个简洁而强大的Go语言实现的LRU(Least Recently Used)缓存库——`golang-lru`,它为您的Go项目提供了高性能且线程安全的缓存解决方案。 ## 项目介绍 `golang-lru`是一个由HashiCorp维护的开源项目,提供了一个固定大小、线程安全的LRU缓存实现。该库灵感源自Gro...

gitblog_01061的博客 762

golang 实现LRU

golang 实现LRU

phone1126的专栏 535

golang 实现单向链表(lru)、双向链表、双向循环链表

golang 实现链表

拥的博客 999

LeetCode每日一题——1206. 设计跳表

跳表的每一个操作的平均时间复杂度是O(log(n)),空间复杂度是O(n)。跳表是在O(log(n))时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。boolerase(intnum)在跳表中删除一个值,如果num不存在,直接返回false.如果存在多个num,删除其中任意一个即可。了解更多https//en.wikipedia.org/wiki/Skip_list。...

hyk的博客 406

hashicorp go-plugin构建golang插件系统

一、go-plugin简介 1、1 go-plugin是什么? 我们知道Go语言缺乏动态加载代码的机制,Go程序通常是独立的二进制文件,因此难以实现类似于C++的插件系统。即使go的最新标准引入了go plugin机制,但是由于限制性条件比较多导致在生产环境中不是很好用,比如插件的编写环境和插件的使用环境要保持一致,如gopath、go sdk版本等。 HashiCorp公司开源的go-plugin库解决了上述问题,允许应用程序通过本地网络(本机)的gRPC调用插件,规避了Go无法动态加载代码的缺点。go-

脚踏实地,不断突破自我,每天有收获就OK 3192

【golang】分布式缓存-lru算法实现

lru算法、GeeCache缓存

Free_Ya的博客 689
上一篇: 商业公链之区块链技术使用的常见库(六)------Go语言文档数据库"gopkg.in/mgo.v2"
下一篇: 商业公链之区块链技术使用的常见库(八)------Go语言单调时间库"github.com/aristanetworks/goarista/monotime"
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值