Anahtar adlandırma kurallarını yeniden?


226

Redis'teki tuşlar için normal adlandırma kuralı nedir? Değerleri birbirinden ayırarak gördüm :ama normal sözleşmenin ne olduğunu veya nedenini bilmiyorum.

Bir kullanıcı için ...

user:00

kullanıcının kimliği 00

Tüm kullanıcıları döndürmek için anahtarın başlangıcını sorgulayabilir misiniz?

Ben sadece insanlar için işe yarayan yolları ve neden seçtiklerini araştırarak gelecekteki problemlerden kaçınmayı umuyorum.

Yanıtlar:


206

Redis'teki tuşlar için normal adlandırma kuralı nedir? Değerleri birbirinden ayırarak gördüm: Ama normal kuralın ne olduğundan veya neden olduğundan emin değilim.

Evet, iki nokta üst üste işareti :, anahtarları adlandırırken bir kuraldır. Gelen bu Redis web sitesinde öğretici belirtilmektedir: bir şemaya sopa ile deneyin. Örneğin, "object-type: id: field", "user: 1000: password" gibi güzel bir fikir olabilir. "Comment: 1234: answer.to" gibi çoklu sözcük alanları için noktalar kullanmayı seviyorum.

Tüm kullanıcıları döndürmek için anahtarın başlangıcını sorgulayabilir misiniz?

Şununla başlayan tüm anahtarları doğrudan sorgulamak gibi user:bir şey varsa, bunun için bir tuş komutu vardır. Ancak bu komut, O (N) olduğu için yalnızca hata ayıklama amacıyla kullanılmalıdır çünkü veritabanında okunan tüm anahtarları arar.

Bu sorunun daha uygun bir çözüm adıdır izin adanmış anahtarı yaratmaktır users, örneğin, tüm kullanıcıların anahtarları saklar, hangi listeye veya set veri yapısı.


1
scan@EranH seçeneği değil, anahtarları yinelemek için en iyi uygulamadır. scanbir elemanlar koleksiyonu üzerinde aşamalı olarak yineleme yapmak için kullanılır.
Kishor Pawar

2
@ yojimbo87 Yani iki komut olacak diyelim ilk anahtar gibi oluşturmak için - kullanıcı: 808021: password = XYZ ve ikincisi anahtarı kayıt defterine veya dizine (set) koymak, ama bir komut başarıyla yürütüldüğünde ne olur ve diğer başarısız olur anahtarları oluşturulan ancak kayıt defterine giriş almaz anlamına gelir.
LoveToCode

1
@LoveToCode İşlemlerin tamamının veya hiçbirinin yürütülmeyeceğini garanti etmesi gereken işlemi kullanabilirsiniz.
yojimbo87

2
Ayrıca Redis Desktop Manager'ın (bir Redis istemci aracı) ayrıca iki nokta üst üste ':' ayırıcı olarak davrandığını ve birlikte gruplandırılmış birden fazla anahtar görüntülediğini fark ettim
Adam Rotaru

1
Ben benzersiz değerin son olduğunu düşünüyorum. Gibi bir şey yapmak kolaylaştırır:$redis->delete($redis->keys('user:password:*'));
Boya

26

Anahtarların kimlik bölümleri için ad alanı ayırıcısı ve iki nokta üst üste (:) olarak iki nokta üst üste (:) kullanırız, örneğin:

logistics:building#23

Yerel ayar, kategori vb. Gibi daha fazla anahtarınız varsa en iyi ad kuralı hangisidir? {resource}: {anahtar} # {değer}, {anahtar} # {değer} => metinler: yerel ayar # tr, kategori # 15? Yoksa başka bir öneriniz mi var?
fsasvari

1
Örneğimde, "bina" sadece "koleksiyon" un adı ve 23 "özel" id ". Locale = en ve category = 15 olan bir bileşik kimliğiniz varsa, gerçek kimlik {en, 15} olabilir, bu nedenle ad alanı: texts # {en, 15} veya daha ayrıntılı olmak için: namespace: texts # {locale = tr, kategori = 15}. Ama bu sadece bir fikir, daha önce hiç böyle kullanmadım. Anahtar elbette bulunmayacağından, kimlik öğelerinin sırasını değiştirmemeye dikkat edin. Aslında, anahtar adlarınızda böyle bir karmaşıklığı kodlamak yerine, bunun yerine redis veri yapılarını kullanmayı düşünün. Göz at redis.io/topics/indexes
Çivi

