前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Redis】RedisObject 对象

【Redis】RedisObject 对象

作者头像
石臻臻的杂货铺[同名公众号]
发布2021-07-14 10:07:37
4940
发布2021-07-14 10:07:37
举报
文章被收录于专栏:kafka专栏

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

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

  • redisObject 对象。
  • 基于 redisObject 对象的类型检查。
  • 基于 redisObject 对象的显式多态函数。
  • 对 redisObject 进行分配、共享和销毁的机制。

RedisObject

代码语言:javascript
复制
/*
 * 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 会预分配一些常用的数据对象,并通过共享这些对象来减少内存占用,和避免频繁地为小对象分配内存

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RedisObject
  • 命令的类型检查和多态
  • 对象共享
  • 引用计数以及对象的销毁
  • 总结
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档