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

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

前言

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

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

Redis键值对的存储原理

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

存储键值对的运行机制

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

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

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

使用哈希表寻找键值对

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

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

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

使用哈希表存储键值对

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

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

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

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

对弊端的优化

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

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

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

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

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

渐进式迁移哈希表

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

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

每次请求迁移一个桶

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

总结

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

相关文章

  • Redis的共享session应用实现短信登录

    Redis的共享session应用实现短信登录

    本文主要介绍了Redis的共享session应用实现短信登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Redis缓存和数据库的数据一致性的问题解决

    Redis缓存和数据库的数据一致性的问题解决

    随业务增长,直接操作数据库性能下降,引入缓存提高读性能常见,但缓存和数据库的双写操作会引发数据不一致问题,本文讨论几种常用同步策略,感兴趣的可以了解一下
    2024-09-09
  • 详解如何使用Redis作为高效缓存

    详解如何使用Redis作为高效缓存

    Redis是一个高性能的 内存存储系统,通常被用作 缓存 来加速数据访问,提高应用的吞吐量和响应速度,本文详细讲解如何使用 Redis 作为高效缓存,包括基本原理、常见模式、最佳实践以及优化技巧,需要的朋友可以参考下
    2025-01-01
  • redis快照模式_动力节点Java学院整理

    redis快照模式_动力节点Java学院整理

    这篇文章主要为大家详细介绍了redis快照模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • redis分布式锁实现示例

    redis分布式锁实现示例

    本文主要介绍了redis分布式锁实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • Redis出现(error)NOAUTH Authentication required.报错的解决办法(秒懂!)

    Redis出现(error)NOAUTH Authentication required.报错的解决办法(秒懂!)

    这篇文章主要给大家介绍了关于Redis出现(error)NOAUTH Authentication required.报错的解决办法,对于 这个错误这通常是因为Redis服务器需要密码进行身份验证,但客户端没有提供正确的身份验证信息导致的,需要的朋友可以参考下
    2024-03-03
  • Redis一键巡检脚本的实现

    Redis一键巡检脚本的实现

    在使用Redis作为数据存储的时候,定期进行巡检是非常重要的,本文主要介绍了Redis一键巡检脚本的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Redis如何存储对象与集合示例详解

    Redis如何存储对象与集合示例详解

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)本文介绍了关于Redis是如何存储对象与集合的相关资料,需要的朋友可以参考下
    2018-05-05
  • Redis批量删除指定前缀的Key两种方法

    Redis批量删除指定前缀的Key两种方法

    redis作为缓存服务器在项目中经常使用,使用redis存储数据时,我们经常会将key分组,这篇文章主要给大家介绍了关于Redis批量删除指定前缀的Key两种方法,需要的朋友可以参考下
    2024-01-01
  • Redis+Lua脚本实现计数器接口防刷功能(升级版)

    Redis+Lua脚本实现计数器接口防刷功能(升级版)

    这篇文章主要介绍了Redis+Lua脚本实现计数器接口防刷功能,使用脚本使得set命令和expire命令一同达到Redis被执行且不会被干扰,在很大程度上保证了原子操作,对Redis实现计数器接口防刷功能感兴趣的朋友一起看看吧
    2022-02-02

最新评论