Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Apa struktur data dasar yang digunakan untuk Redis?

Saya akan mencoba menjawab pertanyaan Anda, tetapi saya akan mulai dengan sesuatu yang mungkin terlihat aneh pada awalnya:jika Anda tidak tertarik dengan Redis internal, Anda tidak perlu peduli tentang bagaimana tipe data diimplementasikan secara internal. Ini untuk alasan sederhana:untuk setiap operasi Redis Anda akan menemukan kompleksitas waktu dalam dokumentasi dan, jika Anda memiliki rangkaian operasi dan kompleksitas waktu, satu-satunya hal lain yang Anda butuhkan adalah beberapa petunjuk tentang penggunaan memori (dan karena kami melakukan banyak pengoptimalan yang dapat bervariasi tergantung pada data, cara terbaik untuk mendapatkan angka terakhir ini adalah dengan melakukan beberapa tes dunia nyata yang sepele).

Tapi karena Anda bertanya, inilah implementasi yang mendasari setiap tipe data Redis.

  • String diimplementasikan menggunakan pustaka string dinamis C sehingga kami tidak membayar (secara asimtotik) untuk alokasi dalam operasi penambahan. Dengan cara ini kita memiliki penambahan O(N), misalnya, alih-alih memiliki perilaku kuadrat.
  • Daftar diimplementasikan dengan daftar tertaut.
  • Set dan Hash diimplementasikan dengan tabel hash.
  • Set yang diurutkan diimplementasikan dengan daftar lewati (jenis pohon seimbang yang khas).

Tetapi ketika daftar, set, dan set yang diurutkan kecil dalam jumlah item dan ukuran nilai terbesar, pengkodean yang berbeda dan jauh lebih ringkas digunakan. Pengkodean ini berbeda untuk tipe yang berbeda, tetapi memiliki fitur bahwa itu adalah gumpalan data yang kompak yang sering memaksa pemindaian O(N) untuk setiap operasi. Karena kami menggunakan format ini hanya untuk objek kecil, ini tidak menjadi masalah; memindai gumpalan kecil O(N) cache tidak disadari jadi praktis berbicara itu sangat cepat, dan ketika ada terlalu banyak elemen pengkodean secara otomatis beralih ke pengkodean asli (daftar tertaut, hash, dan sebagainya).

Tapi pertanyaan Anda sebenarnya bukan hanya tentang internal, maksud Anda adalah Jenis apa yang digunakan untuk mencapai apa? .

String

Ini adalah tipe dasar dari semua tipe. Ini salah satu dari empat tipe tetapi juga tipe dasar dari tipe kompleks, karena List adalah daftar string, Set adalah kumpulan string, dan seterusnya.

String Redis adalah ide yang bagus dalam semua skenario yang jelas di mana Anda ingin menyimpan halaman HTML, tetapi juga ketika Anda ingin menghindari konversi data yang sudah dikodekan. Jadi misalnya, jika Anda memiliki JSON atau MessagePack, Anda dapat menyimpan objek sebagai string. Di Redis 2.6 Anda bahkan dapat memanipulasi sisi server objek semacam ini menggunakan skrip Lua.

Penggunaan string lain yang menarik adalah bitmap, dan secara umum array akses acak byte, karena Redis mengekspor perintah untuk mengakses rentang byte acak, atau bahkan bit tunggal. Misalnya, periksa posting blog yang bagus ini:Metrik waktu nyata Cepat Mudah menggunakan Redis.

Daftar

Daftar bagus ketika Anda cenderung hanya menyentuh bagian ekstrem dari daftar:dekat ekor, atau dekat kepala. Daftar tidak terlalu baik untuk membuat paginasi hal-hal, karena akses acak lambat, O(N). Jadi penggunaan daftar yang baik adalah antrian dan tumpukan biasa, atau memproses item dalam satu lingkaran menggunakan RPOPLPUSH dengan sumber dan tujuan yang sama untuk "memutar" sebuah cincin item.

Daftar juga bagus ketika kita hanya ingin membuat koleksi terbatas dari N item di mana biasanya kita hanya mengakses item atas atau bawah, atau saat N kecil.

