Rumah  >  Artikel  >  pangkalan data  >  Apakah prinsip dan penggunaan jenis Redis dan pengekodan pengekodan?

Apakah prinsip dan penggunaan jenis Redis dan pengekodan pengekodan?

王林
王林ke hadapan
2023-05-29 16:21:03926semak imbas

    摘要

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

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

    127.0.0.1:6379> 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;
    • type:表示 redisObject 的类型。

    • encoding:表示 redisObject 的编码方式。

    • refcount:表示当前 redisObject 被引用的次数。

    • ptr: ptr字段则是一个指针,指向实际的 Redis 对象。

    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

    String

    String ialah jenis data paling asas dalam Redis, biasanya digunakan untuk menyimpan teks atau data binari. Redis menyokong dua kaedah pengekodan:

    • Dalam Redis, apabila rentetan boleh diwakili sebagai integer, ia akan ditukar kepada integer dan disimpan menggunakan pengekodan int. Kelebihan pengekodan int ialah ruang storan yang kecil dan kecekapan operasi yang tinggi. Kelemahannya ialah ia hanya boleh menyimpan integer dan tidak menyokong operasi rentetan.

    • embstr (rentetan berkod embstr): Simpan rentetan panjang kurang daripada 44 bait Apabila rentetan agak pendek, gunakan kaedah pengekodan ini untuk menyimpannya Kurangkan penggunaan memori.

    • raw(raw-encoded string): Simpan rentetan dengan panjang lebih daripada 44 bait Apabila rentetan agak panjang, gunakan kaedah pengekodan ini untuk menyimpan ia.

    Senarai

    Senarai ialah koleksi rentetan yang tersusun di mana elemen boleh ditambah, diubah suai dan dipadamkan. Redis menyokong tiga kaedah pengekodan:

    • ziplist: Sebelum versi Redis 3.2, apabila panjang setiap rentetan dalam Senarai adalah kurang daripada 64 bait dan panjang rentetan dalam Senarai ialah Apabila bilangan elemen kurang daripada 512 , objek Senarai menggunakan pengekodan ziplist dan dalam kes lain, pengekodan senarai terpaut digunakan. ziplist ialah struktur senarai padat dan termampat yang menjimatkan memori. Baik untuk senarai kecil.

    • Senarai Terpaut ialah sejenis struktur data yang menyokong senarai sebarang saiz melalui struktur senarai terpaut.. Tetapi jejak ingatannya akan meningkat apabila panjang senarai bertambah.

    • senarai pantas: Diperkenalkan dalam versi Redis 3.2 , senarai pantas ialah struktur senarai yang terdiri daripada berbilang senarai zip, yang bukan sahaja dapat memastikan prestasi, tetapi juga menjimatkan memori. Sesuai untuk senarai besar.

    Koleksi

    Koleksi ialah satu siri koleksi rentetan tidak tertib yang menyokong penambahan, pemadaman dan pertanyaan elemen. Redis menyokong dua kaedah pengekodan:

    • inset: Apabila elemen dalam koleksi adalah semua integer, Redis akan menggunakan pengekodan inset untuk menyimpan . Kelebihan pengekodan inset ialah ruang storan yang kecil dan kecekapan operasi yang tinggi.

    • hashtable: Apabila elemen dalam koleksi mengandungi rentetan, Redis akan menggunakan pengekodan hashtable untuk menyimpan . Kelebihan pengekodan jadual hash ialah ia boleh menyimpan elemen dari sebarang jenis dan menyokong operasi rentetan. Kelemahannya ialah ruang penyimpanan agak besar dan kecekapan operasi agak rendah.

    Set Tempahan

    Koleksi rentetan yang tidak tersusun akan diberikan skor, supaya dapat diisih mengikut skor dan membentuk set tersusun. Redis menyokong dua kaedah pengekodan:

    • ziplist: menyimpan kurang daripada 128 elemen dan semua saiz elemen kurang daripada 64 bait Gunakan pengekodan ziplist , ziplist ialah A padat , struktur senarai termampat sesuai untuk koleksi pesanan kecil.

    • senarai langkau: senarai langkau ialah struktur senarai langkau yang menyokong pertanyaan dan pengisihan pantas. Sesuai untuk koleksi tempahan yang banyak.

    Jadual cincang

    Jadual cincang ialah koleksi pasangan nilai kunci, dengan setiap kunci dikaitkan dengan nilai. Redis menyokong dua kaedah pengekodan:

    • ziplist: Panjang rentetan semua nilai kunci yang disimpan oleh objek cincang adalah kurang daripada 64 bait dan bilangan pasangan nilai kunci kurang daripada 512, Redis akan menggunakan pengekodan senarai zip untuk menyimpan. Kelebihan kaedah pengekodan ziplist ialah ruang simpanan yang kecil dan kecekapan operasi yang tinggi. Kelemahannya ialah operasi carian kunci yang pantas tidak disokong.

    • Selain syarat di atas, Redis akan menggunakan pengekodan jadual cincang untuk storan. Kelebihan pengekodan jadual hash ialah ia menyokong operasi carian kunci yang pantas. Kelemahannya ialah ruang penyimpanan agak besar dan kecekapan operasi agak rendah.

    Prinsip asas jenis dan pengekodan

    Setelah memahami jenis data dan kaedah pengekodan yang disokong oleh Redis, mari kita lihat prinsip pelaksanaan asasnya.

    Penukaran pengekodan

    Dalam Redis, setiap pasangan nilai kunci mempunyai pengecam jenis, yang digunakan untuk menunjukkan jenis data yang disimpan dalam pasangan nilai kunci. Apabila kami mengendalikan kunci, Redis akan mengekod pasangan nilai kunci berdasarkan pengekodan semasa kunci dan pengekodan yang diperlukan untuk operasi.

    Sebagai contoh, apabila kita menambahkan kandungan pada rentetan, jika pengekodan semasa rentetan adalah mentah, tetapi kandungan baharu boleh disimpan menggunakan pengekodan embstr, maka Redis akan mengekod rentetan Kaedah ditukar daripada mentah untuk embstr.

    Struktur data

    Redis menggunakan pelbagai struktur data klasik untuk melaksanakan pelbagai jenis data, bukan hanya terhad kepada kaedah pengekodan. Sebagai contoh, senarai Redis dan jadual cincang dilaksanakan menggunakan struktur senarai terpaut. Langkau Senarai ialah struktur data yang cekap digunakan dalam koleksi tersusun.

    Struktur data ini telah direka bentuk dan dioptimumkan dengan teliti untuk memenuhi keperluan aplikasi dalam pelbagai senario. Contohnya, struktur senarai terpaut sesuai untuk situasi di mana elemen perlu kerap ditambah dan dipadamkan, manakala struktur senarai langkau lebih sesuai untuk operasi pengisihan dan carian.

    Atas ialah kandungan terperinci Apakah prinsip dan penggunaan jenis Redis dan pengekodan pengekodan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam