Apakah Redis hanya sebuah cache?

255

Saya telah membaca beberapa dokumen Redis dan mencoba tutorialnya di http://try.redis-db.com/ . Sejauh ini, saya tidak bisa melihat perbedaan antara Redis dan teknologi caching seperti Velocity atau Framework Caching Perpustakaan Perusahaan

Anda secara efektif hanya menambahkan objek ke penyimpanan data dalam memori menggunakan kunci unik. Sepertinya tidak ada semantik relasional ...

Apa yang saya lewatkan?

Matt Evans
sumber
3
Dari redis.io : Redis adalah open source, key-value store. Ini sering disebut sebagai server struktur data karena kunci dapat berisi string, hash, daftar, set dan set diurutkan. Yang mengatakan, saya memilih untuk menutup pertanyaan Anda karena tidak cocok dengan format StackOverflow.
Linus Thiel
29
Saya setuju ini bukan format SO. Menurut Anda di mana itu akan lebih tepat?
Matt Evans

Jawaban:

631

Tidak, Redis lebih dari sekadar cache.

Seperti Cache, Redis menyimpan kunci = pasangan nilai. Tetapi tidak seperti cache, Redis memungkinkan Anda beroperasi pada nilai-nilai. Ada 5 tipe data dalam Redis - String, Set, Hash, Daftar dan Set Diurutkan. Setiap tipe data memperlihatkan berbagai operasi.

Cara terbaik untuk memahami Redis adalah memodelkan suatu aplikasi tanpa memikirkan bagaimana Anda akan menyimpannya dalam database.

Katakanlah kita ingin membangun StackOverflow.com. Untuk membuatnya sederhana, kita membutuhkan Pertanyaan, Jawaban, Tag dan Pengguna.

Pertanyaan Modeling, Pengguna dan Jawaban

Setiap objek dapat dimodelkan sebagai Peta. Misalnya, Pertanyaan adalah peta dengan bidang {id, judul, date_asked, suara, asked_by, status}. Demikian pula, sebuah Jawaban adalah peta dengan bidang {id, question_id, answer_text, answer_by, suara, status}. Demikian pula, kita dapat memodelkan objek pengguna.

Masing-masing benda ini dapat langsung disimpan di Redis sebagai Hash. Untuk menghasilkan id unik, Anda dapat menggunakan perintah kenaikan atom. Sesuatu seperti ini -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Menangani Suara

Sekarang, setiap kali seseorang menjawab pertanyaan atau jawaban, Anda hanya perlu melakukan ini

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Daftar Pertanyaan untuk Beranda

Selanjutnya, kami ingin menyimpan pertanyaan terbaru untuk ditampilkan di beranda. Jika Anda menulis program .NET atau Java, Anda akan menyimpan pertanyaan dalam Daftar. Ternyata, itu adalah cara terbaik untuk menyimpan ini di Redis juga.

Setiap kali seseorang mengajukan pertanyaan, kami menambahkan idnya ke daftar.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Sekarang, ketika Anda ingin merender beranda, Anda meminta Redis untuk 25 pertanyaan terbaru.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Sekarang setelah Anda memiliki id, ambil item dari Redis menggunakan pipelining dan menunjukkannya kepada pengguna.

Pertanyaan dengan Tag, Diurut berdasarkan Pilihan

Selanjutnya, kami ingin mengambil pertanyaan untuk setiap tag. Tetapi SO memungkinkan Anda untuk melihat pertanyaan pilihan teratas, pertanyaan baru atau pertanyaan yang belum terjawab di bawah setiap tag.

Untuk memodelkan ini, kami menggunakan fitur Set Diurutkan Redis. Set Diurutkan memungkinkan Anda untuk mengaitkan skor dengan setiap elemen. Anda kemudian dapat mengambil elemen berdasarkan skor mereka.

Ayo maju dan lakukan ini untuk tag Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

Apa yang kita lakukan di sini? Kami menambahkan pertanyaan ke set yang diurutkan, dan mengaitkan skor (jumlah suara) untuk setiap pertanyaan. Setiap kali pertanyaan dibatalkan, kami akan menambah nilainya. Dan ketika pengguna mengklik "Pertanyaan yang ditandai Redis, disortir berdasarkan suara", kami hanya melakukan zrevrangedan mendapatkan kembali pertanyaan teratas.

Pertanyaan Waktu Nyata tanpa halaman yang menyegarkan

Dan akhirnya, fitur bonus. Jika Anda membiarkan halaman pertanyaan terbuka, SO akan memberi tahu Anda ketika pertanyaan baru ditambahkan. Bagaimana Redis dapat membantu di sini?

