Redis系列-13.Redis经典五大类型源码及底层实现(一)(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis系列-13.Redis经典五大类型源码及底层实现(一)

Redis经典五大类型源码及底层实现


经典面试题


Redis的跳跃列表了解吗?这个数据结构有什么特点


redis项目里面怎么用?redis的数据结构都了解那些?


redis的zset底层实现,说了压缩列表和跳表,问这样设计的优缺点,只说了优点,缺点没说出来


redis的跳表说一下,解决了哪些问题,时间复杂度和空间复杂度如何


其实阅读源码90%是没有太大意义的,完全是为了面试,但是10%是因为大厂自己的内部中间件,比如贵公司自己内部redis重构,阿里云redis,美团tair,滴滴kedrs等等


redis源码


https://github.com/redis/redis


而对应的源码分析的书籍有


核心部分


数据结构


  • 简单动态字符串sds.c
  • 整数集合intset.c
  • 压缩列表ziplist.c
  • 快速链表quicklist.c
  • listpack
  • 字典dict.c


Redis数据库的实现


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


Redis服务端和客户端实现


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


Redis字典数据库KV键值对是什么?


redis是key-value存储系统,key一般是String类型的字符串对象,value类型则为redis对象(redisObject),value可以是字符串对象,也可以是集合数据类型的对象,比如List对象,Hash对象,set对象和zset对象。


10大类型


String

List

Hash

Set

Zset

bitmap 实质是String

hyperloglog 实质是String

GEO 实质是Zset

Stream 实质是Stream

BITFIELD 看具体key


上帝视角



RedisObject结构体


redis定义了redisobject结构体来表示string、hash、list、set、zset等数据结构


struct结构体


Redis中每个对象都是一个redisobject


字典、KV是什么?


每个键值对都会有一个dictEntry

这些键值对是如何保存进Redis并进行读取操作,O(1)复杂度的


redisObject + Redis数据类型 + Redis所有编码方式(底层实现)三者之间的关系



五大数据结构C语言源码分析


redis6.0.5


redis6之前,老版本


Redis7



源码分析总体数据结构大纲


程序员写代码时脑子底层思维


从set hello world说起


set hello word为例,因为Redis是KV键值对的数据库,每个键值对都会有一个dictEntry(源码位置:dict.h),里面指向了key和value的指针,next 指向下一个 dictEntry。


key 是字符串,但是 Redis 没有直接使用 C 的字符数组,而是存储在redis自定义的 SDS中。


value 既不是直接作为字符串存储,也不是直接存储在 SDS 中,而是存储在redisObject 中。


实际上五种常用的数据类型的任何一种,都是通过 redisObject 来存储的。

看看类型
type hello
String
看看编码
Object encoding hello
embstr


redisObject结构的作用


为了便于操作,Redis采用redisObjec结构来统一五种不同的数据类型,这样所有的数据类型就都可以以相同的形式在函数间传递而不用使用特定的类型结构。同时,为了识别不同的数据类型,redisObjec中定义了type和encoding字段对不同的数据类型加以区别。简单地说,redisObjec就是string、hash、list、set、zset的父类,可以在函数间传递时隐藏具体的类型信息,所以作者抽象了redisObjec结构来到达同样的目的。


RedisObject各个字段的含义


1 4位的type表示具体的数据类型


2 4位的encoding表示该类型的物理编码方式见下表,同一种数据类型可能有不同的编码方式。


(比如String就提供了3种:int embstr raw)


3 lru字段表示当内存超限时采用LRU算法清除内存中的对象。


4 refcount表示对象的引用计数。


5 ptr指针指向真正的底层数据结构的指针。

例如


set age 17

type 类型
encoding 编码,此处是数字类型
lru 最近被访问的时间
refcount 等于1,表示当前对象被引用的次数
ptr value值是多少,当前就是17


Redis系列-13.Redis经典五大类型源码及底层实现(一)(中):https://developer.aliyun.com/article/1414744

相关实践学习
基于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
目录
相关文章
|
18天前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
29天前
|
消息中间件 存储 监控
redis 的List类型 实现 排行榜
【10月更文挑战第8天】
36 2
|
29天前
|
存储 NoSQL Redis
redis-set类型
【10月更文挑战第6天】
36 1
|
1月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
25 3
|
1月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
27 2
|
18天前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
1月前
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
129 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
6天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
7天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构