美文网首页
基于读写锁实现一个内存缓存器

基于读写锁实现一个内存缓存器

作者: 杜子龙 | 来源:发表于2019-01-07 19:18 被阅读0次

上一个用java实现的版本,这里用go也实现了一遍:

type CacheDemo struct {
    CacheMap    map[string]*model.Config
    ConfigModel model.ConfigModel `inject:""`
    syncLock    *sync.RWMutex
}

func (c *CacheDemo) ReadConfig() (err error) {
    configList, err := c.ConfigModel.SelectAll()
    if err != nil {
        return
    }
    cacheMap := make(map[string]*model.Config)
    for _, config := range configList {
        key := config.Key
        cacheMap[key] = config
    }
    c.syncLock.Lock()
    defer c.syncLock.Unlock()
    c.CacheMap = cacheMap
    return
}

// 这里可以优化一下,
// 首先开启读锁,从缓存中取数据,
// 如果缓存中没取到数据,释放读锁,上写锁,然后查数据库
// 如果数据库中也没取到数据,返回空,否则写进缓存
// 最后释放写锁,再上读锁,最后再释放读锁(至于这里为啥要多此一举,自己想想!)
func (c *CacheDemo) GetConfig(key string) *model.Config {
    c.syncLock.RLock()
    defer c.syncLock.RUnlock()
    return c.CacheMap[key]
}

func (c *CacheDemo) Init() {
    c.CacheMap = make(map[string]*model.Config)
    c.syncLock = &sync.RWMutex{}
}

func (c *CacheDemo) Start() {
    err := c.ReadConfig()
    if err != nil {
        log.Errorf("load Config have err = %s", err.Error())
    }
    // 启动一个协程定时拉取数据库所有信息存进缓存
    go func() {
        tick := time.Tick(5 * time.Minute)
        for {
            select {
            case <-tick:
                err := c.ReadConfig()
                if err != nil {
                    log.Errorf("load Config have err = %s", err.Error())
                }
            }
        }
    }()
}

相关文章

  • 基于读写锁实现一个内存缓存器

    上一个用java实现的版本,这里用go也实现了一遍:

  • 基于读写锁实现一个内存缓存器

    首先实现定时任务读取数据库信息到内存: 接下来就是从内存中取数据: 参考博客:1.https://www.jian...

  • YYCache 源码流程

    存储技术 基于文件读写 基于 mmap 文件内存映射 基于数据库 基于文件系统 SDWebImage 等缓存:一个...

  • 分布式锁实现

    基于数据库实现分布式锁基于缓存(redis,memcached)实现分布式锁基于Zookeeper实现分布式锁 s...

  • 基于redis的分布式锁

    分布式锁实现方案 基于数据库实现分布式锁 基于缓存(redis,memcached,tair)实现分布式锁 基于Z...

  • 分布式锁

    几种实现方式 基于数据库实现分布式锁 基于缓存(Redis,memcached,tair)实现分布式锁 基于Zoo...

  • 17.读写锁ReentrantWriteReadLock

    读写锁ReentrantWriteReadLock,基于AQS的锁机制,实现ReadWriteLock接口。内部有...

  • 分布式锁的实现方案

    一,分布式锁的实现方案 1,基于数据库实现分布式锁 2,基于缓存实现数据库锁(redis) 3,基于zookeep...

  • redis学习笔记(八) 缓存设计

    1. 缓存优缺点 缓存常用的结构如下: 1.1. 优点 加速读写:由于数据库读写速度慢,而基于内存的读写速度快,所...

  • 分布式锁的实现-Redisson

    常见3种分布式的实现比较 基于数据库实现分布式锁 基于缓存实现分布式锁(redis,mc) 基于Zookeeper...

网友评论

      本文标题:基于读写锁实现一个内存缓存器

      本文链接:https://www.haomeiwen.com/subject/qtjprqtx.html