贝利信息

Redis类型type与编码encoding原理及使用方法是什么

日期:2023-05-29 00:00 / 作者:王林

摘要

redis是一款开源的高性能key-value数据库,广泛应用于各种场景。在redis中,数据类型(type)和编码(encoding) 是非常重要的概念。本篇博客将详细介绍redis支持的数据类型以及相应的编码方式和底层实现原理。

要查看Redis某个key的内部编码,可以使用Redis命令OBJECT ENCODING key。其中,key是你想要查询的键名。例如,如果你想要查询名为mykey的键的内部编码,可以执行以下命令:

127.0.0.1:6379youjiankuohaophpcn object encoding mykey  // 查看某个Redis键值的编码

redisObject

在 Redis 中,redisObject 是 Redis 中最基本的数据结构之一。redisObject 用于表示 Redis 中的键值对中的值,它可以是字符串、整数、列表、哈希表等任意一种 Redis 数据类型。

redisObject 的定义如下:

typedef struct redisObject {

    // 类型
    unsigned type:4;

    // 编码方式
    unsigned encoding:4;

    // 引用计数
    int refcount;

    // 指向实际值的指针
    void *ptr;

} robj;

Redis源码encoding取值有如下几种:

#define OBJ_ENCODING_RAW 0        /* Raw representation */
#define OBJ_ENCODING_INT 1        /* Encoded as integer */
#define OBJ_ENCODING_HT 2         /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3     /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5    /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6     /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7   /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8     /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9  /* Encoded as linked list of ziplists */

类型与编码介绍

Redis支持五种主要的数据类型:字符串(string)、列表(list)、集合(set)、有序集合(sorted set)和哈希(hash)。每种数据类型都有对应的编码方式。

数据类型与编码方式总览如下:

数据类型 编码方式
字符串 int、embstr、raw
哈希表 ziplist、hashtable
列表 ziplist、linkedlist、quicklist
集合 intset、hashtable
有序集合 ziplist、skiplist

字符串

字符串是Redis中最基本的数据类型,通常用于存储文本或二进制数据。Redis支持两种编码方式:

列表

列表是一系列有序的字符串集合,可以添加、修改和删除元素。Redis支持三种编码方式:

集合

集合是一系列无序的字符串集合,支持添加、删除和查询元素。Redis支持两种编码方式:

有序集合

无序的字符串集合会被赋予一个分数,这样它们就可以按照分数排序,并形成一个有序的集合。Redis支持两种编码方式:

哈希表

哈希表是一系列键值对集合,每个键关联一个值。Redis支持两种编码方式:

类型与编码底层原理

了解Redis支持的数据类型和编码方式后,我们来看一下它们的底层实现原理。

编码转换

在Redis中每个键值对都带有一个类型标识,用于表明该键值对所存储的数据类型。当我们对一个键进行操作时,Redis会根据该键当前的编码方式以及操作所需的编码方式,对键值对进行编码转换。

例如,当我们向一个字符串中追加内容时,如果该字符串当前的编码方式为raw,但是新的内容可以使用embstr编码方式存储,那么Redis会将该字符串的编码方式从raw转换为embstr。

数据结构

Redis利用多种经典的数据结构实现各种数据类型,不仅限于编码方式。例如,Redis的列表和哈希表都是采用链表结构实现的。跳跃表(Skip List)是有序集合所采用的一种高效数据结构。

这些数据结构都经过了精心设计和优化,以满足各种场景下的应用需求。举例来说,链表结构适用于需要频繁地增加和删除元素的情况,而跳跃表结构则更适合于排序和查找操作。