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

Pengantar Struktur Data Redis:Set

Redis (Remote Dictionary Server) adalah penyimpanan nilai kunci dalam memori yang sangat populer yang juga menyediakan daya tahan opsional, partisi, replikasi, dan sejumlah fitur lainnya. Ini adalah database nilai kunci paling populer saat ini dan dikenal karena kesederhanaannya, jejak memori yang rendah, dan memiliki kurva pembelajaran yang rendah. Redis juga disebut sebagai server struktur data dan memiliki dukungan untuk operasi atomik pada struktur data seperti hash, daftar, kumpulan, kumpulan yang diurutkan, bitmap, dan hyperloglog. Dalam postingan ini, kita akan melihat kumpulan tipe data yang disediakan oleh Redis beserta penggunaannya dan kasus penggunaan di kehidupan nyata.

Set Redis

Set Redis adalah kumpulan string yang tidak berurutan (string adalah nilai Redis dasar yang dapat berisi hampir semua hal) yang menyediakan penambahan waktu, penghapusan, dan pemeriksaan keanggotaan yang konstan. Redis juga mendukung operasi penyatuan, persimpangan, dan pengurangan yang cukup cepat antar set. Seperti yang diharapkan, itu tidak memungkinkan nilai berulang.

Berikut adalah beberapa contoh set Redis beraksi dari redis-cli . Berikut ringkasan representasi kunci dalam contoh di bawah ini:

  • pengguna:semua mewakili sekumpulan semua pengguna yang terdaftar di situs web.
  • pengguna:actv mewakili pengguna aktif.
  • pengguna:inactv mewakili pengguna yang tidak aktif (pengguna yang sudah lama tidak mengunjungi situs).
# sadd key member [member ...] : add members to a set
127.0.0.1:6379> sadd users:all 11 12 13 14 15 Rocket Pocket Socket
(integer) 8
127.0.0.1:6379> type users:all
set
# smembers key: get all members of a set
127.0.0.1:6379> smembers users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "Rocket"
7) "12"
8) "15"
# sismember key member: is the given value a member of the set?
127.0.0.1:6379> sismember users:all 00
(integer) 0
127.0.0.1:6379> sismember users:all 11
(integer) 1
127.0.0.1:6379> sismember users:all Socket
(integer) 1
127.0.0.1:6379> sadd users:inactv 11 12 13
(integer) 3
# sinter key [key ...]: Intersection of multiple sets
# Similar: sinterstore stores the result of intersection of sets to a new set
127.0.0.1:6379> sinter users:all users:inactv
1) "11"
2) "12"
3) "13"
# scard key: cardinality of the set i.e. number of members present in the set
127.0.0.1:6379> scard users:all
(integer) 8
# sdiff key [key ...] : Subtract multiple sets
# Similar: sdiffstore: subtract and store result in a new destination set
127.0.0.1:6379> sdiff users:all
1) "Pocket"
2) "11"
3) "Socket"
4) "13"
5) "14"
6) "12"
7) "Rocket"
8) "15"
127.0.0.1:6379> sdiff users:all users:inactv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
# sdiffstore destination key [key ...]
127.0.0.1:6379> sdiffstore users:actv users:all users:inactv
(integer) 5
127.0.0.1:6379> smembers users:actv
1) "14"
2) "Pocket"
3) "Rocket"
4) "Socket"
5) "15"
127.0.0.1:6379> sdiff users:all users:actv users:inactv
(empty list or set)
# smove source destination member: move a member from source set to destination.
127.0.0.1:6379> smove users:inactv users:actv 11
(integer) 1
127.0.0.1:6379> smembers users:actv
1) "Pocket"
2) "11"
3) "Socket"
4) "14"
5) "Rocket"
6) "15"

Perintah set penting lainnya termasuk:

  • SUNION – atur serikat
  • SPOP – menghapus elemen secara acak
  • SREM – hapus satu atau beberapa elemen

Daftar lengkap kumpulan perintah Redis terkait dapat ditemukan di sini.

Redis Internal

