Açık Kaynak Çin OSC başlığında dikkat edin, en son teknik bilgileri alın
Genel bakış
Önceki "Redis String Type Dahili Kodlama Analizi" makalesinde, Redis analiz edildi En temel Dize türünün içi nasıl kodlanır ve depolanır? Bu makale Redis'teki kullanımı açıklayacak En sık Veri Türü: Karma (veya uzatma), Redis'in içinde nasıl.
Not: Bu makale ilk olarak yayınlandı Kişisel blogum ,Hoşgeldiniz Küçük istasyon
Bu makalenin içeriğinin içeriği aşağıdaki gibidir:
Karma tip dahili kodlama detayları
Redis için yaygın olarak kullanılır 5 Hız Veri Türü (String, Hash, Liste, Set, Sıralı Set), her veri türü sağlar. En az iki tür Dahili kodlama biçimi ve her veri türünün dahili kodlama yönteminin seçimi Kullanıcılar için tamamen şeffaftır , Redis veri hacmine göre daha optimize edilmiş dahili kodlama formatına uyum sağlayacaktır.
Bir anahtarın dahili kodlama biçimini görüntülemek istiyorsanız, gerçekleştirilecek Nesne Kodlama Koruma Adı Talimatlarını kullanabilirsiniz, örneğin:
127.0.0.1:6379 >
127.0.0.1:6379 > Foo Bar'ı ayarlayın
TAMAM
127.0.0.1:6379 >
127.0.0.1:6379 > Nesne Kodlama Foo // Redis anahtar değerinin kodlanmasını görüntüleyin
"EMBSTR"
127.0.0.1:6379 >
127.0.0.1:6379 >
En sık görülen karma türü için iki dahili kodlama yöntemi olabilir:
Redis temel alacak Veri miktarı Duruma Gel Uyarlanabilir Bu iki kodlama yöntemini seçin Daha iyi Bunlardan biri ve kullanıcılar için tamamen şeffaftır.
mevcut Daha az veri girişi var ,, Veri değeri küçük Redis ne zaman kullanacak Sıkıştırma listesi (OBJ_ENCODING_ZIPLES) Kodlama yöntemi saklanır. Burada "daha az" ve "küçük üyeler değeri" üyeleri aşağıdaki yapılandırma öğeleri tarafından yapılandırılabilir:
Hash-Max-Ziplist-Giriş 512
Hash-Max-Ziplist-Value 64
Redis varsayılan değeri varsayılan olarak verir. Elbette, kullanıcılar kendilerini gerçek duruma göre yapılandırabilirler.
Karma tip anahtarının alan sayısı < Hash-Max-Ziplist-Girişler ve her alan adı ve alan değerinin uzunluğu < Hash-max-ziplist-değeri olduğunda, Redis anahtarı depolamak için obj_encoding_ziplist kullanır, aksi takdirde obj_encoding_ht kodlamaya dönüştürülür.
Konuşma, önce bir deney yapabilir ve hissedebiliriz:
Açıkçası bu deney doğrulandı Alan değeri 64'ten büyük Aynı zamanda, kodlama biçimi Ziplist tarafından HashTable yöntemine geçirilir.
Kaynak koddan önce bir sır yoktu. Redis'in anahtarlamanın bu bölümünün kaynak kodu uygulamasına bir göz atalım ve sonra daha net anlayalım:
İki kodlama formatının dahili depolama modellerinin, ilgili niyetlerini bilen iki kodlama formatında aşağıdaki yorumlanması, niyetlerini doğal olarak anlar.
Obj_encoding_ziplist kodlama
Ziplist sıkıştırma listesi kompakt bir kodlama formatıdır. Genel fikir Zaman Değişikliği Alanı , Yani okuma ve yazma performansının bir kısmı pahasına, yüksek bellek uzay kullanımı karşılığında, bu nedenle sadece bunun için kullanılacaktır. Çok sayıda alan ,ve Alan değeri de küçük Faliyet alani, sahne.
Sıkıştırma listesinin son derece yüksek bellek kullanımının nedenleri, sürekli belleğinin özelliklerinden ayrılamaz. Tipik bellek yapısı aşağıdaki şekilde görüntülenebilir:
Dolayısıyla, Redis'in uzantısını depolamak için Ziplist kullanıyorsanız, öğenin düzenlemesi aşağıdaki şekilde gösterildiği gibi şematik bir diyagram haline gelecektir: yani anahtar ve değer mantıksal sürekli bellektir:
Obj_encoding_ht kodlama
OBJ_ENCODING_HT Bu kodlama yöntemi gerçek karma tablo yapısıdır veya O (1) karmaşıklığının okuma ve yazma işlemlerini elde edebilen bir sözlük yapısı olarak adlandırılır, bu nedenle verimlilik çok yüksektir.
REDIS'in içinde, OBJ_ENCODING_HT türünden gerçek dağılım listesinin gerçek dağılım listesinin veri yapısı katmanla iç içe katmandır. İlişki aşağıdaki gibidir:
Redis Hash tablosu tarafından tanımlanan kaynak kodundan görebiliriz:
Her bölüme daha yakından bakalım:
Redis, karma kaynak kodunu aşağıdaki gibi hesaplar:
Bu bir C -dalı makro tanımıdır. Aslında, sahne arkasında, yukarıda belirtilen diktType yapısındaki işlev işaretçisi hashfonksiyonu, yukarıda tanıtılan diktType yapısıdır.
Ve hashfunction işlev işaretçisi, tıpkı aşağıdakiler gibi başlatma sırasında karma değerinin karma değerinin gerçek işlevine karşılık gelecektir:
Dizin değerinin hesaplanması, yukarıda hesaplanan karma değerine bağlıdır. Kod aşağıdaki gibidir:
Bu noktada başka bir tane daha var Her zaman dikkate değer olan detaylar : Yani, dikt içinde her zaman iki karma masa yapısı vardır HT Ve onunla çok ilişkili Rehash Operasyonu Bu bir sonraki makalede detaylandırılmıştır.
Arka
Sınırlı yetenek nedeniyle, hatalar veya uygunsuz yerler varsa, lütfen eleştirin ve düzeltin!
Blog yazarı: Codesheep
Günlük blog sütunu, günde seçkin blogcuların yüksek kaliteli teknik makalelerini önerir. Aynı zamanda, kullanıcılar katkıda bulunabilir. Makale resmi hesaba dahil edildikten sonra, web sitesinin ana sayfasında tavsiye edeceğiz. odaklan Açık Kaynak Çin OSC Yüksek kaliteli push al, tıklayın " Daha fazlasını anlayın "Orijinal makaleyi okuyun.