2011-04-14 20 views
7

Ben REDIS için acemi değilim ve birkaç milyon üye kimlikleri, e-postalar ve adlarının bir veri kümesi var ve liste yapılarında örneğin depolayarak düşünüyorum. Sanırım list ve sorted set benim durumum için en uygun olabilir.Redis yapısı, performansı

Şu anda, bir liste halinde dizin kullanıcı adının ilk harfini kullanıyorum ve arka listesine veri itmek: rpush list:name:a username,member_id. Ancak, liste sıralanmadığı için, milyonlarca girişte belirli bir kaydı almak yavaş olur mu?

Sıralı bir set (sıralandığı için) bu durumda bir listeden daha iyi olacak mı? Ya da, performansı artırmak için başka bir öneriniz var mı?

Kayıtlara erişim anahtarı, kullanıcı adı ve e-posta adresi olmalıdır.

cevap

14

maliyet, pahalı olacaktır ön ya da sonuna yakın olmayan herhangi bir indeks bir liste erişme O (N). Büyük listeler için bu çok verimli değil.

Sarf malzemelerini kullanma ihtiyaçlarınız için daha uygun olabilir. Bu, bir listeden daha fazla bellek kullanır, ancak neredeyse O (1) erişim sağlar.

Redis'teki bir karma, rasgele alanlar ve değerler içerebilen adlandırılmış bir anahtardır.

Sen member_id (umarım bu kısa değerdir) kullanılarak adında tek Redis karma bütün kullanıcı kaydını saklayabilir. ": 42 kullanıcı" member_id kullanıcı başına benzersiz olması sağlanır, burada member_id 42.

hset user:42 email [email protected] 
hset user:42 username foobar 
hset user:42 logincount 0 

Redis "anahtar adı" burada olan kullanıcı için bir karma doldurmak nasıl. Her kullanıcı, SQL veritabanındaki tek bir satıra benzer, ancak daha esnek olan tek bir anahtar alır. Daha sonra iki yardımcı karma'yı güncelleyebilirsiniz: bir kullanıcı üyelerini member_id ile eşlemek ve diğeri de e-posta adreslerini member_id ile eşlemek için. Bu üye_kimliği, kullanıcı adı ve e-posta adresi arasında 1: 1 bir ilişki olduğunu varsayar.

hset username_to_id foobar 42 
hset email_to_id [email protected] 42 

sen, ilk anahtar kullanıcı olarak karma gelen email alanını almak sonra email_to_id karma gelen member_id aramak ve belirli bir kullanıcı için e-posta adresini aramak gerekir

: Aynı şekilde member_id, sen Bir kullanıcı adıyla başlayabilir, username_to_id karma dosyasında member_id'e bakabilir ve daha sonra kullanıcıda saklanan kullanıcı kaydına ulaşabilirsiniz: member_id hash. ": kullanıcı" karma

redis> hget email_to_id [email protected] 
"42" 
redis> hget user:42 username 
"foobar" 
redis> 

Sen daha fazla alan ekleyerek kullanıcıya daha fazla kayıt ekleyebilirsiniz: Burada

bir e-posta adresi verilen kullanıcı adı bakmak için örnektir. Eğer bir giriş sayacını artırmak istiyorsanız, onu da basittir: Sen redis.io sitesinde more information about hashes bulabilirsiniz

redis> hincrby user:42 login_count 1 
(integer) 1 
redis> hgetall user:42 
1. "email" 
2. "[email protected]" 
3. "username" 
4. "foobar" 
5. "login_count" 
6. "1" 
redis> 

.

+0

çok teşekkürler. ancak neden – Leon

+0

setini ayarlamamış veya ayarlamamışsınız, ancak 1 m'lik bir kullanıcı 1m hash id değerine sahipse, özellikle, aldığınız zaman performansı düşürecektir – Leon