返回顶部
首页 > 资讯 > 后端开发 > GO >Golang如何使用ttl机制保存内存数据
  • 133
分享到

Golang如何使用ttl机制保存内存数据

2023-07-05 10:07:23 133人浏览 八月长安
摘要

本篇内容介绍了“golang如何使用ttl机制保存内存数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ttl(time-to-live)

本篇内容介绍了“golang如何使用ttl机制保存内存数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

ttl(time-to-live) 数据存活时间,我们这里指数据在内存中保存一段时间,超过期限则不能被读取到,与Redis的ttl机制类似。

获取当前时间

涉及时间计算,这里首先介绍如何获取当前时间,以及时间的精度,这里为了简化,精度到秒级。

使用time.Now可以获取当前时间,time.Unix 或 time.UnixNano可以获得时间戳。

now := time.Now()      // current local timesec := now.Unix()      // number of seconds since January 1, 1970 UTCnsec := now.UnixNano() // number of nanoseconds since January 1, 1970 UTCfmt.Println(now)  // time.Timefmt.Println(sec)  // int64fmt.Println(nsec) // int64

输出结果:

2023-02-19 16:52:51.5894329 +0800 CST m=+0.004286801
1676796771
1676796771589432900

数据结构

首先定义数据结构,数据结构及存储数据容器的结构:

type Data struct {Key       stringValue     interface{}Timestamp int64}type Heap struct {dataMx *sync.RWMutexdata   map[string]Data}

Data 包括key和value以及ttl时间(单位秒),Heap容器包括map类型data以及RWMutex读写,读写锁是支持并发操作。

下面定义Heap结构一些方法。

Heap操作

主要方法包括New,Set,Del,Get三个方法。

func New() *Heap {return &Heap{dataMx: &sync.RWMutex{},data:   map[string]Data{},}}func (h *Heap) Set(key string, value interface{}, ttl int64) {if ttl == 0 {return}data := Data{Key:       key,Value:     value,Timestamp: time.Now().Unix(),}if ttl > 0 {data.Timestamp += ttl} else if ttl < 0 {data.Timestamp = -1}h.dataMx.Lock()h.data[key] = datah.dataMx.Unlock()}func (h *Heap) Get(key string) (val interface{}, ok bool) {var data Datah.dataMx.RLock()data, ok = h.data[key]h.dataMx.RUnlock()if ok {if data.Timestamp != -1 && data.Timestamp <= time.Now().Unix() {h.Del(key)ok = false} else {val = data.Value}}return}func (h *Heap) Del(key string) {h.dataMx.RLock()_, ok := h.data[key]h.dataMx.RUnlock()if !ok {return}h.dataMx.Lock()delete(h.data, key)h.dataMx.Unlock()}

New方法无需多解释,我们直接看Set方法。

Set方法实现逻辑:如果ttl为0则直接返回,反之先初始化Data数据,这里初始化当前时间为Data的时间戳;接着判断ttl,如果大于零则Data的时间戳加上ttl,反之为-1;下面开始通过读写锁存储Heap的data。

Del方法,首先通过读锁读取key对应数据,如果失败直接返回(可能已经过期,其他协程已经获取过),反之直接删除数据。

Get方法,读取逻辑与Del一样,如果正确读取,则判断时间戳,不等于-1且小于当前时间则表明已过期,调用Del方法进行删除,返回nil和false;反之返回value及true。

测试ttl容器Heap

首先定义heap,然后调用Set方法,增加数据key,value,ttl为2秒:

func main() {keyTag := "key"heap := New()defer func() {heap.Del(keyTag)}()heap.Set(keyTag, "value", 2)time.Sleep(1 * time.Second)val, flag := heap.Get(keyTag)fmt.Printf("%v, %v\n", val, flag)time.Sleep(1 * time.Second)val, flag = heap.Get(keyTag)fmt.Printf("%v, %v\n", val, flag)}

