面试官:简述 Redis 链表实现

存储 Redis
Redis也提供了相关函数,给大家使用,比如链表的增加节点,删除节点,等等就不用咱写了,不然有小伙伴自己手写写错了还可能搞个循环链表出来。

[[432725]]

写在前面

小牛之前出了八股文背诵版系列,不少朋友问我,能不能搞个八股文精讲,把面试问题讲讲透,于是系列就这样诞生了。咱们第一期先聊聊Redis。

阿里面试:简述Redis链表实现

链表,我感觉学过编程的小伙伴都知道。

但遗憾的是,我前两天逛牛客网,有个阿里面试官问:来,讲讲Redis的链表。

额,不好意思我没看过。。。。

为了避免这种尴尬的情形发生,我写了这篇博文,争取让大家20秒能掌握和面试官谈笑风生redis链表的能力。

首先明确一点,redis的链表是双向链表,所以链表结构的节点定义极其清晰

  1. typedef struct listNode { 
  2.      
  3.     struct listNode * prev;//前置节点 
  4.      
  5.     struct listNode * next;//后置节点 
  6.      
  7.     void * value;//节点数值 
  8. } listNode; 

说实话,有这么一个结构,已经够大家写双向链表的所有操作了。

但Redis还是比较贴心的,它在listNode这一数据结构上,又封装了一个数据结构list,方便程序员开发调用。

  1. typedef struct list { 
  2.  
  3.     listNode * head;//链表头 
  4.  
  5.     listNode * tail;//链表尾 
  6.  
  7.     unsigned long len;//链表长度 
  8.  
  9.     void *(*dup) (void *ptr); //节点值复制函数 
  10.  
  11.     void (*free) (void *ptr); //节点值释放函数 
  12.  
  13.     void (*match)(void *ptr,void *key); //节点值对比函数 

注意,其封装的dup,free 和match均是针对节点的函数,而不是针对整个链表而言的。

Redis也提供了相关函数,给大家使用,比如链表的增加节点,删除节点,等等就不用咱写了,不然有小伙伴自己手写写错了还可能搞个循环链表出来。列几个用的多的函数给大家参考吧。

  • lpush:向链表左边增加元素
  • rpush:向链表右边增加元素
  • lpop: 弹出左侧第一个元素
  • rpop:弹出右侧第一个元素
  • llen: 获得链表长度
  • lrange:按索引范围获得值

参考

 

  • 《Redis源码剖析与实战》
  • 《Redis的设计与实现》
  • https://www.jianshu.com/p/624ed78852f7

 

责任编辑:武晓燕 来源: 后端技术小牛说
相关推荐

2024-10-22 16:39:07

2024-04-09 10:40:04

2021-01-06 05:36:25

拉链表数仓数据

2024-04-03 00:00:00

Redis集群代码

2024-09-11 22:51:19

线程通讯Object

2020-12-09 10:29:53

SSH加密数据安全

2023-11-20 10:09:59

2022-08-11 18:27:50

面试Redis分布式锁

2024-03-05 10:33:39

AOPSpring编程

2024-08-22 10:39:50

@Async注解代理

2024-02-20 14:10:55

系统缓存冗余

2024-02-28 10:14:47

Redis数据硬盘

2022-07-06 13:48:24

RedisSentinel机制

2019-06-21 15:20:05

Redis数据结构数据库

2024-08-12 17:36:54

2024-08-29 16:30:27

2024-02-29 16:49:20

volatileJava并发编程

2024-01-26 13:16:00

RabbitMQ延迟队列docker

2024-01-19 14:03:59

Redis缓存系统Spring

2020-07-02 07:52:11

RedisHash映射
点赞
收藏

51CTO技术栈公众号