go-cache的基本使用场景示例解析

目录
  • 什么是 go-cache
  • 使用
    • 导入
    • 快速开始
  • 常量与结构体
    • 常量
    • 结构体
    • Set()
    • Get()
    • 删除
  • 其他
    • 备份恢复数据

什么是 go-cache

go-cache 是一个轻量级的基于内存的 K-V 储存组件,内部实现了一个线程安全的 map[string]interface{},适用于单机应用。具备如下功能:

  • 线程安全,多 goroutine 并发安全访问;
  • 每个 item 可以设置过期时间(或无过期时间);
  • 自动定期清理过期的 item;
  • 可以自定义清理回调函数;

这里的 item 指的是 map 里的元素。

go-cache 一般用作临时数据缓存来使用,而不是持久性的数据存储。对于某些停机后快速恢复的场景,go-cache支持将缓存数据保存到文件,恢复时从文件中将数据加载到内存。

使用

导入

github.com/patrickmn/go-cache

快速开始

c := cache.New(10*time.Second, 30*time.Second)
// 默认过期时间10s;清理间隔30s,即每30s会自动清理过期的键值对  

// 设置一个键值对,过期时间是 3s
c.Set("a", "testa", 3*time.Second)  

// 设置一个键值对,采用 New() 时的默认过期时间,即 10s
c.Set("foo", "bar", cache.DefaultExpiration)  

// 设置一个键值对,没有过期时间,不会自动过期,需要手动调用 Delete() 才能删除
c.Set("baz", 42, cache.NoExpiration)  

v, found := c.Get("a")
fmt.Println(v, found) // testa,true  

<-time.After(5 * time.Second) // 延时5s 

v, found = c.Get("a") // nil,false
fmt.Println(v, found)  

<-time.After(6 * time.Second) 

v, found = c.Get("foo") // nil,false
fmt.Println(v, found) 

v, found = c.Get("baz") // 42,true
fmt.Println(v, found)

常量与结构体

常量

const (
    NoExpiration time.Duration = -1    // 无有效时间
    DefaultExpiration time.Duration = 0   // 表示采用默认时间
)

这两个参数可以用作 New() 函数的第一个入参,则默认过期时间小于0,意味着添加键值对时如果采用默认过期时间,则该键值对不会过期,因为 DeleteExpired() 方法会判断 v.Expiration 是否大于 0,大于 0 时才会自动删除。如果想删除需要手动 Delete() 方法。

添加键值对,比如执行 Set()、Add() 等操作时,这两个常量也可以作为参数,NoExpiration 表示没有过期时间,DefaultExpiration 表示采用默认的过期时间。

结构体

主要的结构体包括下面这些:

type Item struct {  // 键值对
 Object     interface{}     // 存放 K-V 的值,可以存放任何类型的值
 Expiration int64   // 键值对的过期时间(绝对时间)
}

type Cache struct {   // 对外使用的 Cache
 *cache  // cache 实例
}

type cache struct {
 defaultExpiration time.Duration   // 默认的过期时间,添加一个键值对时如果设置默认的过期时间(即代码里的 DefaultExpiration)则会使用到该值
 items             map[string]Item   // 存放的键值对
 mu                sync.RWMutex   // 读写锁
 onEvicted         func(string, interface{})  // 删除key时的回调函数
 janitor           *janitor  // 定期清理器 定期检查过期的 Item
}

type janitor struct { // 清理器结构体
 Interval time.Duration // 清理时间间隔
 stop     chan bool     // 是否停止
}

Set()

Set()配置key/value对,并附上过期时间。有两个类似的方法Add()和replace()。

区别是,Set()不管key是否存在,都配置。Add()只能用于key不存在的情况,否则报错,replace是反的,只能用于key存在的情况,否则报错。

Get()

获取key/value对,并返回是key是否存在且未过期。GetWithExpiration()相较Get()方法多了个返回过期时间的参数。

删除

删除操作主要有两个,执行删除操作的时候都会判断是否需要执行删除回调函数。

Delete() 常规删除,不管是否过期都会删除。

DeleteExpired() 用于执行批量删除操作,只会删除已过期的键值对。

其他

  • ItemCount(),返回所有数据的条数,这里的条数包括已过期但还未被删除的数量;
  • Flush(),清空数据;
  • Items(),返回数据的未过期的数据,可以使用 NewFrom() 恢复数据;

备份恢复数据