然后模拟等待1秒后调用Get方法,两次直接结果和预期一致:

value, true
<nil>, false

完整代码

下面给出完整代码:

package mainimport ("fmt""sync""time")type Data struct {Key       stringValue     interface{}Timestamp int64}type Heap struct {dataMx *sync.RWMutexdata   map[string]Data}func New() *Heap {return &Heap{dataMx: &sync.RWMutex{},data:   map[string]Data{},}}func (h *Heap) Set(key string, value interface{}, ttl int64) {if ttl == 0 {return}data := Data{Key:       key,Value:     value,Timestamp: time.Now().Unix(),}if ttl > 0 {data.Timestamp += ttl} else if ttl < 0 {data.Timestamp = -1}h.dataMx.Lock()h.data[key] = datah.dataMx.Unlock()}func (h *Heap) Get(key string) (val interface{}, ok bool) {var data Datah.dataMx.RLock()data, ok = h.data[key]h.dataMx.RUnlock()if ok {if data.Timestamp != -1 && data.Timestamp <= time.Now().Unix() {h.Del(key)ok = false} else {val = data.Value}}return}func (h *Heap) Del(key string) {h.dataMx.RLock()_, ok := h.data[key]h.dataMx.RUnlock()if !ok {return}h.dataMx.Lock()delete(h.data, key)h.dataMx.Unlock()}func main() {keyTag := "key"heap := New()defer func() {heap.Del(keyTag)}()heap.Set(keyTag, "value", 2)time.Sleep(1 * time.Second)val, flag := heap.Get(keyTag)fmt.Printf("%v, %v\n", val, flag)time.Sleep(1 * time.Second)val, flag = heap.Get(keyTag)fmt.Printf("%v, %v\n", val, flag)}

Golang如何使用ttl机制保存内存数据”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang如何使用ttl机制保存内存数据

