Redis基本数据类对应的底层数据结构大解析

写在前面: 众所周知 现在JAVA开发很内卷,玩转redis还不够,面试会经常被问redis底层C语言的数据结构,已经被问好几次了!是时候结束了

在Redis当中键值对是存储在DicEntry结构当中
在这里插入图片描述

  • Key:SDS,简单动态数组结构(已使用的长度,可以使用的长度,char[] )
  • Value: RedisObject
  • next指针
    接下来重要照顾一下redisObject
typedef struct redisObject {
    // 类型:string,list,hash,set,sorted set(5种基本类型)
    unsigned type:4;    
    // 不使用(对齐位)
    unsigned notused:2;
    // 编码方式
    unsigned encoding:4;
    // LRU 时间(相对于 server.lruclock)
    unsigned lru:22;
    // 引用计数
    int refcount;
    // 指向对象的值
    void *ptr;
} robj;

redis 底层数据结构

  • SDS
  • 双向链表:
  • 字典:哈市散列表
  • 跳跃表:如何确定跳表的高度 答案是随机的

    空间换时间效率的经典之作,在Redis中找到,使用了随机算法

/* Returns a random level for the new skiplist node we are going to create.
 * The return value of this function is between 1 and ZSKIPLIST_MAXLEVEL
 * (both inclusive), with a powerlaw-alike distribution where higher
 * levels are less likely to be returned. */
int zslRandomLevel(void) {
    int level = 1;
    while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))
        level += 1;
    return (level<ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL;
}
  • 整数集合
  • 压缩列表
关于redis的内存淘汰回收策略
  • 定时删除 expire time一到就立马删除 key很多的时候 会非常耗费服务性能CPU资源

  • 惰性删除 当Key被访问到时候才去检查是否过期 删除 如果很多key基本不会被访问就会导致大量的内存被占用

  • 定期删除 区别定时删除 就是隔一段时间才去 删除已经过期的key

  • 如果redis内存满了之后 如何清除过期key呢?

    LRU: 删除最近最近未被使用的key,有从加了过期时间里面筛选,有从所有key里面删选
    LFU:删除最近使用频率最低的key
    随机删除:不管是否最近使用和频率 一视同仁 随机删除

  • 思考:过期的key对于RDB和AOF持久化产生影响吗?

不会,在做数据恢复的时候 会检查key是否过期

Redis是一个开源的内存数据库,它使用了多种数据结构来存储不同型的数据。下面是几种常见的Redis底层数据结构的详解: 1. 字符串(String):字符串是Redis中最基本数据结构。它可以存储任意型的数据,包括数字、文本等。字符串在Redis中以字节数组的形式存储,可以通过键访问和修改。 2. 列表(List):列表是一个有序的字符串集合,可以在列表的两端进行插入、删除和获取操作。Redis使用双向链表来实现列表数据结构,它支持快速插入和删除操作。 3. 哈希(Hash):哈希是一种键值对的集合。在Redis中,哈希可以存储多个字段和对应的值,似于关联数组或者字典。哈希在内部使用哈希表来实现,可以快速查找和修改字段值。 4. 集合(Set):集合是一组唯一且无序的字符串集合。Redis使用哈希表来实现集合数据结构,它支持添加、删除和判断元素是否存在等操作。 5. 有序集合(Sorted Set):有序集合是一组唯一且有序的字符串集合。在Redis中,每个元素都会关联一个分数,通过分数可以对元素进行排序。有序集合的实现使用了跳跃表和哈希表两种数据结构,它支持添加、删除、修改和范围查询等操作。 这些数据结构底层实现都是高效的,并且支持丰富的操作。Redis数据结构灵活性较高,能够满足不同型的数据存储需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值