Redis作为一个key-value存储数据库,索引必定是它最底层的支撑。学MySQL我们会想到B+树索引,学ES我们会想到倒排索引,学Redis我们一样会想到Hash索引。

索引简单来讲就是查询数据的优化方案,通过提取数据的特征信息,通过特征信息快速定位原始数据。按照这个思路,我们来举一反十,看看那些类似设计方案:

  1. 数组,通过下标计算元素的具体地址,然后通过地址获取数据,通过下标计算真实地址其实也算是一种索引技术。
  2. MySQL的B+树索引,通过索引减少查询磁盘的次数,提高查询效率,这是索引的经典场景。
  3. ES的倒排索引
  4. Java中的Map其实也是索引技术的经典实现
  5. 总结索引作为最底层的系统思想必须要深刻理解,除了索引还有数组和链表。

Redis的Hash算法

Redis的Hash碰撞率

Redis的Hash冲突解决方案

Redis的槽位设计

Redis的key设计

  • 长度足够短,减少存储空间
  • 避免长key,redis的key是字符串,key太长字符串的存储格式会变化,空间占用会变高
  • key分散性要好,所有数据库索引的共同特性
  • key最好由多级别业务key组成,区分业务避免混乱

        MurmurHash算法由Austin Appleby发明于2008年,是一种非加密hash算法,适用于基于hash查找的场景。murmurhash最新版本是MurMurHash3,支持32位,64位及128位值的产生。

        MurmurHash标准使用C++实现,但是也有其他主流语言的支持版本,包括:perl、C#、ruby、python、java等。这种算法即使输入的键是有规律的,算法仍能给出一个很好的随机分布性,计算速度非常快,使用简单。因此在多个开源项目中得到应用,包括libstdc、libmemcached、nginx、hadoop等。

  Redis使用的是MurmurHash2。当字典被用作数据库的底层实现,或者哈希键的底层实现时,使用MurmurHash2算法来计算键的哈希值

【原创】为什么Redis集群有16384个槽 - 孤独烟 - 博客园

https://github.com/redis/redis/issues/2576

Murmur哈希_百度百科

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