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

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

作者: 小怪兽狂殴奥特曼 | 来源:发表于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