version_cache 分布式缓存 version_cache

rushui • 12836 次点击    
这是一个分享于 的项目,其中的信息可能已经有所发展或是发生改变。
# version_cache version_cache是一个分布式一致性缓存解决方案。 原理:job 将数据打包成版本到redis,实例将存在redis的版本load到本地内存并计算最新版本的生效时间,使所有实例的缓存在同一时间生效来达到所有实例数据的一致。 实用场景:数据量少、非及时生效数据、高并发强一致的场景。如:配置服务,门店服务等 优点: 1. 轻松实现水平扩展,实现千万并发的服务不是梦 2. 数据强一至性,不论启动多少实例,同一时间的数据绝对是一致的(服务器时间一致情况下) 3. 使用简单,实现数据生成接口后就可以像使用缓存一样方便,轻松实现高性能服务 缺点: 1. 数据按版本生效,变更的数据会延迟生效(原则上数据量越小处理越快) 2. 不适合大数据缓存 # 架构: https://www.processon.com/view/5e4b7f2ee4b00aefb7e5d054 # 安装 ``` go get github.com/rushuinet/version_cache ``` # 用法: job 数据生成服务启动一个实例 ``` package main import ( "encoding/json" "github.com/go-redis/redis/v7" "github.com/rushuinet/version_cache" "log" "strconv" "time" ) type Info struct { Id int Key string CreateTime int64 } func main() { client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB }) pong, err := client.Ping().Result() if pong != "PONG" || err != nil { log.Fatal("redis conn error") } config := &version_cache.Option{ Redis: client, Key: "test", VersionGenerateTime: 60, CheckTime: 5, KeepVersionNum: 6, } cache := version_cache.New(config) cache.Generate(func(key string) { for i := 0; i < 5; i++ { info := &Info{ Id: i, Key: key, CreateTime: time.Now().Unix(), } data, _ := json.Marshal(info) cache.Redis.HSet(key, strconv.Itoa(i), data) time.Sleep(1 * time.Second) } }) select {} } ``` 服务中使用方式: ``` # 服务启动前加 c := version_cache.New(config) c.FirstLoad() go c.Load() # 业务中使用 c.Get(key) ```
授权协议:
开发语言:
golang 查看源码»
12836 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传