Konvensi penamaan kunci redis?

226

Apa konvensi penamaan normal untuk kunci di redis? Saya telah melihat nilai-nilai dipisahkan oleh :tetapi saya tidak yakin apa itu konvensi normal, atau mengapa.

Untuk pengguna, bisakah Anda melakukan sesuatu seperti ...

user:00

jika id pengguna adalah 00

Apakah Anda dapat meminta hanya awal kunci untuk mengembalikan semua pengguna?

Saya hanya berharap untuk menghindari masalah di masa depan dengan meneliti cara-cara yang bekerja untuk orang-orang dan mengapa mereka memilih mereka.

mewah
sumber

Jawaban:

205

Apa konvensi penamaan normal untuk kunci di redis? Saya telah melihat nilai-nilai dipisahkan oleh: tetapi saya tidak yakin apa itu konvensi normal, atau mengapa.

Ya, tanda titik dua :adalah konvensi saat penamaan kunci. Dalam tutorial ini pada situs web redis dinyatakan: Cobalah untuk tetap dengan skema. Misalnya "objek-jenis: id: bidang" bisa menjadi ide yang bagus, seperti di "pengguna: 1000: kata sandi". Saya suka menggunakan titik untuk bidang multi-kata, seperti di "komentar: 1234: reply.to".

Apakah Anda dapat meminta hanya awal kunci untuk mengembalikan semua pengguna?

Jika maksud Anda seperti meminta secara langsung untuk semua kunci yang dimulai dengan user:ada perintah kunci untuk itu. Namun perintah ini harus digunakan hanya untuk tujuan debugging karena itu O (N) karena mencari melalui semua kunci yang disimpan dalam database.

Solusi yang lebih tepat untuk masalah ini adalah membuat kunci khusus, sebut saja namanya users, yang akan menyimpan semua kunci pengguna, misalnya, dalam daftar atau mengatur struktur data.

yojimbo87
sumber
1
scanbukan opsi @EranH., itu adalah praktik terbaik untuk beralih tombol. scandigunakan untuk secara bertahap beralih pada koleksi elemen.
Kishor Pawar
2
@ yojimbo87 Jadi akan ada dua perintah katakanlah pertama adalah membuat kunci seperti - pengguna: 808021: kata sandi = XYZ dan yang kedua adalah memasukkan kunci ke dalam registri atau indeks (set), tetapi apa yang akan terjadi ketika satu perintah dieksekusi dengan sukses dan lainnya gagal berarti kunci dibuat tetapi tidak mendapatkan entri dalam registri.
LoveToCode
1
@LoveToCode Anda dapat menggunakan transaksi yang harus menjamin bahwa semua atau tidak ada operasi akan dieksekusi.
yojimbo87
2
Saya juga memperhatikan bahwa Redis Desktop Manager (alat klien Redis) juga memperlakukan titik dua ':' sebagai pemisah, dan menampilkan beberapa kunci yang dikelompokkan bersama
Adam Rotaru
1
Saya berpendapat bahwa nilai unik menjadi yang terakhir. Memudahkan untuk melakukan sesuatu seperti:$redis->delete($redis->keys('user:password:*'));
Crayons
26

