工具库系列之(Golang实现的能自动回收过期值的内存缓存库)
Golang实现的能自动回收过期值的内存缓存库
English README
该库使用了红黑树和最小堆数据结构。利用最小堆堆顶是最老的值,从而快速清洗过期值。可以认为是一个有过期时间的 K-V
本地内存数据库。
原理很简单:
- 一个
treeMap
用来保存K-V
,一个最小堆的完全树用来清洗过期key
。 - 官方的
map
不会缩容,treemap
的话不会占用多余空间。 - 开了个定时器惰性删除过期key,由于定时器每秒最多清除30个过期,可能不够实时,所以当客户端主动拿值时会进行实时删除key,参考的redis。
文章图片
【工具库系列之(Golang实现的能自动回收过期值的内存缓存库)】数据保存在内存中,又快又好,这个内存缓存库非常高效,不需要预分配空间。
使用 直接执行:
go get -v github.com/hunterhug/gocache
例子 参考以下方法:
type Cache interface {
Set(key string, value []byte, expireTime time.Duration)
SetInterface(key string, value interface{}, expireTime time.Duration)
SetByExpireUnixNanosecondDateTime(key string, value []byte, expireUnixNanosecondDateTime int64)
SetInterfaceByExpireUnixNanosecondDateTime(key string, value interface{}, expireUnixNanosecondDateTime int64)
Delete(key string)
Get(key string) (value []byte, expireUnixNanosecondDateTime int64, exist bool)
GetInterface(key string) (value interface{}, expireUnixNanosecondDateTime int64, exist bool)
GetOldestKey() (key string, expireUnixNanosecondDateTime int64, exist bool)
Size() int
Index(index int) (value []byte, expireUnixNanosecondDateTime int64, exist bool)
IndexInterface(index int) (value interface{}, expireUnixNanosecondDateTime int64, exist bool)
KeyList() []string
ShutDown()
}
设置缓存时,可以选择使用
time.Duration
来设置过期时间,内部转化之后的时间是纳秒 expireUnixNanosecondDateTime
。例子:
package mainimport (
"fmt"
"github.com/hunterhug/gocache"
"time"
)func main() {
cache := gocache.New()
defer cache.ShutDown()cache.Set("a", []byte("a hi"), 2*time.Second)
cache.Set("b", []byte("b hi"), 2*time.Second)
cache.SetInterface("c", []byte("c hi"), 2*time.Second)fmt.Println(cache.Size())
fmt.Println(cache.GetOldestKey())
fmt.Println(cache.KeyList())
fmt.Println(cache.Get("a"))
fmt.Println(cache.GetInterface("c"))time.Sleep(2 * time.Second)
fmt.Println(cache.Get("a"))
}
License
Copyright [2019-2021] [github.com/hunterhug]Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 太平之莲
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 【欢喜是你·三宅系列①】⑶
- 孩子不是实现父母欲望的工具——林哈夫
- thinkphp|thinkphp 3.2 如何调用第三方类库
- 我正在参加安特思库共读一本书干法。
- 你不可不知的真相系列之科学
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 最有效的时间管理工具(赢效率手册和总结笔记)