golang高性能通用线程安全零依赖缓存插件库icache的使用

golang高性能通用线程安全零依赖缓存插件库icache的使用

icache是一个无依赖、支持泛型的高性能Go缓存库,具有高并发访问性能。icache不需要序列化,因此基准测试报告显示的性能就是实际使用时的性能,不需要编组和解组数据,不会浪费宝贵的资源。

特性

  • 线程安全:icache将数据存储在多个分片中,并为每个分片使用单独的互斥锁
  • 泛型支持:使用泛型使其类型安全
  • 标签支持:支持为条目添加标签,可以同时删除具有相同标签的多个条目
  • 指针友好:直接存储数据,可以存储任何对象,包括指针
  • TTL:TTL可以从1秒到无限大任意设置

安装

icache v2需要Go v1.8.0及以上版本。

go get github.com/mdaliyan/icache/v2

Go < 1.18的旧版本

icache v1兼容Go < 1.18,同样不需要序列化。它使用反射来确保数据类型。

使用示例

package main

import (
	"fmt"
	"time"
	
	"github.com/mdaliyan/icache/v2"
)

// 定义用户结构体
type user struct {
	ID   string
	Name string
	Age  int
}

func main() {
	// 创建一个新的缓存池:
	// - 用于存储用户结构体
	// - 设置过期时间为1小时
	pot := icache.NewPot[user](
		icache.WithTTL(time.Hour),
	)

	// 创建用户实例
	user := user{
		ID:   "foo",
		Name: "John Doe",
		Age:  30,
	}

	// 将用户设置到"foo"键
	pot.Set("foo", user)

	// 从"foo"键获取之前设置的用户
	user1, err := pot.Get("foo")
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Printf("User: %+v\n", user1)
	}

	// 可以为条目添加标签
	pot.Set("foo", user, "tag1", "tag2")
	pot.Set("faa", user, "tag1")
	pot.Set("fom", user, "tag3")

	// 可以一次性删除多个具有相同标签的条目
	pot.DropTags("tag1") // 这会删除"foo"和"faa"条目
}

失效策略

  • 按键删除:通过键删除单个条目
  • 按标签删除:通过标签删除多个条目
  • TTL过期:使用WithTTL()选项设置过期时间

基准测试

goos: darwin
goarch: amd64
pkg: github.com/mdaliyan/icache/v2
cpu: Intel(R) Core(TM) i7-8557U CPU @ 1.70GHz
BenchmarkICache
BenchmarkICache-8             	9570999	    118.1 ns/op	   0 B/op	  0 allocs/op
BenchmarkICacheConcurrent
BenchmarkICacheConcurrent-8   	6117471	    191.4 ns/op	   0 B/op	  0 allocs/op

未来计划

  • 如果需要,可以添加不同的失效策略
  • 可能会添加远程同步功能

更多关于golang高性能通用线程安全零依赖缓存插件库icache的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能通用线程安全零依赖缓存插件库icache的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang高性能通用线程安全缓存库icache使用指南

icache是一个轻量级、高性能、线程安全的Go语言缓存库,具有零外部依赖的特点。下面我将详细介绍icache的使用方法。

基本特性

  1. 线程安全:内置并发控制机制
  2. 高性能:基于高效数据结构实现
  3. 零依赖:不依赖任何第三方库
  4. 多种淘汰策略:支持LRU、LFU等
  5. 简单API:易于集成和使用

安装

go get github.com/icache/icache

基本使用示例

1. 创建缓存实例

package main

import (
	"fmt"
	"github.com/icache/icache"
	"time"
)

func main() {
	// 创建一个默认配置的缓存实例
	cache := icache.New()
	
	// 带配置的创建方式
	cacheWithConfig := icache.New(
		icache.WithMaxSize(1000),      // 最大容量
		icache.WithTTL(5*time.Minute), // 默认过期时间
		icache.WithEvictionPolicy(icache.LRU), // 淘汰策略
	)
	
	_ = cacheWithConfig // 避免未使用警告
}

2. 基本CRUD操作

func basicOperations() {
	cache := icache.New()
	
	// 设置值
	cache.Set("key1", "value1")
	cache.SetWithTTL("key2", "value2", 10*time.Minute)
	
	// 获取值
	if val, ok := cache.Get("key1"); ok {
		fmt.Println("key1:", val)
	}
	
	// 删除值
	cache.Delete("key1")
	
	// 检查是否存在
	if cache.Has("key1") {
		fmt.Println("key1 exists")
	} else {
		fmt.Println("key1 does not exist")
	}
	
	// 清空缓存
	cache.Clear()
}

3. 高级功能

func advancedFeatures() {
	cache := icache.New(
		icache.WithMaxSize(100),
		icache.WithTTL(30*time.Minute),
	)
	
	// 获取或计算模式
	value, err := cache.GetOrCompute("expensive_key", func() (interface{}, error) {
		// 这里执行昂贵的计算或IO操作
		return "computed_value", nil
	})
	
	if err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println("Value:", value)
	}
	
	// 批量操作
	items := map[string]interface{}{
		"batch_key1": "value1",
		"batch_key2": "value2",
	}
	cache.SetAll(items)
	
	// 获取所有键
	keys := cache.Keys()
	fmt.Println("All keys:", keys)
	
	// 统计信息
	stats := cache.Stats()
	fmt.Printf("Cache stats: %+v\n", stats)
}

4. 事件监听

func eventListeners() {
	cache := icache.New(
		icache.WithEvictionListener(func(key string, value interface{}, reason icache.EvictionReason) {
			fmt.Printf("Key %s evicted. Reason: %v\n", key, reason)
		}),
		icache.WithExpirationListener(func(key string, value interface{}) {
			fmt.Printf("Key %s expired\n", key)
		}),
	)
	
	_ = cache // 避免未使用警告
}

性能优化建议

  1. 合理设置缓存大小:根据应用内存情况设置最大容量
  2. 选择合适的淘汰策略
    • LRU:最近最少使用(默认)
    • LFU:最不经常使用
    • FIFO:先进先出
  3. 批量操作:尽可能使用SetAll等批量方法
  4. 合理设置TTL:根据数据更新频率设置过期时间

实际应用示例

package main

import (
	"fmt"
	"github.com/icache/icache"
	"net/http"
	"time"
)

var cache = icache.New(
	icache.WithMaxSize(1000),
	icache.WithTTL(10*time.Minute),
)

func expensiveOperation(param string) (string, error) {
	// 模拟耗时操作
	time.Sleep(500 * time.Millisecond)
	return "result_for_" + param, nil
}

func cachedHandler(w http.ResponseWriter, r *http.Request) {
	param := r.URL.Query().Get("param")
	if param == "" {
		http.Error(w, "param is required", http.StatusBadRequest)
		return
	}
	
	// 尝试从缓存获取
	if val, ok := cache.Get(param); ok {
		fmt.Fprintf(w, "Cached result: %s", val)
		return
	}
	
	// 缓存未命中,执行计算
	result, err := expensiveOperation(param)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	
	// 存入缓存
	cache.Set(param, result)
	
	fmt.Fprintf(w, "Fresh result: %s", result)
}

func main() {
	http.HandleFunc("/", cachedHandler)
	fmt.Println("Server started on :8080")
	http.ListenAndServe(":8080", nil)
}

总结

icache是一个功能强大且易于使用的Go语言缓存库,特别适合需要高性能缓存解决方案的应用场景。它的零依赖特性使得集成非常简单,而丰富的配置选项和API可以满足各种复杂需求。

通过合理配置和使用icache,可以显著提升应用程序的性能,特别是在处理重复计算或频繁访问的数据时。

回到顶部