Kami menggunakan titik dua (:) sebagai pemisah namespace dan hash (#) untuk id-bagian dari kunci, misalnya:

logistics:building#23
Kuku
sumber
Apa konvensi nama terbaik jika Anda memiliki lebih banyak kunci seperti lokal, kategori dll? {resource}: {key} # {value}, {key} # {value} => teks: locale # en, kategori # 15? Atau Anda punya saran lain?
fsasvari
1
Dalam contoh saya, "bangunan" hanyalah nama "koleksi", dan 23 adalah "id" khusus. Jika Anda memiliki id komposit dengan lokal = en dan kategori = 15, maka id sebenarnya bisa {en, 15}, jadi namespace: teks # {en, 15}, atau lebih verbose: namespace: teks # {locale = id, kategori = 15}. Tapi ini hanya sebuah ide, saya belum pernah menggunakannya seperti ini. Berhati-hatilah untuk tidak mengubah urutan elemen id, karena kuncinya tidak akan ditemukan tentu saja. Sebenarnya, alih-alih menyandikan kerumitan seperti itu dalam nama kunci Anda, pertimbangkan untuk menggunakan struktur data redis saja. Lihatlah redis.io/topics/indexes
The Nail
16

Sebuah konvensi sepertinya adalah titik dua (:) tapi saya seorang pengembang web jadi saya pribadi lebih suka slash (/) untuk separator. Slash sudah merupakan pemisah yang sangat penting di dalam URL yang dimaksudkan sebagai Uniform Resource Locators, jadi semacam kunci untuk sumber daya. Mengapa mengambil pendekatan berbeda dengan titik dua (:)? Apakah ada gunanya?

Pertimbangkan contoh ini:

Kami memiliki API tenang untuk objek mainan. Ada satu:

http://example.com/api/toy/234 

Di mana kita menyimpannya? Kami menggunakan Redis dan garis miring sehingga kuncinya jelas:

toy/234

Ini adalah kunci unik untuk mainan itu. Kuncinya sekarang dapat digunakan juga di sisi klien:

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

Seorang pengguna meminta objek dengan kunci toy/666. Bagaimana cara mendapatkannya dari Redis? Contoh terkait Node.js:

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

Tidak perlu mengubah garis miring menjadi titik dua dan sebaliknya. Nyaman, bukan begitu?

Catatan: selalu memastikan bahwa pengguna hanya dapat mengakses hal-hal yang Anda maksudkan. Pendekatan URL-to-key mentah di atas dapat mengambil user/1/passwordjuga, seperti dicatat oleh komentator. Ini seharusnya tidak menjadi masalah jika Anda menggunakan Redis sebagai cache read-only publik.

Akseli Palén
sumber
24
... nyaman, dan hampir tidak aman menjijikkan . Anda memohon untuk mendapatkannya curl http://example.com/api/user/1/password, atau serupa. (Katakan saja.)
DAPAT DITERIMA
3
Usus besar, hash dan garis miring dapat digunakan untuk menunjuk berbagai tingkat persarangan, misalnyaUser#23:uploads:my/path/to/file.ext
menjelma
31
Tolong, jangan pernah mengambil input pengguna sebagai kunci ke dalam basis data.
Lyle
1
Saya suka bagaimana Anda pikir Anda lebih suka garis miring karena Anda adalah seorang pengembang web.
Hector Ordonez
@ELLIOTTCABLE Terima kasih, menambahkan catatan tentang rasa tidak aman. Apakah Anda melihat ada masalah dalam pendekatan ini jika Redis digunakan sebagai cache read-only publik?
Akseli Palén
6

Saya tidak tahu apakah benar-benar ada "praktik terbaik" yang meluas untuk penamaan kunci Redis.

Saya telah bereksperimen dengan menggunakan karakter ASCII NUL sebagai pemisah saya (karena Redis dan Python keduanya 8-bit clean). Ini terlihat agak jelek jika Anda melihat kunci mentah, tetapi idenya adalah menyembunyikannya di balik lapisan abstraksi. Simbol titik dua dan pipa adalah alternatif yang jelas selama komponen ruang nama Anda dijamin tidak akan menggunakannya atau Anda bersedia menyandikan setiap komponen sesuai kebutuhan. Namun, jika Anda akan menyandikannya, maka Anda ingin mengembangkan lapisan abstraksi dan menghindari melihat kunci mentah ... yang membawa saya kembali ke hanya menggunakan \ 0 dalam alasan saya.

Saya akan menarik melihat apakah ada pendapat lain yang diartikulasikan tentang ini.

Jim Dennis
sumber
0

Bagi pengguna kami, menurut saya HSET / HGET akan lebih cocok. Ada juga HKEYS perintah .

Semua perintah tersebut memiliki kompleksitas yang sama dengan GET / SET / KEYS, jadi mengapa tidak menggunakannya?

Anda dapat memiliki struktur ini kemudian:

  • pengguna> 00> nilai
  • pengguna> 01> nilai

atau:

  • pengguna: nama pengguna> 00> nilai
  • pengguna: nama pengguna> 01> nilai

Cukup ekstrak ID pengguna dan gunakan sebagai kunci hash. Saya pribadi lebih suka pendekatan ini karena rasanya lebih bagus dan Anda juga dapat dengan mudah meminta ID pengguna yang ada.

vitro
sumber