Rumah >pangkalan data >Redis >Pembelajaran jenis data Redis: Mari kita bincangkan tentang prinsip Rentetan
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!
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]
set key value [EX seconds] [PX milliseconds] [NX|XX]
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.
1 Cache data hotspot, sesi teragih
2. pembilang incr 分布式锁
6, operasi bit, fungsi bitmap, statistik pengguna dalam talian 0/1 markah Incr 限流
4 Jenis pengekodan yang berbeza
5 Prinsip storan rentetan
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;
len: mewakili panjang yang digunakan
peruntukan: jumlah saiz memori yang diperuntukkanbendera: 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 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编码的数据是不能修改的,只读的
3. Jika aksara embstr melebihi 44 bait, tukarkannya kepada mentah
8. Kelebihan struktur data SDS二进制安全的
Menyimpan integer panjang 8-bait, 2^63-1
int
Embstr
Raw
, menyimpan Atribut len 不用担心内存溢出,sds具备自动扩容能力
dan 获取字符串长度时间复杂度O(1)
untuk mengelakkan peruntukan memori berbilang
6 atribut, yang boleh termasuk '
通过源码分析,扩容策略是字符串在长度小于 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] = '\0'; }
真正的清除空间
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; }
以上便是关于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!