什么是缓存击穿?原理及实现是什么
Admin 2022-08-13 群英技术资讯 1578 次浏览
今天这篇给大家分享的知识是“什么是缓存击穿?原理及实现是什么”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“什么是缓存击穿?原理及实现是什么”文章能帮助大家解决问题。一、什么是缓存击穿
当一个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+pdo实现的购物车类,结合完整实例形式分析了PHP结合pdo操作数据库读写实现购物车功能相关实现与使用方法,需要的朋友可以参考下
PHP如何实现打包zip并下载功能?下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家,下面我们一起来了解看看吧。
学习PHP,我们需要掌握一些基础语法,其中数据类型是很重要的知识点,那么php数据类型是什么?有哪些呢?下面就跟随小编一起来认识一下吧。
php中PDO获取关联数组:1、可以使用 PDO::FETCH_ASSOC 来获取关联数组。2、创建一个$options组,将所有默认配置放入其中,只需将数组传递到$conn变量。
PHP连接MySQL数据库的操作是新手学习PHP一定要掌握的技能,这篇文章就给大家分享三个PHP连接MySQL数据库的方法,分别是面向过程方法,面向对象方法和PDO方法,对正在学习PHP的同学有一定的参考价值。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
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