【Redis】深入理解 Redis 常用数据类型源码及底层实现

在文章【Redis】10大数据类型概述中我们介绍了Redis常用的10大数据类型,这10大数据类型可并不是直接在底层通过代码实现的,而是通过不同的底层数据结构组合起来的,这篇我们介绍下Redis常用数据类型的底层数据结构( ̄∇ ̄)/

Redis数据类型的底层数据结构

  • SDS动态字符串
  • 双向链表
  • 压缩列表ziplist
  • 哈希表hashtable
  • 跳表skiplist
  • 整数集合intset
  • 快速列表quicklist
  • 紧凑列表listpack

在哪里看Redis源码

网站地址

github.com/redis/redis

Redis根目录下src文件夹📁

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的API。

参考书籍推荐

源码概况

Github官网

github.com/redis/redis

Redis基本的数据结构(骨架)

从官网可以看到对于部分关键的.c文件的介绍,最重要的两个:dict.cobject.c

Redis数据库的实现

  • 数据库的底层实现db.c
  • 持久化rdb.c和aof.c

Redis服务端和客户端实现

  • 事件驱动ae.c和ae_epoll.c
  • 网络连接anet.c和networking.c
  • 服务端程序server.c
  • 客户端程序redis-cli.c

其他

  • 主从复制replication.c
  • 哨兵sentinel.c
  • 集群cluster.c
  • 其他数据结构,如hyperloglog.c、geo.c等
  • 其他功能,如pub/sub、Lua脚本

详解字典数据库K-V键值对

键值对是怎样实现的

Redis是key-value存储系统

  • key一般都是string类型的字符串对象

  • value则为Redis对象(redisObject)

    • 可以是字符串对象
    • 也可以是集合数据类型的对象,比如List对象、Hash对象、Set对象和Zset对象

10大类型说明

传统的5大类型

  • String
  • List
  • Hash
  • Set
  • ZSet

新的5大类型

  • bitmap -> 实质String
  • hyperLogLog -> 实质String
  • GEO -> 实质Zset
  • Stream -> 实质Stream
  • bitfield -> 具体看key

在Redis的逻辑中,服务(redisServer)启动加载数据库(redisDb),然后去读取字典(dict),然后去找哈希(dictht),就像Java中的那句------一切皆对象,在Redis中一切皆K-V(dict字典)。

Redis是由C语言编写的,想要深入了解Redis的数据结构,就不得不简单介绍下C语言的文件类型📃(因为接下来我们需要在一堆源码中找到我们需要的文件)和struct结构体(学习数据类型的底层实现)。

  • 在C语言中,源代码文件通常以".c"作为后缀名,以表示该文件包含C语言源代码。例如,如果编写一个名为"qin.c"的程序,那么它的源代码将保存在名为"qin.c"的文件中。C语言的头文件通常以".h"作为后缀名,库文件通常以".lib"或".a"作为后缀名,可执行文件通常以".exe"或".out"作为后缀名。
  • C语言的结构体,需要使用 struct 语句来定义,struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
ini 复制代码
struct [structure tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables];  

structure tag 是可选的,每个 member definition 是标准的变量定义,在结构定义的末尾,最后一个分号之前,可以指定一个或多个结构变量(是可选的),举个🌰方便大家理解:

ini 复制代码
struct Books
{
    char  title[50];
    char  author[50];
    int   book_id;
} book;  

了解这些基础的内容以后,接下来我们就开始深入到Redis数据结构底层的C语言进行源码分析喽~

相关推荐
momo学习版4 小时前
带你实现基于 Redis 的分布式 Session 管理
redis
JavaGuide4 天前
字节二面:Redis 能做消息队列吗?怎么实现?
redis·后端
漫霂4 天前
基于redis实现登录校验
redis·后端
程序员小崔日记4 天前
一篇文章彻底搞懂 MySQL 和 Redis:原理、区别、项目用法全解析(建议收藏)
redis·mysql·项目实战
读书笔记4 天前
CentOS 7 安装 redis-6.2.6.tar.gz 详细步骤(从源码编译到启动配置)
redis
焗猪扒饭5 天前
redis stream用作消息队列极速入门
redis·后端·go
雨中飘荡的记忆7 天前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
曲幽7 天前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
知我Deja_Vu12 天前
redisCommonHelper.generateCode(“GROUP“),Redis 生成码方法
数据库·redis·缓存