大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Redis 提供的5种基本数据结构类型和4种特殊类型,除此之外,还有8种底层数据结构,每种结构类型有其特点和适用场景。
二进制安全的核心是:将数据视为纯字节流,不做额外解释或处理。在 Redis 和其他支持二进制安全的工具中,这种特性使得它们能够高效存储和处理多样化的数据类型,确保数据的完整性和兼容性。
可以缓存各种信息(字符串、图片、视频等),存储在 Redis 中作为缓存,减轻持久层的读写压力;或者将 session 存储在 Redis 中用于共享。
存储键值对:
获取键值对:
删除与设置过期时间:
Redis 是单线程模型,命令只能逐个执行,不会出现并发问题导致计数错误。例如,可用于统计文章阅读量。
在分布式系统中可以保证生成的序列号唯一。
SET NX EX 是现代 Redis 分布式锁的推荐实现方式。
1. 使用 SETNX 命令 + EXPIRE 命令
过程:
问题:
状态:
2. 使用 SET NX EX 命令
优点:
ziplist(压缩列表):
hashtable(哈希表):
通过这两种实现方式,Redis 平衡了内存使用和性能,适应不同数据规模的需求。
切换条件 Redis 在以下情况下,自动将 Hash 的底层存储从 ziplist 切换为 hashtable:
以上两个参数可以通过 Redis 配置文件进行调整,以适应具体业务场景。
总结
1. LPUSH + LPOP = Stack (栈)
2. LPUSH + RPOP = Queue(队列)
3. LPUSH + LTRIM = Capped Collection(有限集合)
4. LPUSH + BRPOP = Message Queue(消息队列)
Redis 根据集合中元素的数量和类型,自动在 intset 和 hashtable 之间切换:
底层实现:
当满足以下两个条件时,Redis 会使用 ziplist来实现 ZSET:
元素数量小于 128:如果集合中存储的元素较少,使用 ziplist 更加高效。它通过压缩数据来节省内存。
每个元素的长度小于 64 字节:如果每个元素的长度较短(例如,成员字符串很短),那么 ziplist 的压缩效率就很高。
ziplist 的结构:在 ziplist 中,ZSET 的成员和分数(score)是交替存储的,数据压缩非常紧凑。
当 ZSET 的元素数量超过一定的阈值(例如超过 128 个元素),或者单个元素的长度较长时,Redis 会自动使用 skiplist(跳跃链表)和哈希表(Hash Table)的组合 来实现 ZSET。这是 Redis ZSET 中的默认数据结构。
zskiplist(跳跃表):
zskiplist 和 hashtable 的组合
为什么需要组合两种结构:
两者协同工作:
优势分析
Redis 对用户暴露的基本类型 Value Type(如字符串、哈希、列表等)实际是通过底层多种高效数据结构实现的。这些数据结构在性能、内存占用、以及适用场景上各有特点,以下为详细介绍: Redis 的 Value Type 基于以下底层数据结构实现:
以下是 Redis 的 8 种底层数据结构及其用途汇总:
Redis 的灵活实现结合了不同数据结构的优点,针对不同场景优化性能与内存占用。
在 Redis 中,redisObject 是一个核心的数据结构,主要用于衔接 Redis 的 Value Type(数据类型) 和 底层存储实现。每个 Redis 中的 Key 和 Value 实际上都是一个 redisObject 实例。
redisObject 的结构 redisObject 的主要结构如下:
redisObject 的关键字段
type(数据类型):
encoding(底层实现编码):
lru(最近访问时间):
refcount(引用计数):
ptr(指针):
redisObject 的作用
连接 Value Type 和底层实现:
内存管理:
提高灵活性:
您需要 登录 才可以下载或查看,没有账号?立即注册
使用道具 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
特级红客
2 小时前
昨天 23:39
昨天 23:38
昨天 23:35
昨天 18:07
中国红客联盟公众号
联系站长QQ:5520533