Redis 跳表结构
- 跳表结构在Redis中主要有两个用途: (1) 实现有序集合键 (2) 在集群结点中用作内部数据结构
- 跳表的数据结构由zskiplistNode和zskiplist构成
zskiplist 存储着跳表的头结点、尾结点、跳表长度和跳表最大层数 - zskiplistNode作为构成跳表的结点,每个zskiplistNode都有这些属性:层(层中又包含着前进指针和跨度)、后退指针、成员对象和分值
- 每个跳表结点的层高都是1到32之间的随机数。每个结点的前进指针会指向队尾方向具有相同层的最近结点,因此通过随机层高能够实现比O(n)更快的结点访问速度
- 在同一个跳跃表中,多个结点的分值可以相同,但是成员对象必须是唯一的
- 跳跃表中的结点按照分值大小排序,相同分值的结点按照成员对象大小排序(字典序)
Redis为什么是线程安全的?
- 网络请求模块为单线程程序,所以线程安全。注:Redis的其他模块还是会使用多线程的
- 虽然网络请求为单线程,但是使用了IO多路复用和非阻塞IO, 内部实现采用epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件。
5种I/O模型详解,包括IO多路复用
|