写在前面: 众所周知 现在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;
- 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是否过期