Memcached哈希性能优化(四)

1. 工作简介

这周的工作主要是学习了下bagLRU这个算法,其实细说的话也不算是个算法,算是一个解决思路吧,然后就是我觉得其实这个办法也不是特别的优秀,尤其是bag的size比较大的话,这个效率还是有待商榷的,想着想着bagLRU这个东西说实在就是为了查找方便来做的一个优化,其实主要还是在淘汰的时候做的一个优化,可以从最old的bag去找查看是不是有可以替换的设计,后来我想了想,其实如果一个东西能够支持动态的查找一个范围的东西,比如直接可以快速的定位过期的元素,这样就可以不用线性的扫描列表,另外支持快速的维护工作,其实堆和平衡的二叉查找树都是不错的选择,但是这个的实现有点复杂,后来觉得发现skiplist的实现很不错了,学习了一下,觉得这个挺适合这个场景的,所以暂时定下将LRU的实现采用skiplist的来实现,这个有2个好处:

第一、memcached的本身是双向链表的实现,采用skiplist的改动首先会比较小,

第二、skiplist的性能不亚于平衡的二叉树,采用这个的带来的性能优势其实比较大。

2. 本周工作

2.1 BagLRU分析

首先介绍一下BagLRU,这个的实现思路主要只在  这里,后来intel的人员对他实现了优化,按照后续的版本做了个优化,其项目的github的地址在 这里。这里我就简要的说明一下他的工作原理吧。
首先它定义了LRUbag这个东西,我们可以直接看定义。
struct lru_bag{
        struct lru_bag *next_bag; //single linked list always placed at the end when created
        hash_item *newest_item;
        hash_item *oldest_item;
        time_t bag_created;
        time_t bag_closed;
        pthread_mutex_t bag_lock;// WHen the bag was created so we know how long this bag has been open
        int item_count; //we only really care about this
};
他这里将每个slab下的元素划分成了若干个bag,每个bag里面有2个重要的指针,newest_item,和oldest_item,这个指针是用来定位目前的新给入一个item的插入bag的位置,也就是看目前的bag中最老的元素或是最新的元素是不是有过期的,如果有过期的就在这个bag里面做继续搜索,如果没有的话,那么就继续找另一个bag,直到找到最新的bag,将这个元素插入的bag中去。
这样做的好处很明显
第一、这个是一个类似分块链表的东西,也就是说如果查找的话,可以跳跃着查询,不用一个一个遍历的去找,如果bag的大小设置为1000的话,那个每次的搜索的步长就是1000
第二、目前每个bag有一个锁,也就是说它将每个lru的锁的粒度再次细分到,按照bag划分,也就是说一个LRU表上的锁的粒度再一次减少,同时操作多个bag成为可能,这样可以明显的提高并发操作。
所以插入的效率还是明显的提高了,至少每次不会遍历所以的元素,而get和update还有delete的操作其实影响不大,因为这些操作都是通过操作hash表来进行的,也就是说这个操作除了锁的代价的话,基本可以认为是O(1)的,所以这里优化的空间我觉得不是很大。

2.2 skiplist优化简介

具体的内容这里的 博客视频介绍的十分详细了,本着不重复造轮子的原则我这里就暂时先不写了,这几天在整理中期的报告(还有这周的周报要写啊>_<),那个里面应该会有详细的介绍,这里我就说下我的一个具体的实现的插入的想法吧。
1. 借鉴bagLRU的思路,我们也会将元素分成bag,不过这个bag是按照设置的超期时间设置,也就是说超期时间在1000和2000或者是再高的可以区分一下时间,那如果有落在这个区间内的,比如1500的怎么处理呢,那就按长的2000划入bag之中,当然还是有最新和最旧的记录。
2. 然后在bag之中,首先是查找过期元素,我们有目前有当前的时间,那么首先就是查找超期的元素,那么过期的时间限显然是可以计算出来的,那我们就可以在这个时间段之前的元素我们就可以快速的定位出来,如果不符合我们可以直接跳过,如果在范围内的话此时比baglru优秀的地方就出来了,我们的查找是logN级别的,比一个线性的查找的就快的多了,这就是一个优化的地方。
3. 最后就是get的操作,如果是过期的元素的那就删除掉,如果没有过期的话,我们这里可以做个更新来维护我们的skiplist,这样的话我们就可以按照我们的思路再查找的时候优化
分析下利弊吧
1. 插入的时间肯定可以减少,但是get的时延会略微有点增加
2. 锁的粒度有所减少,但是比较其baglru还是有点大

3.下周工作计划

下周一个是把思路和导师沟通下确认下,然后再花一点时间把中期的总结补完,最后就是好好开始编码和测试了

3.1 实现计划

1. 实现bag分组过程
2. 实现skiplist的操作
3. 将bag和skiplist的操作融合一下,实现这个思路
4. 修复bug,如果可以可以修改成一个新的engine
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值