Redis secara internal menyimpan set sebagai kamus. Kamus di Redis diimplementasikan sebagai tabel hash yang menggunakan fungsi hash MurmurHash2 dan berkembang melalui pengubahan ukuran tambahan. Tabrakan hash ditangani dengan chaining. Himpunan memiliki penyandian khusus untuk himpunan kecil ketika semua anggota himpunan berada dalam radix 10 dalam kisaran # dari bilangan bulat bertanda 64 bit yang disebut IntSets. Ini pada dasarnya adalah array bilangan bulat yang diurutkan. Pencarian dalam array dilakukan melalui pencarian biner. Jelas, implementasi ini efisien untuk set yang sangat kecil. Ukuran hingga pengkodean ini digunakan diatur oleh set-max-intset-entries parameter konfigurasi. Nilai default adalah 512. Deskripsi yang baik tentang struktur data internal yang digunakan oleh Redis dapat ditemukan di sini.

Aplikasi Redis

Berikut adalah daftar kecil dari beberapa kemungkinan aplikasi Redis Set:

  • Sebagai satu set, ini dapat digunakan untuk melacak item unik:
    • Semua alamat IP unik yang mengunjungi situs Anda.
    • Semua instance pekerjaan unik saat ini dalam status tertentu, dll.
  • Sekali lagi, sebagai satu set, ini dapat digunakan untuk menyatakan sebagai "milik" atau hubungan serupa:
    • Semua SKU yang termasuk dalam kategori tertentu.
    • Semua objek dengan tag tertentu, dll.
  • Set hanya dapat digunakan untuk menggabungkan hubungan, yaitu union/intersection/subtraction of set:
    • Semua SKU yang termasuk dalam kategori kaos, tetapi bukan subkategori polo neck.

Mari ambil contoh kehidupan nyata dan jelajahi set kasus penggunaan terkait lebih lanjut.

Visual Profiler untuk Toko eBook Anda

Misalnya Anda adalah pemilik toko buku online yang sangat besar yang mencantumkan jutaan judul. Basis data utama Anda adalah MongoDB dan kinerjanya cukup baik untuk sebagian besar kasus penggunaan Anda dengan penggunaan pengindeksan, sharding, dll yang benar. Berikut adalah skema dokumen DB parsial untuk buku koleksi:

...
sku: SKU,
pid: Product ID,
title: String,
auth: String,
pub: String,
isbn: ISBN,
edition: Int,
price: Float,
rating: Float,
cats: [String, String ...],
tags: [String, String ...],
...

Anda juga mencatat transaksi dalam koleksi yang disebut txns yang mungkin terlihat seperti:

txnid: TxnID,
cid: CustomerID,
amnt: Float,
curr: Currency,
sku: [sku1, sku2, ...],
time: TimeStamp,
...

Dan, koleksi untuk tampilan yang disebut tampilan:

time: TimeStamp, # daily aggregated
cid: CustomerID,
sku: [sku1, sku2, ...],
...

Jelas, ini adalah contoh yang sangat disederhanakan yang membuat asumsi luas. Maksud kami adalah untuk menunjukkan contoh set Redis dalam skenario (mendekati) dunia nyata.

Oke, jadi sekarang Anda, sebagai manajer toko, menginginkan alat Profiler Visual untuk menganalisis hubungan dan perilaku pelanggan di berbagai kategori. Misalnya:

  • Apa kategori yang paling populer?
  • Apakah orang yang melihat atau membeli Fiksi Ilmiah juga melihat Non-Fiksi?

Anda ingin dapat melakukan ini secara real-time, yaitu UI profiler akan mencentang kotak, tombol yang memungkinkan Anda mengubah parameter, dan melihat hasil (hampir) segera.

Melakukan operasi seperti itu di MongoDB akan memerlukan melakukan kueri yang agak terlibat untuk menggabungkan berbagai kategori, tag, dan data lain yang mungkin Anda pedulikan. Dengan perangkat kerja yang tidak sesuai dengan memori, ini tidak akan menjadi operasi tercepat. Misalnya:

  • Menemukan semua buku yang dijual hari ini adalah Fiksi, tetapi bukan Fiksi Ilmiah akan melibatkan kueri txn kumpulan transaksi hari ini. Kemudian, mengulangi SKU untuk mengumpulkan kategorinya dan kemudian melakukan operasi $in/$nin.

