乐趣区

关于负载均衡:Redis数据结构必知必会

我是非典型文科男号主。关注后你能够播种 最硬核的常识分享,最乏味的互联网故事

Redis 数据结构

Redis 在互联网实际中被宽泛应用。一方面是内存存储以及高效的内存治理保障了数据高效读写。另一方面高效的 IO 模型使得 Redis 单机就能够扛住 10W/ 秒的读申请。

除了这些之外,Redis 反对丰盛的数据结构并且每个数据结构都通过了极致的优化。这些个性推动了 Redis 在互联网畛域开花结果。

作为一名资深的研发工程师,不仅须要晓得 Redis 反对五种根本数据类型,还须要把握不同编码具体实现和相干优化以及不同数据类型在实践中的利用。

因为相干内容泛滥,我将分两篇文章介绍相干内容。

你将从这篇文章获取 Redis 对象以及相干形成、五种根本类型和六种编码方式、不同类型应用场景和相干的 Redis 命令。

下一篇文章,将具体介绍每种数据结构的具体实现细节。你讲理解到 SDS、空间预调配和惰性删除、渐进式 rehash 技术、阻塞队列、跳跃表等。

注:所有源代码来源于 redis-6.2.4 版本,点击 redis relase 列表下载对应的源码版本。

Redis 外围对象简介

在 Redis 有一个「外围对象」叫做 redisObject。redisObject 是 Redis 定义的数据结构,用它在示意所有的 key 和 value。

redisObject 定义在 server.h 文件中,具体定义如下:

typedef struct redisObject {
    // 数据类型
    unsigned type:4;
    //  lru 时钟批改后,2 位的对齐位(unsigned notused:2),在新版本曾经去掉;
    // 数据编码
    unsigned encoding:4;
    // LRU 工夫(全局 lru 时钟绝对工夫或者 8 位常常用到或者 16 位拜访工夫)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;

三属性

type、encoding 和 ptr 是最重要的三个属性。

type 示意 Redis 对象的类型,redis 反对五种数据类型。别离为:

/*-----------------------------------------------------------------------------
 * Data types
 *----------------------------------------------------------------------------*/

/* A redis object, that is a type able to hold a string / list / set */

/* The actual Redis Object */
#define OBJ_STRING 0    /* String object. */
#define OBJ_LIST 1      /* List object. */
#define OBJ_SET 2       /* Set object. */
#define OBJ_ZSET 3      /* Sorted set object. */
#define OBJ_HASH 4      /* Hash object. */

encoding 示意对象的编码方式,encoding 示意理论存储的数据结构。redis 最新版本反对 11 种数据编码。别离为:

/* Objects encoding. Some kind of objects like Strings and Hashes can be
 * internally represented in multiple ways. The 'encoding' field of the object
 * is set to one of this fields for this object. */
#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 */
#define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */

对象能够以多种形式编码:
字符串能够被编码为 raw (个别字符串)或 int (用字符串示意 64 位数字是为了节约空间)。
列表能够被编码为 ziplist 或 linkedlist。ziplist 是为节约大小较小的列表空间而作的非凡示意。
汇合能够被编码为 intset 或者 hashtable。intset 是只贮存数字的小汇合的非凡示意。
哈希表能够编码为 zipmap 或者 hashtable。zipmap 是小哈希表的非凡示意。
有序汇合能够被编码为 ziplist 或者 skiplist 格局。ziplist 用于示意小的有序汇合,而 skiplist 则用于示意任何大小的有序汇合。

ptr 是理论存储构造体的内存指针。

下图展现了 redisObject、Redis 所有数据类型、以及 Redis 所有编码方式(底层实现)三者之间的关系:

通过命令窥看 redisObject

能够通过 objectkey 命令窥看 redisObject 绝对应的属性。

OBJECT 命令

OBJECT subcommand [arguments [arguments]]

OBJECT 命令容许从外部观察给定 key 的 Redis 对象。

它通常用在除错 (debugging) 或者理解 key 对应的编码状况。

罕用的 SUBCOMMAND 如下:

OBJECT REFCOUNT <key> 返回给定 key 援用所贮存的值的次数。此命令次要用于除错。OBJECT ENCODING <key> 返回给定 key 锁贮存的值所应用的外部示意(representation)。OBJECT IDLETIME <key> 返回给定 key 自贮存以来的空转工夫(idle,没有被读取也没有被写入),以秒为单位。

TYPE 命令

type 命令用户返回 value 值的类型。

返回值:

none (key 不存在)
string (字符串)
list (列表)
set (汇合)
zset (有序集)
hash (哈希表)
![](/img/bVcSBJl)
![](/img/bVcSBJm)
<center>
  
[什么是架构设计?架构设计看这篇文章就够了](https://mp.weixin.qq.com/s?__biz=MzIzNDUwMzkwNg==&mid=2247483734&idx=1&sn=bd3b956f88d7f51fc04a3f66a51713a9&chksm=e8f42adbdf83a3cd949b56cbb94462dedcef5f473c4f48582c438b2f36383d426cdc6938b013&scene=21#wechat_redirect)

[Redis 为什么这么快?](https://mp.weixin.qq.com/s?__biz=MzIzNDUwMzkwNg==&mid=2247483721&idx=1&sn=24b191b3d69487d056ad0717daab6400&chksm=e8f42ac4df83a3d2b1b3c54612c5460be60f51fc97c088c73969312045ee2c43365595bc3f1d&scene=21&token=322415904&lang=zh_CN#wechat_redirect)

[重磅:解读 2020 年最新 JVM 生态报告](https://mp.weixin.qq.com/s?__biz=MzIzNDUwMzkwNg==&mid=2247483706&idx=1&sn=625eab1339bcfafcac207e29f79fbdab&chksm=e8f42ab7df83a3a10e803eec3106c3e4c7297a952885f22e6b2e751fbe1c92789a9bab51d2e7&scene=21#wechat_redirect)

[BIO,NIO,AIO 总结](https://mp.weixin.qq.com/s?__biz=MzIzNDUwMzkwNg==&mid=2247483712&idx=1&sn=feabc22cbe7b51532ec13b6e22e7cf8c&chksm=e8f42acddf83a3db2b24752552fb0e46d05176e1e00d11e8db7b15cd6e1e34844e2cc01c5b1b&scene=21#wechat_redirect)

[JDK8 的新个性,你晓得多少?](https://mp.weixin.qq.com/s?__biz=MzIzNDUwMzkwNg==&mid=2247483704&idx=1&sn=527990343f8ef0402febe2dc7e9e0ff3&chksm=e8f42ab5df83a3a3775ddc302f0f5facdbec38229e4067a51ed42f9cce874ea2fc9832a6ea01&scene=21#wechat_redirect)

回复“材料”,收费获取 一份独家呕心整顿的技术材料!</center>

![](/img/bVcSBJn)
退出移动版