其他
前端性能监控 (RUM) 接入层服务高并发优化实践—缓存模型
作者:张翔,腾讯云监控高级工程师
RUM 要提升用户体验!!!
避免缓存惊群效应
// 简单的代码例子
const projectHash = {}; // 存储项目数据,这里是异步并且服务启动前去 redis 中取数据的
app.use(async ctx => {
if (!Object.keys(projectHash) == 0 && projectHash[ctx.query.id]) {
projectHash[ctx.query.id] = await redis.hget(key, ctx.query.id);
}
return projectHash[ctx.query.id];
});
refresh-ahead caching
为什么 node 中不需要锁而 golang 中需要锁呢?—— Memory Model
内存重排
// code1
x := 0
for i := 0; i < 100; i++ {
x = 1
fmt.Println(x)
}
// code2
x := 1
for i := 0; i < 100; i++ {
fmt.Println(x)
}
x=0
赋值操作,code1 的打印结果可能就是 1100011
而 code2 的打印结果可能就是 1111000000
,在多核情况下是很难断定这两个程序是等价的。这就是编译器重排,即编译器会改变变量的赋值顺序。// 伪代码
type ProjectRepo struct {
data sync.Map
}
var projectRepo ProjectRepo
func (p *ProjectRepo) LoadData() {
rawData := redis.HGetAll(key)
p.data.Store('data', rawData)
}
func (p *ProjectRepo) Get(projectId string) {
rawData, _ := p.data.Load('data')
return rawData[projectId]
}
COW — Copy On Write 技术
关注我们,了解腾讯云监控的最新动态