虽然 go-cache 比较倾向于当做缓存数据来使用,但还是提供了备份数据和恢复数据的操作,数据使用 gob 序列化。

以上就是go-cache的基本使用场景示例解析的详细内容,更多关于go-cache使用场景示例的资料请关注我们其它相关文章!

(0)

相关推荐

  • django中使用memcached示例详解

    目录 什么是memcached: 安装和启动memcached: windows linux(ubuntu) 启动memcached: telnet操作memcached: 添加数据: 获取数据: 删除数据: 通过python操作memcached: memcached的安全性: 在Django中使用memcached: 什么是memcached: memcached之前是danga的一个项目,最早是为LiveJournal服务的,当初设计师为了加速LiveJournal访问速度而开发的,后来被

  • GoFrame gcache 缓存控制 淘汰策略

    目录 打印结果 缓存控制 打印结果 场景分析 代码示例 打印结果 GetOrSetFunc的使用 基本概念 gcache模块默认提供的是一个高速的内存缓存,操作效率非常高效,CPU性能损耗在ns纳秒级别.使用简单易上手,非常适合单机应用使用. 基本使用 我们可以通过gcache.New()创建一个缓存对象 也可以直接使用gcache包方法,使用方式都是一样的. 下面代码段介绍了gcache的基本使用: package main import ( "fmt" "github.c

  • Mango Cache缓存管理库TinyLFU源码解析

    目录 介绍 整体架构 初始化流程 读流程 写流程 事件处理机制 主流程 write 清理工作 缓存管理 什么是LRU? 什么是SLRU? 什么是TinyLFU? mango Cache中的TinyLFU counter counter的初始化 counter的使用 lruCache slruCache filter TinyLFU的初始化 TinyLFU写入 TinyLFU访问 增加entry的访问次数 估计entry访问次数 总结 介绍 据官方所述,mango Cache是对Guava Cac

  • Go 语言进阶freecache源码学习教程

    目录 00. 什么是 freecache? 01. 简单用法 02. 功能概览 03. 如何做到 0 GC? 04. 数据结构 05. 动态索引 06. 缓存失效 00. 什么是 freecache? freecache 是一个用 go 语言实现的本地缓存系统(类似于 lru). 相关的 github 地址:https://github.com/coocood/freecache 它有几个特性值得注意: 通过优秀的内存管理方案,实现了 go 语言的零 gc 是线程安全的,同时支持一定程度的并发,

  • golang cache带索引超时缓存库实战示例

    目录 正文 定义泛型函数 Filter 函数 Map 函数 First 函数 带超时的cache cache 结构 集合操作 set 结构 带索引的cache index 结构 正文 cache 是一个带索引带超时的缓存库 目的在于优化代码结构,提供了若干实践. https://github.com/weapons97/cache example 定义泛型函数 1.18 已经发布一段实践了.通过泛型函数.我们可以减少循环的使用,优化代码结构.下面分享几个泛型函数和代码上的实践. Filter 函

  • go-cache的基本使用场景示例解析

    目录 什么是 go-cache 使用 导入 快速开始 常量与结构体 常量 结构体 Set() Get() 删除 其他 备份恢复数据 什么是 go-cache go-cache 是一个轻量级的基于内存的 K-V 储存组件,内部实现了一个线程安全的 map[string]interface{},适用于单机应用.具备如下功能: 线程安全,多 goroutine 并发安全访问: 每个 item 可以设置过期时间(或无过期时间): 自动定期清理过期的 item: 可以自定义清理回调函数: 这里的 item

  • Python编程super应用场景及示例解析

    目录 一.什么是super 三.super的常用使用场景 一.什么是super 1.super也是一个类,是的.他不是一个方法也不是一个内置的关键字. class A: pass print(type(super(A))) 输出结果 <class 'super'> 直接通过查看super的源码也可以看出它是一个类 另外,网上很多文章讲解super就是用来调用父类方法的,这也是一个错误的观点! 假如我们有下面这样一个例子: class A: def __init__(self): print(&

  • Python实现C#代码生成器应用服务于Unity示例解析

    目录 开发目标:实现小红帽所挂脚本的自动生成 下图为生成的最终目标 主程序具体python代码如下: 所设置的TMPL文件如下: 自动生成的c#代码展示如下: 开发目标:实现小红帽所挂脚本的自动生成 下图为生成的最终目标 本项目是从json中读取角色场景等信息,因此为了更好地判断所用属性是否需要,设置为bool类型,False表示在c#代码中注释掉该类属性,True代表使用该属性(属性暂时设置为) Timer = True # 计时器 speed = False # 速度 IsTrigger =

  • SpringBoot开发技巧之使用AOP记录日志示例解析

    目录 为什么要用AOP? 常用的工作场景 必须知道的概念 AOP 的相关术语 Spring 中使用注解创建切面 实战应用-利用AOP记录日志 定义日志信息封装 统一日志处理切面 为什么要用AOP? 答案是解耦! Aspect Oriented Programming 面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流. AOP 主要是利用代理模式的技术来实现的.具体的代理实现可以参考这篇

  • springboot 整合canal实现示例解析

    目录 前言 环境准备 一.快速搭建canal服务 搭建步骤 1.服务器使用docker快速安装一个mysql并开启binlog日志 2.上传canal安装包并解压 3.进入到第二步解压后的文件目录,并修改配置文件 4.启动canal服务 二.与springboot整合 1.Java中使用canal 2.编写一个demo 3.与springboot整合 4.application.yml 配置文件 5.核心工具类 6.提供一个配置类,在程序启动后监听数据变化 7.启动类 前言 在Mysql到Ela

  • springMvc异步的DeferredResult long polling应用示例解析

    目录 1.了解servlet以及springmvc中的异步 2.简述polling和longpolling的区别 3.因为DeferredResult,所以longpolling 4.简单的测试用例 1.定义异步接口 2.定义接口访问实例,使用fegin 3.测试用例 1.了解servlet以及spring mvc中的异步 Spring MVC 3.2开始引入了基于Servlet 3的异步请求处理.相比以前,控制器方法已经不一定需要返回一个值,而是可以返回一个java.util.concurre

  • 新浪开源轻量级分布式RPC框架motan简单示例解析

    目录 前言 概述 功能 简单调用示例 在pom中添加依赖 为调用方和服务方创建公共接口 编写业务接口逻辑.创建并启动RPCServer 创建并执行RPCClient 集群调用示例 使用CONSUL作为注册中心 Motan-Consul配置 使用ZOOKEEPER作为注册中心 Motan-ZooKeeper配置 前言 好消息,支撑微博千亿调用的轻量级 RPC 框架 Motan 在2016年5月份正式开源了,业界现在除了Dubbo 和 DubboX典型的分布式RPC服务治理型框架外,又多了一个优秀的

  • spring retry方法调用失败重试机制示例解析

    目录 前言 1.导入依赖 2.注解的使用 3.开启重试 补充,手动声明式重试: 前言 很多场景会用到重试的机制,比如:rpc服务调用失败重试,文件上传oss失败重试,http接口调用失败重试,支付回调失败重试等等,一切因为网络,非逻辑性错误等不确定因素引起的失败都可以加上重试的机制,来增强系统的健壮性,博主也处理过文件上传到第三方oss服务失败增加重试的事例,在这之前不知道spring有个spring-retry项目,所以采用的是限制次数的递归调用的方式来解决的. 现在我们来看看spring b

  • 使用JavaScript和MQTT开发物联网应用示例解析

    如果说Java和C#哪个是最好的开发语言,无疑会挑起程序员之间的相互怒怼,那如果说JavaScript是动态性最好的语言,相信大家都不会有太大的争议.随着越来越多的硬件平台和开发板开始支持JavaScript,JavaScript在硬件端以及物联网领域有了新的机会. IoT应用开发的数据链路 图1是一个智能家居物联平台的数据链路. 图1 智能家居物联平台的数据链路 一般来说,可以把IoT应用分为如图所示的四层. client层:指的是IoT设备,可以是冰箱.空调,也可以是一些温湿度传感器. ga

  • JS前端中的设计模式和使用场景示例详解

    目录 引言 策略模式 1.绩效考核 2.表单验证 策略模式的优缺点: 代理模式 1.图片懒加载: 2.缓存代理 总结 引言 相信大家在日常学习和工作中都多多少少听说/了解/使用过 设计模式,我们都知道,使用恰当的设计模式可以优化我们的代码,那你是否知道对于前端开发哪些 设计模式 是日常工作经常用到或者必须掌握的呢?本文我将带大家一起学习下前端常见的设计模式以及它们的 使用场景!!! 本文主讲: 策略模式 代理模式 适合人群: 前端人员 设计模式小白/想知道如何在项目中使用设计模式 策略模式 策略

随机推荐