Redis数据库存储键值对的底层原理分析

 更新时间:2026年03月03日 08:40:54   作者:糖醋菠萝鸡  
Redis是一种内存数据库,使用哈希表存储键值对,它通过哈希函数计算键的存储地址,并通过地址找到数据,当出现哈希冲突时,Redis使用链地址法解决,为优化性能,Redis采用渐进式哈希表迁移技术,逐步将数据从旧哈希表迁移到新哈希表,减少对业务的影响

前言

Redis可以简单理解为是一个存储键值对的内存结构

下面我们来看一下Redis使用什么数据结构来存储键值对的叭

Redis键值对的存储原理

Redis存储键值对的数据结构是哈希表

存储键值对的运行机制

因为Redis的数据存储类型是多种多样的,所以管理键值对的哈希表只是存储这个数据的地址

我下面解释运行存储键值对运行机制的时候的术语解释

  • 存储地址: 哈希表存储的 数据地址 位置
  • 数据地址: 数据本身的 地址 位置

使用哈希表寻找键值对

1、使用key通过哈希函数计算出哈希表中的存储地址

2、通过存储地址找到哈希表中存放的数据地址

3、通过数据地址找到数据并进行读取

使用哈希表存储键值对

1、使用key通过哈希函数计算出哈希表中的存储地址

2、通过存储地址找到数据应该存放的位置,把数据地址存放在里面

使用哈希表存储键值对弊端

当存储数据过多的时候,此时出现哈希冲突,会在每一个哈希桶中形成冲突链表,从而出现寻找存储地址效率变慢

对弊端的优化

redis同时维护数组相同的两个哈希表

当冲突链表过多的时候,会进行数据迁移

把备用的哈希表数组长度增大到满足当前数据规模的大小

把数据迁移到新的满足当前数据规格大小的哈希表中

一次性迁移会对redis造成短时间的阻塞,影响业务,所以采用渐进式的迁移哈希表

渐进式迁移哈希表

下面说的哈希表的桶可以理解为冲突链表

每次有请求发生过来的时候,在处理请求的同时顺带对这个旧哈希表进行从左到右的桶迁移

每次请求迁移一个桶

迁移期间查询数据两个哈希表都进行查询,存储数据存储到新的哈希表中

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 爬虫技术之分布式爬虫架构的讲解

    爬虫技术之分布式爬虫架构的讲解

    今天小编就为大家分享一篇关于爬虫技术之分布式爬虫架构的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Redis 8种基本数据类型及常用命令和数据类型的应用场景小结

    Redis 8种基本数据类型及常用命令和数据类型的应用场景小结

    Redis是一种基于内存操作的数据库,其中多亏于高效的数据结构,本文主要介绍了Redis 8种基本数据类型及常用命令和数据类型的应用场景小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Redis swap空间(虚拟内存)的使用详解

    Redis swap空间(虚拟内存)的使用详解

    这篇文章主要介绍了Redis swap空间的使用示例,帮助大家更好的理解和学习使用Redis数据库,感兴趣的朋友可以了解下
    2021-03-03
  • 解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

    解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

    该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redis缓存缓解数据库压力,并结合Lua脚本进行原子性判断,使用阻塞队列和消息队列异步处理订单,有效提高了系统的并发处理能力和可用性
    2025-02-02
  • Redis进行验证码登录的项目实践

    Redis进行验证码登录的项目实践

    本文主要介绍了Redis进行验证码登录的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • redis清空所有数据的三种方法

    redis清空所有数据的三种方法

    本文主要介绍了redis清空所有数据的三种方法,主要包括FLUSHALL,FLUSHDB,SCREPT FLUSH这三个指令,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 详解redis中的锁以及使用场景

    详解redis中的锁以及使用场景

    这篇文章主要介绍了详解redis中的锁以及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Redis中BigKey的隐患问题小结

    Redis中BigKey的隐患问题小结

    文章介绍Redis中BigKey的概念及其对性能的影响,包括内存占用、网络阻塞、CPU耗尽和集群不稳定等问题,对Redis中BigKey的隐患问题感兴趣的朋友一起看看吧
    2025-07-07
  • redis中如何使用lua脚本让你的灵活性提高5个逼格详解

    redis中如何使用lua脚本让你的灵活性提高5个逼格详解

    这篇文章主要给大家介绍了关于redis中如何使用lua脚本让你的灵活性提高5个逼格的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • Redis中的Lettuce使用详解

    Redis中的Lettuce使用详解

    Lettuce 是一个高级的、线程安全的 Redis 客户端,用于与 Redis 数据库交互,Lettuce 是一个功能强大、使用方便的 Redis 客户端,适用于各种规模的 Java 项目,下面给大家介绍Redis中的Lettuce使用详解,感兴趣的朋友一起看看吧
    2025-05-05

最新评论