【Redis】RedisObject 对象

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Redis】RedisObject 对象

在前面介绍各个底层数据结构时有提到, Redis 的每一种数据类型,比如字符串、列表、有序集, 它们都拥有不只一种底层实现(Redis 内部称之为编码,encoding), 这说明, 每当对某种数据类型的键进行操作时, 程序都必须根据键所采取的编码, 进行不同的操作。


Redis 构建了自己的类型系统, 这个系统的主要功能包括:


redisObject 对象。

基于 redisObject 对象的类型检查。

基于 redisObject 对象的显式多态函数。

对 redisObject 进行分配、共享和销毁的机制。

RedisObject

/*
 * Redis 对象
 */
typedef struct redisObject {
    // 类型 记录了对象所保存的值的类型
    unsigned type:4;
    // 对齐位
    unsigned notused:2;
    // 编码方式 记录了对象所保存的值的编码
    unsigned encoding:4;
    // LRU 时间 键的空转时间
    unsigned lru:22;
    // 引用计数
    int refcount;
    // 指向对象的值    是一个指针,指向实际保存值的数据结构,这个数据结构由 type 属性和 encoding 属性决定。
    void *ptr;
} robj;

命令的类型检查和多态

有了 redisObject 结构的存在, 在执行处理数据类型的命令时, 进行类型检查和对编码进行多态操作就简单得多了。


当执行一个处理数据类型的命令时, Redis 执行以下步骤:


根据给定 key ,在数据库字典中查找和它相对应的 redisObject ,如果没找到,就返回 NULL 。

检查 redisObject 的 type 属性和执行命令所需的类型是否相符,如果不相符,返回类型错误。

根据 redisObject 的 encoding 属性所指定的编码,选择合适的操作函数来处理底层的数据结构。

返回数据结构的操作结果作为命令的返回值。


对象共享

Redis 预分配的值对象有如下这些:


各种命令的返回值,比如执行成功时返回的 OK ,执行错误时返回的 ERROR ,类型错误时返回的 WRONGTYPE ,命令入队事务时返回的 QUEUED ,等等。

包括 0 在内,小于 redis.h/REDIS_SHARED_INTEGERS 的所有整数(REDIS_SHARED_INTEGERS 的默认值为 10000)

因为命令的回复值直接返回给客户端, 所以它们的值无须进行共享; 另一方面, 如果某个命令的输入值是一个小于 REDIS_SHARED_INTEGERS 的整数对象, 那么当这个对象要被保存进数据库时, Redis 就会释放原来的值, 并将值的指针指向共享对象


共享对象只能被带指针的数据结构使用。

需要提醒的一点是, 共享对象只能被字典和双端链表这类能带有指针的数据结构使用。


像整数集合和压缩列表这些只能保存字符串、整数等字面值的内存数据结构, 就不能使用共享对象。


引用计数以及对象的销毁

总结

Redis 使用自己实现的对象机制来实现类型判断、命令多态和基于引用计数的垃圾回收。

一种 Redis 类型的键可以有多种底层实现。

Redis 会预分配一些常用的数据对象,并通过共享这些对象来减少内存占用,和避免频繁地为小对象分配内存


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
86 1
|
2月前
|
存储 消息中间件 NoSQL
Redis 数据结构与对象
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求和数据特点来选择合适的数据结构,并合理地设计数据模型,以充分发挥 Redis 的优势。
60 8
|
2月前
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
47 2
|
2月前
|
存储 NoSQL Redis
redis保存数据的结构-redisobject结构体
`redisObject`结构体是Redis内部数据组织的核心,它通过集成类型标识、引用计数和编码方式等关键信息,实现了数据的高效管理和访问。这种设计允许Redis根据数据的实际需求动态调整存储结构,既保证了内存使用的高效性,也确保了数据操作的灵活性和速度。通过对 `redisObject`的深入了解,可以更好地掌握Redis如何在内存中高效存储和操作数据,进而优化数据库的性能和资源利用。
31 0
|
7月前
|
存储 缓存 NoSQL
深入浅出Redis(一):对象与数据结构
深入浅出Redis(一):对象与数据结构
|
7月前
|
存储 NoSQL 网络协议
redis主从同步对象模型学习笔记
redis主从同步对象模型学习笔记
81 0
|
5月前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
6月前
|
缓存 NoSQL Java
redis系列之------对象
redis系列之------对象
|
7月前
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-RedisObject
Redis入门到通关之数据结构解析-RedisObject
109 1
|
7月前
|
缓存 NoSQL Java
Spring Data Redis对象缓存序列化问题
在使用 Redis 时,有没有遇到同我一样,对象缓存序列化问题的呢?
140 6
Spring Data Redis对象缓存序列化问题