2013-07-23 12 views
7

Zuerst der Kontext, ich versuche, Redis als In-Memory-Speicher mit Persistenz unterstützt. Ich muss eine große Anzahl von Objekten (Millionen) in einem Redis Hash speichern.Redis: Gibt es eine Grenze für die Anzahl der Schlüssel, die ich speichern kann?

Zur gleichen Zeit möchte ich nicht meine redis-Instanz zu viel Speicher verbrauchen. Also habe ich die Eigenschaft maxmemory in redis.conf auf 100mb gesetzt. Ich habe gesetzt maxmemory-policy als allkeys-random Die Persiste Modus ist AOF und Fysnc ist jede Sekunde.

Jetzt das Problem iam konfrontiert ist, jedes Mal, wenn ich versuche, mehr als zweihunderttausend Objekte im Hash zu speichern, wird der Hash zurückgesetzt (dh alle vorhandenen Schlüsselwerte im Hash verschwindet). Ich bestätige dies, indem ich den Befehl hlen auf dem Hash im redis-cli verwende.

unterhalb des Objekts im Finden

public class Employee implements Serializable { 

private static final long serialVersionUID = 1L; 
int id; 
String name; 
String department; 
String address; 

    /* Getters and Setters */ 

    /* Hashcode - Generates hashcode (key) for each object */ 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((address == null) ? 0 : address.hashCode()); 
    result = prime * result + ((department == null) ? 0 : department.hashCode()); 
    result = prime * result + id; 
    result = prime * result + ((name == null) ? 0 : name.hashCode()); 
    return result; 
} 
} 

Auch zu speichern versuchen, unter dem Code finden, der in redis (Im mit Jedis mit Redis zu interagieren) speichert

JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "localhost"); 
    Jedis jedis = (Jedis) jedisPool.getResource(); 

    System.out.println("Starting...."); 
    for(int i=0;i<1000000;i++) { 

      /* Converting object to byte array */ 
     Employee employee = new Employee(i, "Arun Jolly", "IT", "SomeCompany"); 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); 
     objectOutputStream.writeObject(employee); 
     byte[] value = byteArrayOutputStream.toByteArray(); 

     /* Creating key in byte array format using hashCode() */ 
     ByteBuffer buffer = ByteBuffer.allocate(128); 
     buffer.putInt(employee.hashCode()); 
     byte[] field = buffer.array(); 

      /* Specyfying the Redis Hash in byte array format */ 
     String tableName = "Employee_Details"; 
     byte[] key = tableName.getBytes(); 

     jedis.hset(key, field, value); 
     System.out.println("Stored Employee "+i); 
    } 

ich etwas fehle?

Bedeutet dies, dass redis nicht auf den Datenträger austauscht, sobald der maximale Speicher erreicht ist (Wird versucht, alle Schlüsselwerte im Speicher zu halten?) Bedeutet es, dass ich das maximale Speicherlimit schrittweise erhöhen muss Erhöhung der Anzahl der Schlüssel-Wert-Paare, die ich möglicherweise speichern muss?

Antwort

8

Fehle ich etwas?

Ja. Redis ist ein reiner In-Memory-Speicher mit Persistenzoptionen. Alles muss in die Erinnerung passen.

Bedeutet dies, dass redis auslagern nicht auf die Festplatte, sobald die MaxMemory erreicht ist.

Genau.

Wird versucht, alle Schlüsselwerte im Speicher zu halten?

Schlüssel und Werte, ja.

Bedeutet es, dass ich nach der MaxMemory Grenze erhöhen muß, um schrittweise auf die Erhöhung der Anzahl von Schlüssel-Wert-Paaren, die ich zu speichern haben könnte?

Sie müssen im Voraus entscheiden, wie viel Speicher Sie Redis zuweisen, ja.

Wenn Sie Speicherbeschränkungen haben, werden Sie mit einem festplattenbasierten Speicher besser bedient.

+0

Das ist also ein Problem Skalierbarkeit mit Redis richtig? Bedeutet dies, dass redis nicht als primärer Datenspeicher verwendet werden soll? (Tut mir leid, die gleiche Frage auf andere Weise zu stellen ... aber ich muss absolut sicher sein, bevor ich darüber eine Entscheidung treffe). Können Sie eine andere nosql db vorschlagen, die diese Einschränkungen nicht aufweist? (etwas, das als primärer Datenspeicher verwendet werden kann) –

+5

Es ist kein Skalierbarkeitsproblem, es ist eine bewusste Entscheidung, nur In-Memory-Datenbanken zu unterstützen, die auf optimale Leistung abzielen. Festplatten-I/Os sind zu langsam. Redis kann als primärer verwendet werden Datenspeicher, vorausgesetzt, Sie haben genug Speicher.Wenn Ihr Datenvolumen nicht in den Speicher passt, sollten Sie sich Lösungen wie MongoDB oder Couchbase ansehen, aber erwarten Sie nicht die gleiche rohe Leistung ... –

Verwandte Themen