无锁缓存,每秒10万并发,究竟如何实现?
有一类业务场景:
(1)超高吞吐量,每秒要处理海量请求;
(2)写多读少,大部分请求是对数据进行修改,少部分请求对数据进行读取;
这类业务,有什么实现技巧么?
接下来,一起听我从案例入手,娓娓道来。
void SetDriverInfo(long driver_id, DriverInfo info){
WriteLock (m_lock);
Map<driver_id>= info;
UnWriteLock(m_lock);
}
DriverInfo GetDriverInfo(long driver_id){
DriverInfo t;
ReadLock(m_lock);
t= Map<driver_id>;
UnReadLock(m_lock);
return t;
}
有什么潜在的优化方法么?
锁冲突之所以严重,是因为整个Map共用一把锁,锁的粒度太粗。
画外音:可以认为是一个数据库的“库级别锁”。
是否可能进行水平拆分,来降低锁冲突呢?
答案是肯定的。
画外音:类似于数据库里的分库,把一个库锁变成多个库锁,来提高并发,降低锁冲突。
我们可以把1个Map水平切分成N个Map:
void SetDriverInfo(long driver_id, DriverInfo info){
i = driver_id % N; // 水平拆分成N份,N个Map,N个锁
WriteLock (m_lock[i]); //锁第i把锁
Map[i]<driver_id>= info; // 操作第i个Map
UnWriteLock (m_lock[i]); // 解锁第i把锁
}
有没有可能,进一步细化锁粒度,一个元素一把锁呢?
答案也是肯定的。
画外音:可以认为是一个数据库的“库级别锁”,优化为“行级别锁”。
void SetDriverInfo(long driver_id, DriverInfo info){
index = driver_id;
WriteLock (m_lock[index]); //超级大内存,一条记录一个锁,锁行锁
Array[index]= info; //driver_id就是Array下标
UnWriteLock (m_lock[index]); // 解锁行锁
}
这个方案使得锁冲突降到了最低,但锁资源大增,在数据量非常大的情况下,内存往往是装不下的。
写多读少的业务,有一种优化方案:无锁缓存,将锁冲突降低到。
(1)线程1对缓存进行操作,对 key 想要写入 value1 ;
总结
本文分享自微信公众号 - 架构师之路(road5858)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Rust 和 LLVM 编译器中添加了 Windows CFG 支持
微软方面宣布,该公司已与 LLVM 和 Rust 开发团队达成合作,将对 Windows Control Flow Guard(CFG)平台安全功能的支持添加到了 Clang 和 Rustc 编译器中。此前,CFG 仅适用于使用 Microsoft Visual C ++ 编译的 C/C ++ 代码。 CFG是微软自 Windows 8.1版本开始添加的一项强大的安全功能,目前已在 Windows 10 中被广泛使用。该功能可以保护应用程序代码的执行流,以防止恶意代码(例如内存错误的结果)劫持本机“控制流”并使应用程序执行有害的操作。CFG 是对其他漏洞利用缓解措施的补充,例如地址空间布局随机化(Address Space Layout Randomization,ASLR)和数据执行保护(Data Execution Prevention,DEP)。 目前,CFG功能已在 LLVM 10.0 和 Rust 1.47(当前为 Nightly 版本)两个版本中可用。 “LLVM 10.0 现在支持 CFG。我们对 CFG 的实现完全包含在核心库中,这使得它可以在基于 LLVM 的任何编译...
- 下一篇
内网渗透技巧之横向控制
一、前言 目前当攻击者获取到某台内网机器的控制权限之后,进一步会考虑如何在内网进行横向移动,以及攻击域控服务器,今天丹丹就总结一下突破边界后进一步的攻击技巧。 二、Windows域介绍 将网络中多台计算机逻辑上组织到一起进行集中管理,这种区别于工作组的逻辑环境叫做域。域是由域控制器(Domain Controller)和成员计算机组成,域控制器就是安装了活动目录(Active Directory)的计算机。活动目录提供了存储网络上对象信息并使用网络使用该数据的方法,在域中,至少有一台域控制器,域控制器中保存着整个域的用户帐号和安全数据库。 2.1域的优势 1.集中管理,可以集中的管理企业中成千上万分布于异地的计算机和用户。 2.便捷的网络资源访问,能够容易的定位到域中的资源。 3.用户一次登录就可访问整个网络资源,集中的身份验证。 4.网络资源主要包含用户帐户、组、共享文件夹、打印机等 5.可扩展性,既可以适用于几十台计算机的小规模网络,也可以适用于跨国公司。 2.2域渗透常用命令 查询与控制器主机名 :net group “domain controllers” /domain 可...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Mario游戏-低调大师作品
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装