在高并发场景中,我们最普遍的方案是采用高性能的缓存。在缓存使用过程中,需要注意缓存穿透
、缓存雪崩
、缓存击穿
。以下介绍如何通过singleflight
防止缓存击穿
。
什么是缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
SingleFlight
在多个并发请求对一个失效的key进行源数据获取时,只让其中一个得到执行,其余阻塞等待到执行的那个请求完成后,将结果传递给阻塞的其他请求达到防止击穿的效果。
安装
1 | go get golang.org/x/sync/singleflight |
示例
1 | package main |
- 结果只有一个协程执行从数据库中获取并设置缓存的操作,其他协程则是在等待获取缓存。避免缓存击穿。
1
2
3
4
5
6
7
8
9
10
11
122021/02/18 14:26:12 getting username from database
2021/02/18 14:26:12 setting username in cache
hongker
hongker
hongker
hongker
hongker
hongker
hongker
hongker
hongker
hongker
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2021/02/18/golang-singleflight/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!