redis存储结构

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: redis存储结构
概要

首先,redis是一种"键值对"(key-value)数据库,也就是说,redis中存储的用户数据都是以key-value的方式存在的而这些键值对存储于哈希表,这也解释了为什么redis提供的set、lpush、hset、sadd、zadd等添加数据的命令的格式都基于key-value格式

其次,为什么redis选择键值对呢?或者说redis为什么选择哈希表呢?

哈希表的插入、查找时间复杂度是O(1),因为哈希表就是一个数组,这种高效的数据结构满足了redis对于高性能的需求

redis存储结构

图中涉及到的数据结构的名字和⽤途:

  • redisDb 结构,表示 Redis 数据库的结构,结构体⾥存放了指向了 dict 结构的指针;
  • dict 结构,结构体⾥存放了 2 个哈希表,正常情况下都是⽤「哈希表1」,「哈希表2」只有在 rehash 的时候才⽤,具体什么是 rehash,后面本⽂的哈希表数据结构会讲;
  • ditctht 结构,表示哈希表的结构,结构⾥存放了哈希表数组,数组中的每个元素都是指向⼀个哈希表 节点结构(dictEntry)的指针;
  • dictEntry 结构,表示哈希表节点的结构,结构⾥存放了 void * key 和 void * value 指针, *key 指向 的是 String 对象,⽽ *value 则可以指向 String 对象,也可以指向集合类型的对象,⽐如 List 对 象、Hash 对象、Set 对象和 Zset 对象

特别说明下,void * key 和 void * value 指针指向的是 Redis 对象,Redis 中的每个对象都由 redisObject 结构表示,如下图:

重点说说其中的哈希表结构 ditctht和dictEntry

ditctht表示哈希表,也就是一个存放哈希节点(dictEntry)的数组

dictEntry表示哈希节点,一个节点存放着void* key和void* value两个成员,redis规定其中的key指向string字符串,而value可以指向多种类型的对象(string、list、hash、set…)

1.为什么key只能指向string对象?

键的唯一性和简单性

键(key)必须是字符串

  • 在 Redis 中,所有的键都是字符串。这是设计上的选择,旨在简化和统一键的管理。字符串键使得哈希计算、比较和查找等操作变得简单而高效。
  • 统一使用字符串作为键,可以避免不同数据类型之间的兼容性问题。字符串键可以被唯一地标识和比较,确保哈希表中的键是唯一的。

2.value指向不同类型的对象时有什么区别?

a.string

当value指向string对象时,通过key查找到的value就是一个value指针,value指向一个string对象

b.list

当value指向list对象时,由于list可以存储多个节点值,value指向的就是一条链表的头节点,通过key查找到的value就是一个链表的头节点

c.hash

当value指向hash对象时,情况变得复杂,由于value本身作为一个key-value中的value,此时value指向另一个哈希表,这个哈希表中存储着若干键值对

所以查找一个hash对象时,命令也变得不同:hget key field ,通过key可以找到对应的value,这个value指向一个哈希表,因此不能找到具体的数据,所以需要第二个参数field作为key,在value所指向的哈希表中找到对应的value

也就是说当value是一个hash对象时,该对象的value存储在一个二级嵌套的hash表中

具体的底层数据结构实现另作文章

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
9天前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
36 13
|
9天前
|
存储 NoSQL Redis
【赵渝强老师】Redis的存储结构
Redis 默认配置包含 16 个数据库,通过 `databases` 参数设置。每个数据库编号从 0 开始,默认连接 0 号数据库,可通过 `SELECT <dbid>` 切换。Redis 的核心存储结构包括 `dict`、`expires` 等字段,用于处理键值和过期行为。添加键时需指定数据库信息。视频讲解和代码示例详见内容。
|
1月前
|
存储 NoSQL Redis
redis保存数据的结构-redisobject结构体
`redisObject`结构体是Redis内部数据组织的核心,它通过集成类型标识、引用计数和编码方式等关键信息,实现了数据的高效管理和访问。这种设计允许Redis根据数据的实际需求动态调整存储结构,既保证了内存使用的高效性,也确保了数据操作的灵活性和速度。通过对 `redisObject`的深入了解,可以更好地掌握Redis如何在内存中高效存储和操作数据,进而优化数据库的性能和资源利用。
21 0
|
2月前
|
存储 NoSQL Redis
2)Redis 的键值对长什么样子,又是怎么存储的?
2)Redis 的键值对长什么样子,又是怎么存储的?
42 0
|
3月前
|
存储 消息中间件 NoSQL
Redis命令详解以及存储原理
Redis命令详解以及存储原理
|
3月前
|
存储 NoSQL Redis
Redis存储原理与数据模型
Redis存储原理与数据模型