什么是缓存击穿?原理及实现是什么
Admin 2022-08-13 群英技术资讯 1069 次浏览
今天这篇给大家分享的知识是“什么是缓存击穿?原理及实现是什么”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“什么是缓存击穿?原理及实现是什么”文章能帮助大家解决问题。一、什么是缓存击穿
当一个key是热点key时,一般会做缓存来抗大量并发,但当缓存失效的一瞬间,这些大量的并发请求会击穿缓存,直接请求数据库
为了避免缓存击穿,一种解决方法可以设置缓存永不过期,另一种可以使用golang的包 singleflight golang.org/x/sync/singleflight
二、原理
多个并发请求对一个失效key进行数据获取时,只会有其中一个去直接获取数据,其它请求会阻塞等待第一个请求返回给它们结果
三、实现
package singleflight
import (
"sync"
)
var WaitCount int
var DirectCount int
type Caller struct {
val interface{}
err error
wg sync.WaitGroup
}
type Group struct {
mu sync.RWMutex
m map[string]*Caller
}
func (g *Group) Do(key string, fn func() (interface{}, error)) (interface{}, error) {
g.mu.Lock()
if g.m == nil {
g.m = make(map[string]*Caller)
}
c, ok := g.m[key]
if ok {
//阻塞等待其它已经执行此操作的返回结果
g.mu.Unlock()
c.wg.Wait()
WaitCount++
return c.val, c.err
}
//直接请求获取数据
c = &Caller{}
g.m[key] = c
c.wg.Add(1)
g.mu.Unlock()
c.val, c.err = fn()
c.wg.Done()
g.mu.Lock()
delete(g.m, key)
g.mu.Unlock()
DirectCount++
return c.val, c.err
}
测试:
func TestGroup_Do(t *testing.T) {
sg := &Group{}
wg := sync.WaitGroup{}
for i := 0; i < 10000; i++ {
fn := func() (interface{}, error) {
return i, nil
}
wg.Add(1)
go func() {
defer wg.Done()
got, err := sg.Do("test-key", fn)
_, _ = got, err
//t.Log("got:", i)
}()
}
wg.Wait()
fmt.Println("waitCount:", WaitCount)
fmt.Println("DirectCount:", DirectCount)
}
输出:
waitCount: 8323
DirectCount: 1401
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
今天小编就为大家分享一篇关于PHP chunk_split()函数讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
在thinkphp中,模型指的是企业数据和业务规则,在实际项目开发中主要实现与数据库进行操作;模型类的命名需要除去表前缀的数据库名称,采用驼峰法命名,并且首字母使用大写,模型类完成了基本的 CURD、ActiveRecord模式、连贯操作和统计查询等。
在本文中,我们将看看什么是数据库事务,为什么它们很重要,以及如何在 Laravel 开始使用它们。我们还将研究一个常见的“问题”,涉及队列和数据库事务。
这篇文章主要为大家详细介绍了如何利用PHP+Laravel+RabbitMQ来实现异步延迟消息队列,文中的实现过程讲解详细,快跟随小编一起学习一下吧
文本主要给大家分享的是关于php依赖注入容器的内容,对于新手来说依赖注入容器可能比较难理解,文本有对依赖注入容器理解以及具体代码,有这方面学习需要的朋友可以参考参考。下面我们一起来了解一下。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008