首页 > 数据库 >Redis - 字典的实现与哈希冲突解决

Redis - 字典的实现与哈希冲突解决

时间:2024-03-04 22:44:36浏览次数:35  
标签:Redis 算法 冲突 哈希 MurmurHash 字典

1. 字典的实现

edis的字典数据类型的实现主要分为两个部分:

typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];
    long rehashidx; 
    unsigned long iterators; 
} dict;

其中,type属性表示字典的类型,而privdata属性表示字典的私有数据,它是一个指针类型,可以指向一个可选的私有数据结构。

值得注意的是,Redis中的字典使用了两个哈希表(dictht ht[2]),一个用于平时的读写操作,另一个仅在rehash过程中使用,用作新的哈希表。

2. 哈希算法

在Redis中,主要采用MurmurHash2这个非加密哈希算法。此算法的优点主要有三个:

  • 速度快:MurmurHash算法的速度非常快,可以在很短的时间内计算出哈希值。
  • 均匀性好:MurmurHash算法的哈希值分布均匀,因此冲突的概率较低。
  • 易于实现:MurmurHash算法的实现非常简单。

3. 解决键冲突

解决哈希冲突,Redis采用了“链地址法”:当两个键的哈希值相同时,会将它们链接在同一个哈希槽(slot)上,形成一个链表。

4. rehash

5. 哈希表的扩容与收缩

总结

Redis字典的实现充分考虑了性能和内存效率,采用了一系列优化策略来保证其高效的运行,包括使用了MurmurHash算法,采用链地址法处理哈希冲突,以及通过渐进式rehash避免操作的长时间阻塞等。

标签:Redis,算法,冲突,哈希,MurmurHash,字典
From: https://www.cnblogs.com/beatle-go/p/18052635

相关文章

  • Redis学习之路
    Redis代码成就万世基积沙镇海梦想永在凌云意意气风发一.是什么,有什么用用来解决数据量太大。数据索引太大,内存放不下。读写量(读写混合),单独的服务器承受不了。减轻服务器压力,使用缓存来保证效率(主要是用来解决读的问题)。Cache有时间局部性和空间局部性垂......
  • Redis整合Springboot
    六.巅峰1.事务Redis单条命令保证原子性,但是事务不保证原子性原子性:要么同时成功,要么同时失败Redis的事物本质:一组命令的集合,一个事务中的所有命令都会被序列化,事务执行过程中,会按照顺序执行。具有一次性,顺序性,排他性(没有隔离级别的概念)所有的命令在事务中,并没有直接执行,只有......
  • Redis在游戏开发中的几种应用场景
    Redis特点1.内存数据库Redis数据主要存储在内存,综合性能标准100k+QPS。需要说明下,十万QPS只是个综合参考,实际性能跟CPU性能、操作的命令复杂度有较大关系,对于简单的set/get操作50万QPS也没问题。2.丰富的数据结构所有Redis的数据都是以key-value键值对的形式存在......
  • 【Redis】Redis如何保证和MySQL数据库的数据一致性
    保障MySQL和Redis数据一致性需要使用不同的策略和技术,因为两者是不同的数据存储系统。以下是一些常见的方法:1.数据同步MySQL数据同步至Redis使用事件驱动机制:当MySQL中的数据更新时,通过触发器或者其他事件驱动的机制,将数据同步至Redis。定时任务:定期轮询MySQL数据......
  • laravel8 + redis 队列
      执行命令生成job: phpartisanmake:job自定义名称修改queue.php配置文件'redis'=>['driver'=>'redis','connection'=>'queue',【databases.php中单独配置一个redis的链接名为queue】'queue'=>en......
  • redis自学(10)Set
    Set是Redis中的单列集合,满足下列特点:不保证有序性保证元素唯一(可以判断元素是否存在)求交集、并集、差集  以上操作,都需要判断元素是否存在,因此可以看出,Set对查询元素的效率要求非常高 Set是Redis中的集合,不一定确保元素有序,可以满足元素唯一、查询效率要求极高。为了......
  • Redis技术论点
    Redis单线程&&多线程问题redis是单线程还是多线程在redis4.X之前的版本,redis是单线程;redis4.X版本之后,陆续开始支持多线程,比如持久化过程,但是核心工作线程仍然是单线程;redis6.X之后,redis针对部分设计大量数据操作,存在阻塞线程风险的命令提供了异步操作,如:zrange、ZRANK、flusdb等......
  • ULID(Universally Unique Lexicographically Sortable Identifier)是一种用于生成全局唯
    ULID(UniversallyUniqueLexicographicallySortableIdentifier)是一种用于生成全局唯一、可按字典序排序的标识符的格式。ULID结合了时间戳和随机数的特性,旨在提供高性能、低碰撞、可排序和易读的标识符。ULID的主要特点包括:全局唯一性:通过结合时间戳和随机数的方式,ULID可以生......
  • 字典推导式
    字典推导式字典推导式是一种简洁的构造字典的方式。它的语法和列表推导式类似,只不过结果是一个字典,而不是列表。enumerate函数enumerate函数可以将一个可迭代对象转化为一个枚举对象,其中每个元素都是一个包含索引和值的元组。它的基本语法如下:enumerate(iterable,[start=0])......
  • Linux安装Docker并搭建MySql、Redis、RabbitMQ
    1.1安装docker(1)删除老版本sudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\......