Redis memiliki model pub-sub. Anda dapat membuat saluran, misalnya "channel_questions_tagged_redis". Anda kemudian subscribepengguna ke saluran tertentu. Ketika pertanyaan baru ditambahkan, Anda akan publishmengirim pesan ke saluran itu. Semua pengguna akan mendapatkan pesan. Anda harus menggunakan teknologi web seperti soket web atau komet untuk benar-benar mengirimkan pesan ke browser, tetapi Redis membantu Anda dengan semua pipa ledeng di sisi server.

Kegigihan, Keandalan, dll.

Tidak seperti Cache, Redis tetap menyimpan data pada hard disk. Anda dapat memiliki pengaturan master-slave untuk memberikan keandalan yang lebih baik. Untuk mempelajari lebih lanjut, buka topik Kegigihan dan Replikasi di sini - http://redis.io/documentation

Sripathi Krishnan
sumber
15
Ini juga merupakan bus layanan yang sangat sederhana menggunakan perintah terkait PUB / SUB.
Jim Dennis
3
Bagaimana cara saya mengambil pertanyaan oleh pengguna? Haruskah saya membuat daftar untuk setiap pengguna dengan pertanyaan Anda, seperti pertanyaan: pengguna: 1 atau haruskah saya menggunakan tag?
Diogo Alves
2
penjelasan yang sangat berguna dan detail yang saya lihat di SO
Trong Vu
5

Bukan hanya cache.

  • Dalam penyimpanan nilai kunci memori
  • Mendukung banyak tipe data (string, hash, daftar, set, set diurutkan, bitmap, dan hyperloglogs)
  • Ini memberikan kemampuan untuk menyimpan data cache ke penyimpanan fisik (jika diperlukan).
  • Mendukung model pub-sub
  • Redis cache menyediakan replikasi untuk ketersediaan tinggi (master / slave)
Pankaj Rawat
sumber
4

Redis memiliki kemampuan unik seperti lua-script ultra-cepat. Waktu pelaksanaannya sama dengan eksekusi perintah C. Ini juga membawa atomicity untuk manipulasi data Redis canggih yang diperlukan untuk mengerjakan banyak objek canggih seperti Locks dan Semaphores.

Ada Redis yang berbasis di grid data memori yang disebut Redisson yang memungkinkan untuk dengan mudah membangun aplikasi terdistribusi di Jawa . Berkat didistribusikan Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapobjek dan banyak lainnya.

Sempurna bekerja di cloud dan mendukung AWS Elasticache , AWS Elasticache Cluster dan dukungan Azure Redis Cache

Nikita Koksharov
sumber
1

Sebenarnya tidak ada ketergantungan antara representasi data relatif (atau semua tipe representasi data) dan peran basis data (cache, kegigihan permanen, dll).

Redis baik untuk cache memang benar, tetapi lebih dari sekadar cache. Basis data berkecepatan tinggi dalam memori penuh. Itu tetap ada data pada disk. Ini bukan relasional, ini penyimpanan nilai kunci.

Kami menggunakannya dalam produksi. Redis membantu kami membangun perangkat lunak yang menangani ribuan permintaan per detik dan menyimpan data bisnis pelanggan selama siklus hidup alami.

Denys
sumber
0

Redis adalah cache yang paling cocok untuk arsitektur lingkungan didistribusikan / Microservice.

Itu cepat, dapat diandalkan, memberikan atomicity dan konsistensi dan memiliki berbagai tipe data seperti set, hash, daftar dll.

Saya menggunakannya dari satu tahun terakhir dan itu benar-benar datang sebagai penyelamat ketika Anda perlu memberikan solusi siap produksi dengan sangat cepat dan untuk setiap masalah terkait kinerja karena Anda selalu dapat menggunakannya untuk menyimpan data.

Manvendra Jina
sumber
0

Selain sebagai server cache, Redis secara khusus server struktur data. Menjadi cache dalam bentuk server struktur data sangat berarti, karena struktur data adalah dasar program, atau aplikasi . Pertimbangkan Anda menggunakan database SQL sebagai teknologi penyimpanan dan perlu membuat daftar, peta hash, seperangkat peringkat atau hal-hal seperti itu, agak sakit di leher. Redis dapat menyediakan Anda fungsi-fungsi ini secara langsung dengan cara yang sangat sederhana, sehingga sangat menyederhanakan pengembangan.

Di sisi lain, server struktur data tidak harus dalam bentuk cache. Ada proyek yang kompatibel dengan Redis tetapi memiliki mesin penyimpanan persisten.

不辞 长 做 岭南 人
sumber
0

Redis mendukung struktur data seperti string, hashes, daftar, set, set diurutkan dengan rentang pertanyaan, bitmap, hyperloglog, indeks geospasial dengan kueri dan aliran radius. Redis memiliki replikasi bawaan, skrip Lua, penggusuran LRU, transaksi, dan berbagai tingkat kegigihan pada disk, dan menyediakan ketersediaan tinggi melalui Redis Sentinel dan partisi otomatis dengan Redis Cluster.

implementaion dengan python

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

vijay
sumber