memcached1.2.8版本可以用作学习版本。
内存密集型(CPU密集型, IO密集型,隔离度递增 )
memcached 本质上是一个远程的哈希表。
数据结构的选择
1. hash_map<string, value>
lock()
val = theMap.get(key)
send(*val)
unlock()
//考虑并发(同时get set),send需要在临界区里面执行。
2. typedef shared_ptr<const value> ValuePtr;
hash_map<string, ValuePtr> theMap;
ValuePtr val;
lock()
val = theMap.get(key)
unlock()
send(*val)
// 使用智能指针的引用计数减少临界区的长度,同时使用const,保证拿到后,不会被修改。 如果拿到后
// 有其他客户想修改,会先删除旧值,然后插入新值。
3. hash_set<shared_ptr<Item>>
key和value组合在一起,放在hash set中, 这样比直接使用hash map节省一些空间(key不用string,而是和
value放在连续的空间)。 注意,需要自定义hash和equel函数,
因为不是通过比较shared_ptr的值来查找,而是通过比较Item中的key来查找。
4. hash表分区加锁, 减少锁争用
struct Shard {
mutex mu_;
hash_map<...> map_;
}
Shard shard[1024];
int x = key.hash() % 1024;
ValuePtr val;
shard[x].mu_.lock();
val = shard[x].map_.get(key)
shard[x].mu_.unlock()
5. unordered_set<shared_ptr<const Item>, Hash, Equal>
perf record / perf report 可以统计各个函数占用的时间。