redis 中 zset 的数据存储方式

zset 是 redis 的一种数据存储方式,所存储的数据是有序的、唯一的。zset由两种存储方式转换对数据进行存储,分别是 ziplist(压缩表)和 skiplist(跳表)。

当成员数量 <= zset-max-ziplist-entries(默认128)值并且成员长度 <= zset-max-ziplist-value(默认64)值时,采用压缩表的方式存储,压缩表是一个升级的数组,每一个位置除了保存数据外,还包含了数组长度、数组首位元素的元信息,这样就可以快速定位到数组的首尾节点。

当不满足上述任何一个条件时,zset的存储方式由 ziplist 转为 skiplist 。skiplist是以链表的方式顺序存储,在该模式下,skiplist 搭配 Hash Table(哈希表)一起使用,通过搭配哈希表实现快速访问单个成员、保证成员唯一性、数据有序、范围查询等功能,skiplist 天然的数据结构保证数据有序,同时还能实现范围查询;哈希表实现快速访问(通过链表访问数据的话,需要逐个查询,而哈希表通过映射链表的值,可以实现O(1)复杂度访问成员)。

双存储方式的转换,能够极大地提高数据存取效率,在数据内存较小的情况下以数组的方式存储,数组占用内存紧凑,数据读取方便,数据的操作造成的性能影响也可以接受;当数据内存大的时候,如果继续采用数组的方式,数据操作的效率就会不断降低,转为跳表的存储方式,牺牲内存换取高效查询和范围操作。

zset 的存储方式初始是 ziplist 形式,当转为 skiplist 形式后将一直持续以该方法存储。

相关推荐
会敲键盘的猕猴桃很大胆5 小时前
Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】
java·redis·分布式·spring·lua
喝养乐多长不高9 小时前
深入探讨redis:主从复制
数据库·redis·缓存·主从模式·主从复制·全量复制·部分复制
怡人蝶梦10 小时前
Spring Boot启动慢?Redis缓存击穿?Kafka消费堆积?——Java后端常见问题排查实战
java·jvm·redis·kafka·springboot·prometheus·microservices
纪元A梦11 小时前
Redis最佳实践——安全与稳定性保障之数据持久化详解
数据库·redis·安全
夜影风11 小时前
Redis持久化机制
数据库·redis·缓存
Zfox_11 小时前
Redis:功能特性和应用场景
服务器·数据库·redis·缓存·微服务
bing_15812 小时前
当 Redis 作为缓存使用时,如何保证缓存数据与数据库(或其他服务的数据源)之间的一致性?
数据库·redis·缓存
JAdroid14 小时前
spring-boot redis lua脚本实现滑动窗口限流
数据库·spring boot·redis·spring·lua·redisson
Code哈哈笑14 小时前
【基于SpringBoot的图书购买系统】Redis中的数据以分页的形式展示:从配置到前后端交互的完整实现
java·spring boot·redis·后端·spring·交互