本文链接: https://lsjlt.com/news/351067.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang如何使用ttl机制保存内存数据
    本篇内容介绍了“Golang如何使用ttl机制保存内存数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ttl(time-to-live) ...
    99+
    2023-07-05
  • Golang使用ttl机制保存内存数据方法详解
    目录获取当前时间数据结构Heap操作测试ttl容器Heap完整代码总结ttl(time-to-live) 数据存活时间,我们这里指数据在内存中保存一段时间,超过期限则不能被读取到,与...
    99+
    2023-03-08
    Go保存内存数据 Go ttl机制保存内存数据
  • android如何保存数据
    Android有多种方法可以保存数据,以下是一些常用的方法:1. SharedPreferences:适用于保存简单的键值对数据,如...
    99+
    2023-08-12
    android
  • FragmentStatePagerAdapter如何保存恢复下拉刷新Fragment内存数据
    这篇文章主要介绍“FragmentStatePagerAdapter如何保存恢复下拉刷新Fragment内存数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“FragmentStatePagerAd...
    99+
    2023-07-05
  • mongodb如何保存数据集
    MongoDB是一个非关系型数据库,数据以文档的形式存储。文档是一个键值对的集合,类似于JSON对象。在MongoDB中,可以使用以...
    99+
    2023-10-20
    mongodb
  • sqlserver如何保存数据库
    在SQL Server中保存数据库,可以通过以下步骤操作: 打开SQL Server Management Studio(SSM...
    99+
    2024-04-22
    sqlserver
  • Golang如何实现事务型内存数据库
    这篇文章主要讲解了“Golang如何实现事务型内存数据库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang如何实现事务型内存数据库”吧!特性MossDB是一个纯Golang编写、可嵌...
    99+
    2023-07-05
  • 如何在VirtualBox中限制虚拟机的内存使用
    在VirtualBox中限制虚拟机的内存使用可以通过以下步骤实现: 打开VirtualBox并选择要配置的虚拟机。 点击“设置”按钮,然后选择“系统”选项卡。 在“基本”选项卡下,找到“处理器”区域,然后将“内存大小”设置为所需的最大内存...
    99+
    2024-06-11
    virtualbox
  • 内存数据库如何发挥内存优势?
    与以磁盘存储为主的普通数据库相比,内存数据库的数据访问速度可以高出几个数量级,能大幅提高运算性能,更适合高并发、低延时的业务场景。 不过,当前大部分内存数据库仍然采用 SQL 模型,而 SQL 缺乏一...
    99+
    2023-09-05
    数据库 大数据 java
  • jpa如何批量保存数据
    使用JPA批量保存数据可以使用以下方法:1. 使用EntityManager的`persist()`方法:通过循环将实体对象逐个保存...
    99+
    2023-09-07
    jpa
  • pytorch中如何保存tensor数据
    在PyTorch中,可以使用torch.save()函数将Tensor数据保存到文件中。以下是保存和加载Tensor数据的示例代码:...
    99+
    2024-04-02
  • oracle数据库如何查内存使用情况
    oracle 数据库的内存使用情况查询方法有四种:使用 v$sesstat 视图查询会话逻辑读取次数;使用 v$sgastat 视图查询 sga 中每个池的使用情况;使用 awr 报告查...
    99+
    2024-04-19
    oracle
  • Spring内存缓存Caffeine如何使用
    这篇文章主要讲解了“Spring内存缓存Caffeine如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring内存缓存Caffeine如何使用”吧!项目配置依赖首先搭建一个标准的...
    99+
    2023-07-05
  • Golang函数在缓存机制中的应用
    go函数可实现高效缓存机制:1. 使用函数作为缓存键:精细化缓存粒度;2. 使用函数计算缓存值:避免重复计算;3. 实战案例:实现内存缓存,使用go函数作为键和计算函数。 利用 Go ...
    99+
    2024-05-02
    golang 缓存机制 git
  • python如何限制CPU和内存使用量
    这篇文章主要介绍了python如何限制CPU和内存使用量,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。限制「CPU」和内存使用量如果不是想优化程序对内存或 CPU 的使用率,...
    99+
    2023-06-27
  • pandas如何保存数据到excel,csv
    目录pandas 保存数据到excel,csv导入到excel中导入到csv中更细致的操作将数据保存到csv或者xlsx中的最基本操作pandas 保存数据到excel,csv pa...
    99+
    2024-04-02
  • Python如何把数据保存成csv
    在Python中,可以使用`csv`模块将数据保存为CSV文件。以下是一个保存数据为CSV文件的示例:```pythonimport...
    99+
    2023-10-12
    python
  • 如何使用php函数来优化缓存机制?
    引言:在开发网站时,为了提高性能和访问速度,缓存机制是非常重要的。PHP内置了一些函数和扩展来帮助我们实现缓存功能。本文将介绍如何使用PHP函数来优化缓存机制,并提供具体的代码示例。一、了解缓存机制在开始优化缓存机制之前,首先需要了解缓存的...
    99+
    2023-10-21
    缓存 优化 PHP函数
  • Win10使用存储空间保存数据以防止数据丢失
    我们的电脑上有时候会存放一些重要的数据,但是一旦发生磁盘损坏,就会造成数据的丢失。Win10系统中准备了一个存储空间的功能,可以帮助用户保存数据,防止数据丢失。   这个功能,可以使用多块磁盘或移动硬盘组成联合储存模式,...
    99+
    2023-06-17
    Win10 存储空间 保存数据 保存 数据 空间 存储
  • Golang 函数如何优化内存管理?
    如何优化 go 函数的内存管理?答案: 优化 go 函数的内存管理,可以显着提高应用程序性能。避免使用指针: 指针会增加内存开销,应改用值。使用局部变量: 局部变量在函数退出后释放,减少...
    99+
    2024-04-20
    golang 内存管理 内存占用 垃圾回收器 变量逃逸
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作