string
字符串、数字,一些简单的k-v数据list
数组、集合,简单消息队列(缺点很多,比如不能重复消费,不能多订阅,无"消息持久化",无确认机制)hash
储存对象set
不可重复数据、做交并集的数据zset
排序的不可重复数据,比如 一个直播间的礼物排行榜
noeviction
:当内存不足以容纳新写入数据时,新写入操作会报错。allkeys-lru
:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。allkeys-random
:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。volatile-lru
:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。volatile-random
:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。volatile-ttl
:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
执行 BGREWRITEAOF 命令,对AOF文件重写
Redis 使用跳表的原因
Redis 在实现有序集合(ZSet)时,使用的是跳表(SkipList),而没有选择红黑树或 B+ 树。
- 实现简单:跳表的结构相对简单,使用多级索引进行加速。虽然在理想情况下,它的时间复杂度和红黑树相同,都是 O(log n),但跳表的实现代码简单且直观,插入和删除也较为轻量级。
- 支持区间查询:Redis 使用的跳表结构特别适合范围查询,跳表允许快速的从某个节点开始进行逐步遍历,非常适合 Redis 中经常需要的范围查询操作(如查找某个分数范围内的所有元素)。
- 顺序性:跳表天然是有序的,Redis 的有序集合要求能够对元素按照分数进行排序并保持有序,这一要求跳表可以很好地满足。
- 红黑树的复杂性:红黑树的实现虽然也能保证 O(log n) 的时间复杂度,但插入、删除和调整平衡的逻辑相对复杂,特别是在 Redis 这种高性能、实时要求的系统中,代码简洁和可维护性很重要。跳表在处理区间查询时的遍历逻辑比红黑树更直观。
- 区间操作性能:红黑树虽然可以通过中序遍历实现区间查询,但性能和跳表相比,略显不足。跳表从某个节点可以直接开始线性扫描,而红黑树需要从根节点逐步找到起始点,跳表在这方面有天然优势。
- B+ 树适合磁盘存储:和 HashMap 类似,B+ 树在内存中的查找效率并不如跳表。B+ 树的节点结构复杂,维护成本高,且 Redis 是基于内存的数据库系统,不需要像 B+ 树那样通过层次结构优化磁盘 I/O。
- Redis 的简单高效设计理念:Redis 追求的是极简和高效,而跳表比 B+ 树的实现简单,操作也更加高效。
总结:
- Redis 选择跳表:跳表的实现简单,支持快速区间查询,非常适合 Redis 中有序集合的场景需求。相比红黑树,跳表在遍历和范围查询中表现更优,而相比 B+ 树,跳表的内存使用更加轻量级,更加适合 Redis 的内存结构。