Mari kita lihat bagaimana ini akan ditangani dengan membawa Redis ke dalam campuran. Pada akhir setiap hari, pekerjaan terjadwal harian dapat berjalan di atas koleksi MongoDB ini untuk membuat set Redis. Jenis set yang ingin Anda buat akan bergantung pada jenis filter yang ingin Anda dukung di frontend Anda. Misalnya, Anda ingin mendukung kueri terkait kategori, kami ingin membuat kumpulan seperti:

cat:type:catID
cat:sku:fiction
cat:sku:nonfiction
cat:sku:scfiction
cat:sku:history
cat:sku:milhistory
cat:sku:military
...
cat:cid:fiction
cat:cid:nonfiction
cat:cid:scfiction
cat:cid:history
cat:cid:milhistory
cat:cid:military
...

Set cat:sku:* akan berisi SKU buku yang dijual/dilihat hari ini dalam kategori tersebut. Demikian pula, cat:cid:* akan berisi CID pelanggan yang membeli/menjual buku dalam kategori tersebut. Contoh pertanyaan yang dapat kami jawab dengan kumpulan ini adalah:

  • Pelanggan (atau # pelanggan) yang melihat/membeli buku Fiksi (kategori tunggal) hari ini:smembers cat:cid:fiction
  • Pelanggan yang melihat/membeli Sejarah tetapi tidak melihat Sejarah Militer hari ini:sdiff cat:cid:history cat:cid:milhistory
  • (Jumlah) Buku yang dijual hari ini adalah Fiksi Ilmiah dan Militer yaitu fiksi ilmiah militer:sinter cat:sku:scfiction cat:sku:military
  • Sejumlah operasi penyatuan, perpotongan, dan perbedaan yang Anda perhatikan.

Ini sendiri memberi kita kemampuan kueri yang sangat kuat. Mari tambahkan lebih banyak set! Katakanlah, kami membuat set tambahan berdasarkan peringkat buku. Misalnya:

rat:sku:5str: Set of books with ratings > 4.5
rat:sku:4str: Set of books with ratings > 3.5 && <= 4.5
rat:sku:3str: ...
rat:sku:2str: ...
...
rat:cid:5str: Set of customer who bought books with ratings as mentioned above.
rat:cid:4str: ...
..

Dilengkapi dengan set ini, Anda sekarang dapat dengan cepat menemukan hal-hal seperti:

  • Buku fiksi berperingkat 4 ke atas yang dibeli hari ini:  sunionstore rat:sku:4strabv rat:sku:5str rat:sku:5str/sinter rat:sku:4strabv cat :sku:fiksi
  • Pelanggan yang membeli buku dengan bintang 3 ke atas dalam sejarah:sunionstore rat:cid:5strabv rat:cid:3str rat:cid:5str rat:cid:5str/sinter cat:cid:history rat:cid:5strabv

Sekarang, katakanlah Anda ingin mengirim kupon diskon ke semua pelanggan Anda yang membeli buku Astrologi hari ini dengan peringkat 2 atau lebih rendah (sebagai permintaan maaf atas pengalaman buruk karena harus membaca buku itu!). Anda dapat mengekspor daftar ID Pelanggan itu s keluar dan kirimkan ke aplikasi email Anda. Demikian pula, Anda dapat membuat set untuk hal-hal lain yang mungkin ingin Anda tampilkan sebagai filter di Visual Profiler Anda seperti tag, rentang harga, dll.

Keuntungan menggunakan Redis Sets terlihat jelas di sini. Penyimpanan dalam memori akan menghasilkan akses yang sangat cepat sehingga frontend terasa tajam. Selain itu, operasi himpunan Redis adalah waktu konstan atau linier.

Kesimpulan

Dalam posting ini, kami memperkenalkan dengan contoh salah satu Redis Data Structures:Sets yang paling berguna. Berikut adalah beberapa postingan kami yang lain dalam rangkaian struktur data Redis:

  • Hash Redis
  • Redis Bitmap
  • Set Redis
  • Redis Kumpulan yang Diurutkan


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana Redis bisa mengurutkan menurut dua set yang diurutkan berbeda?

  2. Konfigurasi penyebaran redis - replikasi master slave

  3. php-redis - Apakah ada cara untuk menyimpan objek PHP di Redis tanpa membuat serial?

  4. File konfigurasi Tuhan untuk memantau proses yang ada?

  5. Redis filter berdasarkan rentang, urutkan dan kembalikan 10 terlebih dahulu