菜鸟笔记
提升您的技术认知

多读场景下的本地缓存-ag真人游戏

在读写分离的架构中通常需要一个高性能的缓存,而且这个缓存是读多写少的。
比如黑名单缓存,一个线程负责更新,多个线程读取。

哈希表 读写锁

这是一个简单通用的方案,一般对性能要求不高时可以使用。虽然简单,缺点也很明显,写时会阻塞读。

concurrent hash map

支持多线程的哈希表有很多种实现方式,java中的concurrenthashmap是一个不错的实现,但其本质也是分段加锁,虽然降低了竞争锁的概率,但是也不能避免。

多线程下,哈希表的rehash是一个难题,大多实现都很难避免加锁,而且c 也没有相应的标准。

双buffer

双buffer也是一个常用的手段。一般有两种:一种是两块固定的不会被回收的buffer,两个buffer交替使用,这样做可以避免buffer的内存回收,但是需要管理两个buffer的交替时机,这是一个难题。很多时候是靠“超时”来保证的,比如双buffer的交替频率是10秒,而buffer的一次访问时间不会超过100毫秒等。这种方式虽然hack,但大部分场景下是有效的。

cow 智能指针 自旋锁(spin lock)

用智能指针管理内存是个不错的方式,但是也有弊端。
智能指针的赋值不是原子的,所以多线程情况下其赋值时需要加锁(c 11中有智能指针的原子操作),为了保证效率可以选用spin lock。
除了需要加锁还有另外一个问题:“不能确定内存的释放时机”,智能指针是在引用计数归零时释放内存的,考虑到业务系统复杂多变,而且在多线程情况会变得更复杂。如果在处理业务的线程释放,可能会影响其响应时间。而且如果更新的频率过高而且旧的内存迟迟不能释放,会导致过多的内存副本,严重时会导致oom。

rcu(read copy update) qsbr

rcu并不是新技术其理论早有人提出,linux内核中也有大量的使用。
利用rcu可以做到读时无锁。不同于用智能指针管理内存,利用rcu和qsbr可以优雅的回收内存。写线程可以知道读线程何时结束读,确保及时、安全的回收内存。

网站地图