Alih keluar dan Dapatkan elemen pertama senarai Jika tiada unsur dalam senarai, senarai akan disekat sehingga tamat masa menunggu atau elemen itu muncul.
brpop Key1 [Key2] Timeout
Remove dan dapatkan elemen last senarai. masa tunggu tamat atau unsur boleh timbul ditemui sehingga.
BrpoPlpush Sumber Destinasi Timeout
pop nilai dari senarai, masukkan elemen yang muncul ke dalam senarai lain dan kembalikan; masa tunggu tamat atau Sehingga unsur boleh timbul ditemui.
LIndex key index
通过索引获取列表中的元素
Linsert key before/after pivot value
在列表的元素前或者后插入元素
LLEN key
获取列表长度
LPOP key
移出并获取列表的第一个元素
nilai kunci LPUSH1, nilai2,…
Masukkan satu atau lebih nilai ke dalam kepala senarai
akan menyisipkan nilai ke dalam kepala senarai sedia ada
LRANGE key srart stop
Dapatkan elemen dalam julat yang ditentukan dalam senarai Kunci LREM kira nilai
Alih keluar elemen senarai
Nilai indeks kunci LSET
nilai elemen senarai
nilai indeks
hentian mula kunci LTRIM
Memangkasan senarai bermakna senarai itu hanya mengekalkan elemen dalam julat yang ditentukan dan semua elemen yang tidak berada dalam julat yang ditentukan akan dipadamkan. Indeks bermula dari 0, dan julat adalah inklusif.
RPOP key
mengalih keluar terakhir dialih keluar daripada senarai, dan elemen pulangan daripada senarai, dan nilai pulangan ialah
Destinasi sumber RPOPPUSH .
tambah Satu atau lebih banyak nilai ke penghujung senarai
RPUSHX nilai utama
Tambahkan nilai pada senarai sedia ada
. pada mulanya Bagaimana untuk melaksanakan senarai pautan tunggal:
Setiap nod mempunyai penuding ke belakang (rujukan) yang menghala ke nod seterusnya, nod terakhir menghala ke NULL untuk menunjukkan penghujungnya, dan terdapat penuding Kepala menghala ke nod pertama untuk menunjukkan permulaan.
Sama seperti ini, walaupun baharu dan dipadam hanya memerlukan
O(1)
, tetapi carian memerlukan
O(n)
masa; carian terbalik tidak boleh dilakukan dan anda perlu mulakan dari dulu kalau rindu .
Tambah nod:
Delete A Node:
Double Linked List. mempunyai dua penunjuk , masing-masing menunjuk kepada pengganti segera dan pendahulu segera. Oleh itu, bermula dari mana-mana nod dalam senarai berganda, anda boleh mengakses nod pendahulu dan nod penggantinya dengan mudah.
Ciri-ciri:
Setiap kali nod dimasukkan atau dipadamkan, empat rujukan nod perlu diproses dan bukannya dua. Ia lebih sukar untuk dilaksanakan
Berbanding dengan senarai pautan sehala, ia pasti akan mengambil lebih banyak ruang ingatan.
Ia boleh dilalui dari awal hingga akhir, dan ia boleh dilalui dari ekor ke kepala
Ini seolah-olah menyelesaikan masalah redis, yang boleh dilaksanakan sebelum dan selepas Ini masalah traversal.
Akiklik dwiarah: nod senarai terpaut Dengan pacuan roda hadapan Kerumitan masa untuk mendapatkan nod pendahulu dan nod pengganti oleh penunjuk pengganti ialah O(1 Penunjuk pendahulu nod kepala dan penunjuk pengganti nod ekor kedua-duanya menghala ke NULL, dan akses kepada nod). senarai terpaut berakhir dengan NULL.
Pembilang panjang: Kerumitan masa untuk mendapatkan bilangan nod melalui atribut len struktur Senarai ialah O(1).
Memandangkan senarai masih menghadapi masalah peruntukan memori yang tidak berterusan dan pemecahan memori, adakah terdapat cara untuk mengoptimumkan ingatan mereka?
redis compressed list
ZipList bukanlah struktur data asas, ia adalah struktur storan data yang direka oleh Redis sendiri. Ia agak serupa dengan tatasusunan, menyimpan data melalui ruang ingatan berterusan.
Berbeza daripada tatasusunan, ia membenarkan elemen senarai yang disimpan untuk menduduki ruang memori yang berbeza. Apabila ia datang kepada perkataan mampatan, perkara pertama yang semua orang mungkin fikirkan ialah menjimatkan memori. Sebab mengapa struktur storan ini menjimatkan memori adalah kerana ia dibandingkan dengan tatasusunan.
Kita semua tahu bahawa tatasusunan memerlukan saiz ruang storan yang sama untuk setiap elemen Jika kita ingin menyimpan rentetan dengan panjang yang berbeza, kita mesti menggunakan ruang storan yang diduduki oleh rentetan panjang maksimum sebagai setiap elemen tatasusunan rentetan. Saiz ruang (jika ia adalah 50 bait).
Jadi apabila menyimpan rentetan kurang daripada 50 bait panjang dalam nilai nombor aksara, sebahagian daripada ruang storan akan dibazirkan. Kelebihan
array ialah ia menduduki ruang yang berterusan dan boleh menggunakan cache CPU dengan baik untuk mengakses data dengan cepat.
Jika kita ingin mengekalkan kelebihan array ini dan menjimatkan ruang storan, maka kita boleh memampatkan tatasusunan:
Namun, terdapat masalah, kita tidak tahu ketika melintasi mampat senarai Apakah saiz memori yang diduduki oleh setiap elemen, jadi adalah mustahil untuk mengira kedudukan permulaan tertentu bagi elemen seterusnya.
Tetapi kemudian saya berfikir mengenainya, jika kita boleh mempunyai panjang setiap elemen sebelum mengaksesnya, bukankah masalah ini akan diselesaikan?
Seterusnya, mari lihat cara Redis menggabungkannya dengan melaksanakan ZipList sambil mengekalkan kelebihan tatasusunan dan menjimatkan memori.
quicklist是Redis 3.2中新引入的数据结构,能够在时间效率和空间效率间实现较好的折中。Redis中对quciklist的注释为A doubly linked list of ziplists。顾名思义,quicklist是一个双向链表,链表中的每个节点是一个ziplist结构。quicklist可以看成是用双向链表将若干小型的ziplist连接到一起组成的一种数据结构。
typedef struct quicklist {
// 指向quicklist的首节点
quicklistNode *head;
// 指向quicklist的尾节点
quicklistNode *tail;
// quicklist中元素总数
unsigned long count; /* total count of all entries in all ziplists */
// quicklistNode节点个数
unsigned long len; /* number of quicklistNodes */
// ziplist大小设置,存放list-max-ziplist-size参数的值
int fill : 16; /* fill factor for individual nodes */
// 节点压缩深度设置,存放list-compress-depth参数的值
unsigned int compress : 16; /* depth of end nodes not to compress;0=off */
unsigned int bookmark_count: 4;
quicklistBookmark bookmarks[];
} quicklist;
typedef struct quicklistBookmark {
quicklistNode *node;
char *name;
} quicklistBookmark;
Salin selepas log masuk
quicklistNode定义如下:
typedef struct quicklistNode {
struct quicklistNode *prev;
struct quicklistNode *next;
unsigned char *zl;
unsigned int sz; /* ziplist size in bytes */
unsigned int count : 16; /* count of items in ziplist */
unsigned int encoding : 2; /* RAW==1 or LZF==2 */
unsigned int container : 2; /* NONE==1 or ZIPLIST==2 */
unsigned int recompress : 1; /* was this node previous compressed? */
unsigned int attempted_compress : 1; /* node can't compress; too small */
unsigned int extra : 10; /* more bits to steal for future usage */
} quicklistNode;
Terdapat 1 nod pada setiap hujung senarai pantas yang tidak dimampatkan, dan nod tengah dimampatkan
2
tidak ada di hujung setiap senarai pantas tidak dimampatkan, dan nod tengah dimampatkan
n
senarai pantas Terdapat n nod pada setiap hujung senarai pantas yang tidak dimampatkan, dan nod di tengah dimampatkan
Terdapat juga medan pengisian, yang bermaksud kapasiti maksimum setiap node quicknode. juga dikonfigurasikan kepada nilai lain. Sebagai contoh, apabila nilai ialah 5, senarai zip setiap nod quicklistNode mengandungi paling banyak 5 item data
Apabila nilai ialah nombor negatif, ini bermakna panjang senarai zip pada nod quicklistNode ialah terhad mengikut bilangan bait nilai yang mungkin adalah -1 hingga -5.
nilai
makna
Saiz maksimum nod ziplist ialah 4kb
- 2
Nod senarai zip maksimum ialah 8kb
-3
nod maksimum zip
-4
ziplist nod Saiz maksimum ialah 32kb
-5
saiz maksimum nod senarai zip ialah 64kb
disediakan konfigurasi?
Semakin pendek senarai zip, semakin banyak pemecahan memori akan berlaku, menjejaskan kecekapan storan. Apabila senarai zip hanya menyimpan satu elemen, senarai pantas akan merosot menjadi senarai terpaut dua kali Lebih panjang senarai zip, lebih sukar untuk memperuntukkan ruang memori berterusan yang besar untuk senarai zip, yang akan menyebabkan banyak blok kecil ruang memori akan diduduki. . Membazir, apabila senarai pantas hanya mempunyai satu nod dan semua elemen disimpan dalam senarai zip, senarai pantas menjadi senarai zip
Kesimpulan
Walaupun kami tidak memahami sepenuhnya kod sumbernya, kami juga boleh lulus artikel ini Mari kita biasakan dengan idea reka bentuk redis. Dan ketahui cara ia dioptimumkan langkah demi langkah. Mari kita dapatkan idea umum tentang prestasi.
Atas ialah kandungan terperinci prinsip senarai nota kajian redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
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