Set

Set adalah kumpulan data yang tidak berurutan, sehingga bagus setiap kali Anda memiliki koleksi item dan sangat penting untuk memeriksa keberadaan atau ukuran koleksi dengan cara yang sangat cepat. Hal keren lainnya tentang set adalah dukungan untuk mengintip atau memunculkan elemen acak (perintah SRANDMEMBER dan SPOP).

Himpunan juga baik untuk merepresentasikan relasi, misalnya, "Apa teman pengguna X?" Dan seterusnya. Tetapi struktur data bagus lainnya untuk hal semacam ini adalah kumpulan yang diurutkan seperti yang akan kita lihat.

Set mendukung operasi kompleks seperti persimpangan, gabungan, dan sebagainya, jadi ini adalah struktur data yang baik untuk menggunakan Redis dengan cara "komputasi", ketika Anda memiliki data dan ingin melakukan transformasi pada data tersebut untuk mendapatkan beberapa keluaran.

Set kecil dikodekan dengan cara yang sangat efisien.

Hash

Hash adalah struktur data yang sempurna untuk mewakili objek, terdiri dari bidang dan nilai. Bidang hash juga dapat bertambah secara atom menggunakan HINCRBY. Saat Anda memiliki objek seperti pengguna, entri blog, atau jenis item lainnya , hash kemungkinan merupakan cara yang tepat jika Anda tidak ingin menggunakan enkode Anda sendiri seperti JSON atau sejenisnya.

Namun, perlu diingat bahwa hash kecil dikodekan dengan sangat efisien oleh Redis, dan Anda dapat meminta Redis untuk MENDAPATKAN, MENGATUR, atau menambah bidang individual secara atom dengan cara yang sangat cepat.

Hash juga dapat digunakan untuk mewakili struktur data yang ditautkan, menggunakan referensi. Misalnya, periksa implementasi komentar di lamernews.com.

Kumpulan yang Diurutkan

Kumpulan yang diurutkan adalah satu-satunya struktur data lain, selain daftar, untuk mempertahankan elemen yang diurutkan . Anda dapat melakukan sejumlah hal keren dengan set yang diurutkan. Misalnya, Anda dapat memiliki semua jenis Sesuatu Terbaik daftar di aplikasi web Anda. Pengguna teratas berdasarkan skor, postingan teratas berdasarkan tampilan halaman, apa pun teratas, tetapi satu instance Redis akan mendukung banyak operasi penyisipan dan elemen get-top per detik.

Himpunan yang diurutkan, seperti himpunan biasa, dapat digunakan untuk menggambarkan relasi, tetapi mereka juga memungkinkan Anda untuk membuat paginasi daftar item dan mengingat urutannya. Misalnya, jika saya mengingat teman pengguna X dengan kumpulan yang diurutkan, saya dapat dengan mudah mengingat mereka dalam urutan pertemanan yang diterima.

Kumpulan yang diurutkan cocok untuk antrean prioritas.

Kumpulan yang diurutkan seperti daftar yang lebih kuat di mana memasukkan, menghapus, atau mendapatkan rentang dari tengah daftar selalu cepat. Tetapi mereka menggunakan lebih banyak memori, dan merupakan struktur data O(log(N)).

Kesimpulan

Saya harap saya memberikan beberapa info di posting ini, tetapi jauh lebih baik untuk mengunduh kode sumber lamernews dari http://github.com/antirez/lamernews dan memahami cara kerjanya. Banyak struktur data dari Redis digunakan di dalam Lamer News, dan ada banyak petunjuk tentang apa yang harus digunakan untuk menyelesaikan tugas tertentu.

Maaf untuk kesalahan ketik tata bahasa, ini tengah malam di sini dan terlalu lelah untuk meninjau posting;)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Batch set data dari Kamus ke Redis

  2. tidak dapat mematikan redis-server di linux

  3. Bagaimana saya bisa mendapatkan semua set di redis?

  4. Nonaktifkan Halaman Besar Transparan dari Kubernetes

  5. Redis Pub/Sub dengan Keandalan