golang 开发 Redis与Memory统一接口方案

Cache Package

一个功能丰富、高性能的Go语言缓存库,支持内存缓存和Redis缓存,提供统一的接口和丰富的功能,适用于各种缓存场景。

功能特性

核心功能

  • 统一接口:内存缓存和Redis缓存共享相同的接口
  • 多种数据类型支持:通过Set/Get方法直接支持string、int、float、bool、struct等
  • 结构体序列化:自动JSON序列化/反序列化结构体
  • 过期时间管理:支持设置缓存过期时间
  • 批量操作:高效的批量设置、获取和删除操作
  • 缓存统计:完整的统计信息(命中率、操作次数等)

内存缓存特性

  • 并发安全:使用读写锁确保线程安全
  • 定时清理:5分钟自动清理过期缓存
  • 实时过期检查:获取时检查过期状态

Redis缓存特性

  • 类型转换:自动转换基本数据类型
  • Pipeline支持:批量操作使用Pipeline提高效率
  • 原生命令:使用Redis原生批量命令(MSET/MGET/DEL)

安装

bash 复制代码
go get -u github.com/liu-dc/cache

快速开始

内存缓存示例

go 复制代码
import (
    "fmt"
    "time"
    "github.com/liu-dc/cache"
)

func main() {
    // 创建内存缓存实例
    memCache := cache.NewMemory()
    defer memCache.Uninstall()

    // 设置缓存
    memCache.Set("key", "value", 5*time.Minute)

    // 获取缓存
    if val, ok := memCache.GetString("key"); ok {
        fmt.Println("String value:", val)
    }

    // 结构体示例
    type User struct {
        ID   int    `json:"id"`
        Name string `json:"name"`
    }

    // 设置结构体
    user := User{ID: 1, Name: "John"}
    memCache.SetStruct("user:1", user, 5*time.Minute)

    // 获取结构体
    var retrievedUser User
    if memCache.GetStruct("user:1", &retrievedUser) {
        fmt.Printf("Retrieved user: %+v\n", retrievedUser)
    }

    // 批量操作
    values := map[string]interface{}{
        "key1": "value1",
        "key2": "value2",
    }
    memCache.SetMulti(values, 5*time.Minute)

    keys := []string{"key1", "key2"}
    results := memCache.GetMulti(keys)
    fmt.Println("Batch results:", results)

    // 统计信息
    stats := memCache.GetStats()
    fmt.Printf("Hit rate: %.2f%%\n", stats.HitRate*100)
}

Redis缓存示例

go 复制代码
import (
    "fmt"
    "time"
    "github.com/liu-dc/cache"
)

func main() {
    // 创建Redis缓存实例
    redisCache := cache.NewRedis("localhost:6379", "", 0)
    defer redisCache.Uninstall()

    // 使用方法与内存缓存相同
    redisCache.Set("key", "value", 5*time.Minute)
    
    if val, ok := redisCache.GetString("key"); ok {
        fmt.Println("Redis value:", val)
    }

    // 结构体操作
    type Product struct {
        ID    int     `json:"id"`
        Name  string  `json:"name"`
        Price float64 `json:"price"`
    }

    product := Product{ID: 100, Name: "Product A", Price: 199.99}
    redisCache.SetStruct("product:100", product, 5*time.Minute)

    var retrievedProduct Product
    if redisCache.GetStruct("product:100", &retrievedProduct) {
        fmt.Printf("Retrieved product: %+v\n", retrievedProduct)
    }
}

API文档

ICache接口

基本操作
go 复制代码
// 获取缓存值
Get(key string) (interface{}, bool)
// 获取字符串类型
GetString(key string) (string, bool)
// 获取整数类型
GetInt(key string) (int, bool)
// 获取浮点数类型
GetFloat(key string) (float64, bool)
// 获取布尔类型
GetBool(key string) (bool, bool)
// 获取结构体
GetStruct(key string, out interface{}) bool

// 设置缓存值(支持多种数据类型)
Set(key string, value interface{}, expiration time.Duration)
// 设置结构体
SetStruct(key string, value interface{}, expiration time.Duration) error

