本文和大家分享的主要是redis中,从算法性能及模拟效果提升出发优化近似LRU算法的相关操作,希望通过本文的分享,对大家学习redis 有所帮助。
Redis 3.0 LRU算法优化实现
Redis 3.0中主要做了如下优化:
· LRU 时钟的粒度从秒级提升为毫秒级
· 使用新的 API 来获取LRU替换时的采样样本
· 默认的LRU采样样本数从3提升为5
· 使用 eviction pool 来选取需要淘汰的key
提升 LRU时钟 的粒度,主要是为了在测试LRU算法性能时,能够在更短的时间内获取结果,更新LRU时钟的方法也有所变化,如果LRU时钟的时间粒度高于 serverCron刷新的时间粒度,那么就主动获取最新的时间,否则使用server缓存的时间,
/* Macro used to obtain the current LRU clock.
* If the current resolution is lower than the frequency we refresh the
* LRU clock (as it should be in production servers) we return the
* precomputed value, otherwise we need to resort to a system call. */#define LRU_CLOCK() ((1000/server.hz <= LRU_CLOCK_RESOLUTION) ? server.lruclock : getLRUClock())
unsigned int getLRUClock(void) {
return (mstime()/LRU_CLOCK_RESOLUTION) & LRU_CLOCK_MAX;
}
在源码的 utils/lru 目录下有测试脚本,测试前需要把 src/redis.h 中的 REDIS_LRU_CLOCK_RESOLUTION 宏设置为1,即LRU时钟的分辨率为 1ms ,然后重新编译源码,执行方式如下,
ruby test-lru.rb > /tmp/lru.html
测试完成后会生成一个 html 页面,包含测试结果,以及一个图形化的插入淘汰流程
在 Redis 2.8