写在前面
小牛之前出了八股文背诵版系列,不少朋友问我,能不能搞个八股文精讲,把面试问题讲讲透,于是系列就这样诞生了。咱们第一期先聊聊Redis。
阿里面试:简述Redis链表实现
链表,我感觉学过编程的小伙伴都知道。
但遗憾的是,我前两天逛牛客网,有个阿里面试官问:来,讲讲Redis的链表。
额,不好意思我没看过。。。。
为了避免这种尴尬的情形发生,我写了这篇博文,争取让大家20秒能掌握和面试官谈笑风生redis链表的能力。
首先明确一点,redis的链表是双向链表,所以链表结构的节点定义极其清晰
- typedef struct listNode {
- struct listNode * prev;//前置节点
- struct listNode * next;//后置节点
- void * value;//节点数值
- } listNode;
说实话,有这么一个结构,已经够大家写双向链表的所有操作了。
但Redis还是比较贴心的,它在listNode这一数据结构上,又封装了一个数据结构list,方便程序员开发调用。
- typedef struct list {
- listNode * head;//链表头
- listNode * tail;//链表尾
- unsigned long len;//链表长度
- void *(*dup) (void *ptr); //节点值复制函数
- void (*free) (void *ptr); //节点值释放函数
- void (*match)(void *ptr,void *key); //节点值对比函数
- }
注意,其封装的dup,free 和match均是针对节点的函数,而不是针对整个链表而言的。
Redis也提供了相关函数,给大家使用,比如链表的增加节点,删除节点,等等就不用咱写了,不然有小伙伴自己手写写错了还可能搞个循环链表出来。列几个用的多的函数给大家参考吧。
- lpush:向链表左边增加元素
- rpush:向链表右边增加元素
- lpop: 弹出左侧第一个元素
- rpop:弹出右侧第一个元素
- llen: 获得链表长度
- lrange:按索引范围获得值
参考
- 《Redis源码剖析与实战》
- 《Redis的设计与实现》
- https://www.jianshu.com/p/624ed78852f7