// 删除缓存
Del(key string)
// 检查缓存是否存在
Exists(key string) bool
// 获取匹配前缀的key
PrefixKey(key string) []string
// 设置过期时间
Expire(key string, expiration time.Duration)
// 卸载缓存(清理资源)
Uninstall()
批量操作
go 复制代码
// 批量设置缓存
SetMulti(values map[string]interface{}, expiration time.Duration) error
// 批量获取缓存
GetMulti(keys []string) map[string]interface{}
// 批量删除缓存
DelMulti(keys []string)
统计功能
go 复制代码
// 获取统计信息
GetStats() CacheStats
// 重置统计信息
ResetStats()

统计信息结构

go 复制代码
type CacheStats struct {
    Hits            int64   // 缓存命中次数
    Misses          int64   // 缓存未命中次数
    SetCount        int64   // 设置缓存次数
    DelCount        int64   // 删除缓存次数
    TotalOperations int64   // 总操作次数
    ItemCount       int64   // 当前缓存项数量
    HitRate         float64 // 命中率
}

缓存统计

缓存库提供了完整的统计功能,可以监控缓存的使用情况:

go 复制代码
// 获取统计信息
stats := memCache.GetStats()

// 输出统计信息
fmt.Printf("命中次数: %d\n", stats.Hits)
fmt.Printf("未命中次数: %d\n", stats.Misses)
fmt.Printf("设置缓存次数: %d\n", stats.SetCount)
fmt.Printf("删除缓存次数: %d\n", stats.DelCount)
fmt.Printf("总操作次数: %d\n", stats.TotalOperations)
fmt.Printf("命中率: %.2f%%\n", stats.HitRate*100)
fmt.Printf("当前缓存项: %d\n", stats.ItemCount)

// 重置统计信息
memCache.ResetStats()

性能优化

  1. 内存缓存并发性能

    • 使用读写锁(RWMutex)区分读操作和写操作
    • 读操作并发执行,写操作互斥
  2. 过期清理优化

    • 内存缓存每5分钟批量清理过期项
    • 获取时实时检查过期状态,避免返回过期数据
  3. 批量操作效率

    • 内存缓存批量操作只加一次锁
    • Redis缓存使用Pipeline和原生命令减少网络往返
  4. 类型转换优化

    • 直接操作基本数据类型,避免频繁转换
    • 结构体使用高效的JSON序列化

使用建议

  1. 选择合适的缓存类型

    • 本地数据使用内存缓存
    • 分布式环境使用Redis缓存
  2. 设置合理的过期时间

    • 根据数据更新频率设置过期时间
    • 重要数据可以使用较长过期时间或永不过期
  3. 使用批量操作

    • 频繁的缓存操作尽量使用批量API
    • 批量操作可以显著提高性能
  4. 监控统计信息

    • 定期检查缓存命中率
    • 根据统计信息调整缓存策略

测试

bash 复制代码
go test -v .
相关推荐
黑客思维者4 小时前
XGW-9000 网关 DDR4/LPDDR4 内存子系统信号完整性仿真细化设计
开发语言·python·嵌入式硬件·ddr4·信号仿真
淼淼7634 小时前
Qt工具栏+图页,图元支持粘贴复制,撤销,剪切,移动,删除
开发语言·c++·windows·qt
爱吃大芒果4 小时前
Flutter 本地存储方案:SharedPreferences、SQFlite 与 Hive
开发语言·javascript·hive·hadoop·flutter·华为·harmonyos
Kelvin_Ngan4 小时前
Qt包含QtCharts/QValueAxis时编译报错
开发语言·qt
bafuka4 小时前
别再手撸热点缓存了:一个注解搞定Redis热点问题(已开源)
redis
葱卤山猪4 小时前
【Qt】心跳检测与粘包处理:打造稳定可靠的TCP Socket通信
开发语言·数据库·qt
a程序小傲4 小时前
淘宝Java面试被问:Atomic原子类的实现原理
java·开发语言·后端·面试
laocooon5238578864 小时前
C++中的安全指针(智能指针)
开发语言·c++
咸鱼加辣4 小时前
【python面试题】LRUCache
开发语言·python