08|并发map:百万数据本地缓存,如何降延时减毛刺?

并发 map 选择
- 深入了解
- 翻译
- 解释
- 总结

1. sync.Map是Go语言中提供的内置并发安全的map类型,适用于读多写少的场景,但在大规模数据缓存时可能存在读性能退化和写入性能开销的问题。 2. 在大规模数据缓存时,为了避免GC开销,可以将map中的key-value类型设计成非指针类型且大小不超过128字节,从而避免GC扫描。 3. 在缓存大规模数据时,可以使用成熟的开源库来实现,如bigcache,它利用了map的key-value特性来避免GC扫描,但可能会引起其他开销。 4. 在大规模数据缓存时,GC耗时会随数据规模增加而增加,因为GC在做对象扫描标记时需要扫描标记map里面的全量key-value对象,数据越多,需要扫描的对象越多,GC时间也就越长。 5. 在大规模数据缓存时,key-value的大小不能超过128字节,否则会导致GC性能开销变大,因为超过128字节的key-value会退化成指针,导致被GC扫描。 6. sync.Map的底层数据结构是read和dirty两个map结构,其中read存储了部分写入Map的内容,用来加速读操作,而dirty存储了全量内容,需要加锁才能读写数据。 7. sync.Map的使用场景相对苛刻,占用内存较高,更适用于读多写少的场景,且在大规模数据缓存时可能存在读性能退化和写入性能开销的问题。 8. 在大规模数据缓存时,应该选择分段锁实现的map而不是sync.Map类型来缓存数据,因为很难准确地预估读写比例,且读写比例会随着业务的发展变化,同时两个map的内存和拷贝开销也是不得不考虑的稳定性风险点。 9. 在缓存大规模数据时,为了避免GC开销,可以将map中的key-value类型设计成非指针类型且大小不超过128字节,从而避免GC扫描。 10. 在大规模数据缓存时,GC耗时会随数据规模增加而增加,因为GC在做对象扫描标记时需要扫描标记map里面的全量key-value对象,数据越多,需要扫描的对象越多,GC时间也就越长。
《Go 服务开发高手课》,新⼈⾸单¥59
全部留言(1)
- 最新
- 精选
- 快叫我小白runtime.GC 这个函数为何在函数内外都调用一次呀?而且测试函数似乎没产生需要回收的临时结构体,我们调用GC函数仅仅是为了观察垃圾回收的扫描时间吗?2024-12-25归属地:上海