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

本文涉及的产品
云数据库 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
目录
相关文章
|
1天前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
7 1
|
1天前
|
监控 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(上)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
22 0
|
1天前
|
存储 NoSQL 调度
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(下)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
7 0
|
1天前
|
NoSQL 安全 Unix
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(中)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
14 0
|
1天前
|
存储 NoSQL API
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(上)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
15 1
|
1天前
|
NoSQL API Redis
Redis源码、面试指南(3)数据对象类型编码(下)
Redis源码、面试指南(3)数据对象类型编码
10 1
|
1天前
|
存储 NoSQL API
Redis源码、面试指南(3)数据对象类型编码(上)
Redis源码、面试指南(3)数据对象类型编码
16 2
|
1天前
|
存储 NoSQL 算法
Redis源码、面试指南(2)内存编码数据结构(下)
Redis源码、面试指南(2)内存编码数据结构
18 4
|
1天前
|
存储 NoSQL API
Redis源码、面试指南(2)内存编码数据结构(上)
Redis源码、面试指南(2)内存编码数据结构
13 0
|
1天前
|
存储 缓存 NoSQL
Redis源码(1)基本数据结构(下)
Redis源码(1)基本数据结构
9 1