PNP: memcached

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 可以统计各个函数占用的时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值