Rumah > pangkalan data > Redis > teks badan

Pembelajaran jenis data Redis: Mari kita bincangkan tentang prinsip Rentetan

青灯夜游
Lepaskan: 2022-01-29 08:00:38
ke hadapan
2244 orang telah melayarinya

Artikel ini akan membawa anda memahami jenis data String dalam Redis dan bercakap tentang prinsip penyimpanan jenis data String saya harap ia akan membantu anda!

Pembelajaran jenis data Redis: Mari kita bincangkan tentang prinsip Rentetan

Redis ialah perisian tengah yang kerap digunakan dalam kerja Ia menyokong struktur data yang kaya, mempunyai prestasi baca dan tulis yang sangat kuat, dan tps boleh mencapai 10w.

Artikel hari ini menganalisis dan meringkaskan jenis String, yang juga merupakan salah satu struktur data yang paling banyak digunakan. Artikel ini adalah berdasarkan redis5.0 untuk analisis. [Cadangan berkaitan: Tutorial video Redis]

1 Penggunaan asas

set key value [EX seconds] [PX milliseconds] [NX|XX]
Salin selepas log masuk

1 nilai yang ditentukan ialah nilai yang perlu disimpan

2 EX menentukan masa tamat tempoh dalam saat, dan PX menentukan masa tamat tempoh dalam milisaat

3 hanya apabila kunci tidak wujud

4: Tetapan berjaya hanya apabila kunci wujud

Ringkasan: 5.0 menyokong arahan yang ditetapkan untuk menentukan masa tamat tempoh dan tetapan berjaya sahaja. apabila ia tidak wujud, iaitu, pengedaran boleh dicapai dengan satu arahan Untuk fungsi mengunci, menetapkan kunci dan menetapkan masa tamat tempoh dalam versi terdahulu perlu dibahagikan kepada dua arahan, menjadikannya lebih sukar untuk memastikan atomicity.

2. Senario penggunaan

1 Cache data hotspot, sesi teragih

2. pembilang incr 分布式锁

4, id global Incr

5,

6, operasi bit, fungsi bitmap, statistik pengguna dalam talian 0/1 markah Incr 限流

3. Jenis data tersimpan yang disokong

Integer, aksara, terapung (titik terapung tunggal)

4 Jenis pengekodan yang berbeza

Pembelajaran jenis data Redis: Mari kita bincangkan tentang prinsip Rentetan

Pembelajaran jenis data Redis: Mari kita bincangkan tentang prinsip Rentetan5 Prinsip storan rentetan

Dalam Redis, storan data Dalam kelas RedisObject <. 🎜>

Untuk String, Redis menyesuaikan struktur data rentetan dinamik ringkas untuk menyimpan bilangan rentetan.

Pelaksanaan kod sumber: berbilang struktur data, setiap satu menunjukkan bahawa rentetan panjang yang berbeza boleh disimpan.
typedef struct redisObject {    
//这个类型可以是string,也可以是hash,zset等等
unsigned type:4;    
unsigned encoding:4;    
//记录lru,lfu淘汰算法依赖的访问时间和访问频率    
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;
Salin selepas log masuk

len: mewakili panjang yang digunakan Pembelajaran jenis data Redis: Mari kita bincangkan tentang prinsip Rentetan

peruntukan: jumlah saiz memori yang diperuntukkan

bendera: mewakili jenis storan

buf[]: Data sebenar

6. Perbezaan dalam tiga jenis storan pengekodan

1. Memori RedisObject dan SDS bagi embstr berada dalam satu bahagian selagi ia dicipta, mereka akan dimusnahkan

Apabila

, mudah dicari

2. Memori RedisObject dan SDS mentah tidak berada di tempat yang sama Apabila ia perlu dicipta, ia memerlukan untuk dicipta 分配一次内存 dan apabila dimusnahkan 释放一次内存

3. Struktur embstr ditentukan Apabila ia perlu menambah panjang, kedua-dua RedisObject dan SDS perlu mengagihkan semula memori. Oleh itu 分配两次内存. 释放两次内存

7. Bilakah pengekodan int dan embstr akan ditukar kepada mentahembstr编码的数据是不能修改的,只读的

1 Data jenis int bukan lagi jenis int dan akan ditukar kepada mentah 2. Jika panjang lebih besar daripada 2^63-1, tukarkannya kepada embstr

3. Jika aksara embstr melebihi 44 bait, tukarkannya kepada mentah

8. Kelebihan struktur data SDS

1 boleh menyimpan pembentukan imej dan titik terapung

2

二进制安全的

Menyimpan integer panjang 8-bait, 2^63-1

  • Rentetan Dinamik mudah SDS dalam format embstr Ruang memori adalah berterusan dan dibaca-. sahaja. Selagi pengubahsuaian dilakukan, ia akan ditukar kepada mentah int
  • , SDS, menyimpan rentetan yang lebih besar daripada 44 bait Embstr
  • 3, Raw
4,

, menyimpan Atribut len ​​不用担心内存溢出,sds具备自动扩容能力

5 Gunakan

dan 获取字符串长度时间复杂度O(1) untuk mengelakkan peruntukan memori berbilang

6 atribut, yang boleh termasuk '

十、关于内存预分配特性

Pembelajaran jenis data Redis: Mari kita bincangkan tentang prinsip Rentetan

通过源码分析,扩容策略是字符串在长度小于 SDS_MAX_PREALLOC 之前,扩容空间采用加倍策略,也就是保留 100% 的冗余空间。当长度超过 SDS_MAX_PREALLOC 之后,为了避免加倍后的冗余空间过大而导致浪费,每次扩容只会多分配 SDS_MAX_PREALLOC大小的冗余空间。

十一、关于惰性空间释放

惰性空间释放用于优化 SDS 的字符串缩短操作:当 SDS 的 API 需要缩短 SDS 保存的字符串时, 程序并不立即使用内存重分配来回收缩短后多出来的字节, 而是使用 free 属性将这些字节的数量记录起来,并等待将来使用。

//仅仅设置长度,没有真正清除数据
void sdsclear(sds s) {    
//单纯设置长度为0    
sdssetlen(s, 0);    
//第一个字符设置为结束符    
s[0] = &#39;\0&#39;;
}
Salin selepas log masuk

真正的清除空间

sds sdsRemoveFreeSpace(sds s) 
{
struct sdshdr *sh;    
sh = (void*) (s-(sizeof(struct sdshdr)));    
// 进行内存重分配,让 buf 的长度仅仅足够保存字符串内容 
sh = zrealloc(sh, sizeof(struct sdshdr)+sh->len+1);    
// 空余空间为 0    
sh->free = 0;    
return sh->buf;
}
Salin selepas log masuk

以上便是关于string的知识点记录,string的设计很多地方都非常巧妙,比如不同的结构体存储不同长度的字符串,不同编码类型存储不同长度的字符串,

空间预分配,空间惰性释放等,从存储结构,编码类型,内存分配策略和回收策略,作者都从性能方面做了非常多的考量设计,可想而知这也是redis为什么性能极高的原因,工作中也要学习这种追求极致性能的优良风格和设计风格。

更多编程相关知识,请访问:编程入门!!

Atas ialah kandungan terperinci Pembelajaran jenis data Redis: Mari kita bincangkan tentang prinsip Rentetan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!