什么是缓存击穿?原理及实现是什么
Admin 2022-08-13 群英技术资讯 1745 次浏览
今天这篇给大家分享的知识是“什么是缓存击穿?原理及实现是什么”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“什么是缓存击穿?原理及实现是什么”文章能帮助大家解决问题。一、什么是缓存击穿
当一个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简写功能的相关文章以及知识点,有需要的朋友们可以学习下。
这篇文章主要介绍了PHP call_user_func和call_user_func_array函数的简单理解与应用,结合实例形式分析了PHP call_user_func和call_user_func_array函数的基本功能、用法及操作注意事项,需要的朋友可以参考下
PHP开发环境搭建工具有哪一些?这篇文章主要给大家介绍一些PHP开发环境搭建工具,在学习PHP前,对PHP开发环境搭建工具了解也是有必要的,下面我们就一起来看一下。
这篇文章主要介绍了PHP常见加密函数用法,结合实例形式分析了crypt与md5函数进行加密操作相关使用技巧与注意事项,需要的朋友可以参考下
今天小编就为大家分享一篇laravel 获取当前url的别名方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008