美文网首页
使用读写锁避免缓存穿透问题

使用读写锁避免缓存穿透问题

作者: 风亡小窝 | 来源:发表于2019-06-27 21:14 被阅读0次

使用读写锁避免缓存穿透问题

var rwMu = sync.RWMutex{}
func GetForumById(id string) (result interface{}) {
    rwMu.RLock()
    result, err := cache.Get(id)
    rwMu.RUnlock()

    if err != nil {
        log.Println("cache expired")
        rwMu.Lock()
        result, err = cache.Get(keyWord)
        if err == nil {
            log.Println("already be cached, return directly")
            rwMu.Unlock()
            return
        }
        
        log.Println("get data from mongodb")
        data = mongodb.GetForumById(id))
        cache.Set(id, data, 1)
        rwMu.Unlock()
        log.Println("data cached")
        result, _ = cache.Get(id))
        return
    }
    return
}

缓存穿透应该指的是,当多个请求同时请求同一个资源时,该资源未命中缓存,需要从数据库中获取。如果不使用锁,就会导致同时有多个数据库请求获取同一个资源,而这些请求是重复的,对数据库的重复请求是不需要的,且会对数据库造成极大的压力。图1

在使用锁之后,可以阻止对数据库的重复请求,减小数据库的压力。图2

用图来表示

黑色长条:web服务器
红色长条:缓存
橘色椭圆:数据库

图1. 缓存穿透,数据库压力增加

缓存穿透

图2. 使用锁之后,数据库的压力减小

dsBuffer.bmp.png

相关文章

  • 使用读写锁避免缓存穿透问题

    使用读写锁避免缓存穿透问题 缓存穿透应该指的是,当多个请求同时请求同一个资源时,该资源未命中缓存,需要从数据库中获...

  • 你需要知道的缓存击穿/穿透/雪崩

    缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿、缓存穿透以及缓存雪崩,需要了解它们产生的...

  • 你需要知道的缓存击穿/穿透/雪崩

    缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿、缓存穿透以及缓存雪崩,需要了解它们产生的...

  • 史上最全141道大数据面试题:Redis+Linux+kafka

    Redis面试专题及答案 什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免? 使用过 Redis 做异步队列么,...

  • 技术好文集合

    缓存热点key 大value问题,解决方案 golang sync.Map 如何理解互斥锁、条件锁、读写锁以及自旋锁?

  • Redis(三):常见异常及解决方案

    缓存使用过程中,我们经常遇到的问题有一下四个: 缓存穿透 缓存雪崩 缓存预热 缓存降级 1、缓存穿透 一般访问缓存...

  • 赫赫有名的双刃剑:缓存(下)

    缓存使用的问题 缓存穿透 (没起作用) 缓存穿透,指的是在某些情况下,大量对于同一个数据的访问,经过了缓存屏障,但...

  • Redis总结

    一、数据类型 二、使用场景 二、redis缓存使用总结 三、redis缓存常见问题 四、布隆过滤器的方式解决缓存穿透问题

  • Redis 缓存问题

    Redis 缓存问题 缓存穿透 缓存穿透问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的...

  • 缓存的注意事项

    [TOC] 参考 缓存穿透,缓存击穿,缓存雪崩解决方案分析 1. 缓存穿透 1.1. 问题描述 缓存穿透是指查询的...

网友评论

      本文标题:使用读写锁避免缓存穿透问题

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