16

Bir kural iki nokta üst üste (:) gibi görünüyor ama ben bir web geliştiricisi olarak ben şahsen ayırıcı için eğik çizgi (/) tercih ederim. Eğik çizgi, Tekdüzen Kaynak Konum Belirleyicileri olması gereken URL'ler içinde zaten çok önemli bir ayırıcıdır . Neden iki nokta üst üste (:) ile farklı bir yaklaşım benimsemek? Herhangi bir şeye yardımcı olur mu?

Bu örneği düşünün:

Oyuncak objeler için RESTful API'miz var . Bir tane var:

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

Nerede sakladık? Redis ve eğik çizgileri kullanıyoruz, böylece anahtar açık:

toy/234

Bu oyuncak için eşsiz bir anahtar. Anahtar artık istemci tarafında da kullanılabilir:

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

Kullanıcı anahtarlı bir nesne ister toy/666. Redis'ten nasıl alınır? Node.js ile ilgili bir örnek:

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

Eğik çizgileri iki nokta üst üste işaretine veya tersine dönüştürmeye gerek yoktur. Uygun değil mi?

Not: her zaman kullanıcının yalnızca istediğiniz şeylere erişebildiğinden emin olun. Yukarıdaki ham URL-to-key yaklaşımı user/1/passwordyorumcular tarafından da belirtildiği gibi getirilebilir. Redis'i herkese açık bir salt okunur önbellek olarak kullanırsanız bu sorun olmamalıdır.


24
… Rahat ve neredeyse iğrenç derecede güvensiz. curl http://example.com/api/user/1/password"D" ya da benzerini almak için yalvarıyorsunuz . (Sadece söylüyorum.)
YER ALAN

3
Sütunlar, karmalar ve eğik çizgiler, farklı iç içe yerleştirme düzeylerini belirtmek için kullanılabilir, örneğinUser#23:uploads:my/path/to/file.ext
enkarne

31
Lütfen, kullanıcı girişini asla veritabanının anahtarı olarak almayın.
Lyle

1
Bir web geliştiricisi olduğunuz için eğik çizgileri tercih ettiğinizi düşündüğünüzü seviyorum.
Hector Ordonez

@ELLIOTTCABLE Teşekkürler, güvensizlikler hakkında not eklendi. Redis genel salt okunur önbellek olarak kullanılıyorsa bu yaklaşımda herhangi bir sorun görüyor musunuz?
Akseli Palén

6

Redis anahtar adlandırma için gerçekten yaygın "en iyi uygulamalar" olup olmadığını bilmiyorum.

ASCII NUL karakterlerini ayırıcılar olarak kullanmayı denedim (Redis ve Python'un her ikisi de 8 bitlik temiz olduğundan). Ham anahtarlara bakıyorsanız biraz çirkin görünüyor, ancak fikir onu bir soyutlama katmanının arkasına gizlemek. İki nokta üst üste ve boru sembolleri, ad alanınızın bileşenlerinin ya onları kullanmamaları garanti edildiği ya da her bir bileşeni gerektiği gibi kodlamaya istekli olduğunuz sürece bariz alternatiflerdir. Ancak, onları kodlayacak olursanız, soyutlama katmanını geliştirmek ve yine de ham anahtarları görüntülemekten kaçınmak istersiniz ... bu da beni akıl yürütmemde sadece \ 0 kullanmaya geri getirdi.

Bununla ilgili başka görüşlerin ifade edilip edilmediğini görmek ilginç olacağım.


0

Usecase'iniz için bana göre HSET / HGET daha uygun olurdu. Ayrıca HKEYS var komut.

Tüm bu komutlar GET / SET / KEYS ile aynı karmaşıklığa sahiptir, o zaman neden bunları kullanmıyorsunuz?

O zaman bu yapıya sahip olabilirsiniz:

  • kullanıcılar> 00> değeri
  • kullanıcılar> 01> değer

veya:

  • kullanıcılar: kullanıcı adı> 00> değer
  • kullanıcılar: kullanıcı adı> 01> değer

Sadece kullanıcının kimliğini çıkartın ve hash anahtarı olarak kullanın. Şahsen bu yaklaşımı daha iyi hissettirdiğini ve mevcut kullanıcı kimliklerini kolayca sorgulayabileceğinizi tercih ediyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.