JavaJVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

Redis中的对象

2020-07-05  本文已影响0人  熊聘

Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是typeencodingptr

typedef struct redisObject {
    unsigned type:4; // 类型
    unsigned encoding:4;// 编码
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;
    void *ptr;// 指向底层实现数据结构的指针
} robj;

1. 类型

Redis一共有5种类型,其中键值总是一个字符串对象,而可以是5中类型中的任意一种。可以通过TYPE命令来查看对应的的类型

# 键为字符串对象,值为字符串对象
redis> SET msg "hello world"
OK
redis> TYPE msg
string
# 键为字符串对象,值为列表对象
redis> RPUSH numbers 1 3 5
(integer)6
redis> TYPE numbers
list
不同类型值对象的TYPE命令输出
对象类型 对象type属性值 TYPE命令的输出
字符串 REDIS_STRING "string"
列表 REDIS_LIST "list"
哈希 REDIS_HASH "hash"
集合 REDIS_SET "set"
有序集合 REDIS_ZSET "zset"

2. 编码

对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定

redis> SET msg "hello world"
OK
redis> OBJECT ENCODING msg
"embstr" // msg为embstr类型
redis> SET story "long long long long long long long ago ..."
OK
redis> OBJECT ENCODING msg
"raw" // msg从embstr类型变成raw类型
redis> SADD numbers 1 3 5
(integer)3
redis> OBJECT ENCODING numbers
"intset" // numbers为intset类型
redis> SADD numbers "seven"
(integer)1
redis> OBJECT ENCODING numbers
"hashtable" // numbers从intset类型变成hashtable类型
不同类型和编码的对象
类型 编码常量 底层数据结构
REDIS_STRING REDIS_ENCODING_INT 整数
REDIS_STRING REDIS_ENCODING_IEMBSTR embstr编码的简单动态字符串
REDIS_STRING REDIS_ENCODING_RAW 简单动态字符串
REDIS_LIST REDIS_ENCODING_ZIPLIST 压缩列表
REDIS_LIST REDIS_ENCODING_LINKEDLIST 双端链表
REDIS_HASH REDIS_ENCODING_ZIPLIST 压缩列表
REDIS_HASH REDIS_ENCODING_HT 字典
REDIS_SET REDIS_ENCODING_INTSET 整数集合
REDIS_SET REDIS_ENCODING_HT 字典
REDIS_ZSET REDIS_ENCODING_ZIPLIST 压缩列表
REDIS_ZSET REDIS_ENCODING_SKIPLIST 跳跃表
OBJECT ENCODING对不同类型编码的输出
编码常量 OBJECT ENCODING命令输出
REDIS_ENCODING_INT "int"
REDIS_ENCODING_IEMBSTR "embstr"
REDIS_ENCODING_RAW "raw"
REDIS_ENCODING_HT "hashtable"
REDIS_ENCODING_LINKEDLIST "linkedlist"
REDIS_ENCODING_ZIPLIST "ziplist"
REDIS_ENCODING_INTSET "intset"
REDIS_ENCODING_SKIPLIST "skiplist"

3. 对象底层数据结构

在Redis中为了节省空间,对象的编码是会发生转化,底层的数据结构也会随着发生变化。

4. 对象类型检查、回收、共享和空转时长

相关知识点

上一篇下一篇

猜你喜欢

热点阅读