redis数据类型

对象处理机制

在 Redis 的命令中,用于对键(key)进行处理的命令占了很大一部分,而对于键所保存的值的
类型(后简称“键的类型” ),键能执行的命令又各不相同。
比如说,LPUSH 和 LLEN 只能用于列表键,而 SADD 和 SRANDMEMBER 只能用于集合
键,等等。
另外一些命令,比如 DEL 、TTL 和 TYPE ,可以用于任何类型的键,但是,要正确实现这些
命令,必须为不同类型的键设置不同的处理方式:比如说,删除一个列表键和删除一个字符串
键的操作过程就不太一样。
以上的描述说明,Redis 必须让每个键都带有类型信息,使得程序可以检查键的类型,并为它
选择合适的处理方式。
另外,在前面介绍各个底层数据结构时有提到,Redis 的每一种数据类型,比如字符串、列表、
有序集,它们都拥有不只一种底层实现(Redis 内部称之为编码,encoding),这说明,每当对
某种数据类型的键进行操作时,程序都必须根据键所采取的编码,进行不同的操作。
比如说,集合类型就可以由字典和整数集合两种不同的数据结构实现,但是,当用户执行
ZADD 命令时,他/她应该不必关心集合使用的是什么编码,只要 Redis 能按照 ZADD 命令的
指示,将新元素添加到集合就可以了。
这说明,操作数据类型的命令除了要对键的类型进行检查之外,还需要根据数据类型的不同编
码进行多态处理。
对了解决上面的问题创建了自己的系统:
• redisObject 对象。
• 基于 redisObject 对象的类型检查。
• 基于 redisObject 对象的显式多态函数。
• 对 redisObject 进行分配、共享和销毁的机制。

/*
* Redis 对象
*/
typedef struct redisObject {
// 类型
unsigned type:4;
// 对齐位
unsigned notused:2;
// 编码方式
unsigned encoding:4;
// LRU 时间(相对于 server.lruclock)
unsigned lru:22;
// 引用计数
int refcount;
// 指向对象的值
void *ptr;
} robj;

redisObject
在这里插入图片描述
当执行一个处理数据类型的命令时,Redis 执行以下步骤:

  1. 根据给定 key ,在数据库字典中查找和它像对应的 redisObject ,如果没找到,就返回
    NULL 。
  2. 检查 redisObject 的 type 属性和执行命令所需的类型是否相符,如果不相符,返回类
    型错误。
  3. 根据 redisObject 的 encoding 属性所指定的编码,选择合适的操作函数来处理底层的
    数据结构。
  4. 返回数据结构的操作结果作为命令的返回值。
    作为例子,以上展示了对键 key 执行 LPOP 命令的完整过程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值