美文网首页
如何优化超高并发读少写多的场景

如何优化超高并发读少写多的场景

作者: 小怪兽狂殴奥特曼 | 来源:发表于2020-09-18 14:10 被阅读0次

一个写多读少的场景:假设滴滴有,100w司机,信息保存在一个map<driver_id, driver_info> driver_info_map中。司机每5秒更新一下自己的经纬度信息,那么写这个map的qps为20w/s。日订单量1000w,平均查询订单1000qps。即20w写qps,1k读qps。
一般情况下,对司机信息的读写操作如下:

driver_info get_driver_info(uint64 driver_id)  
{
     lock(dirver_lock)
     info = driver_info_map[driver_id]
     unlock(driver_lock)
     return info
}

int set_driver_info(uint64 driver_id, driver_info  info)
{
     lock(dirver_lock)
     driver_info_map[driver_id]=info
     unlock(driver_lock)
}

这种实现方法遇到上面的写多读少的情景时,读写锁会成为性能的瓶颈,因为锁的粒度太大,所有的数据都依赖这把锁。
优化思路:
1.给每个用户信息配一把锁,把用户信息存在数组中,array[driver_id]=dirver_info。如果数据量不大,这种方案可行。如果数据量非常大,会非常耗内存。
2.水平切分,按照driver_id进行哈希,比如对10000进行取模,则把司机信息切分成1w组,用1w个map来存放司机信息。面对大数据时非常这种方法比较适合。
3.去掉锁,存放的时候仍然以KV的map来存放,但是value不在是单独的dirver_info,而是先给driver_info生成一个签名,然后将签名+driver_info分两步写到定长的内存中,作为value存放。取的时候,对value中的driver_info先生成签名,然后跟取出来的签名进行比较。如果一样,说明driver_info没有发生竞态写。


3.PNG

相关文章

网友评论

      本文标题:如何优化超高并发读少写多的场景

      本文链接:https://www.haomeiwen.com/subject/vkfjyktx.html