2017-12-01 1 views
1

Ich habe Probleme mit redis, die Dokumentation ist mir nicht klar und alle meine Bemühungen, um einen einfachen Stapel zu machen ist schief gegangen.Stacking Strings mit Netzen und Nodejs

Ich benutze nodejs als Server und redis zusammen mit socket Ich brauche eine Liste von einer bestimmten Art von Benutzer die Beziehung zwischen ihnen und den Räumen zu machen ist, viele zu viele, wie folgt aus:

MEMBERS <-----> ROOMS 

Mehrere Mitglieder können in mehreren Räumen sein, und mehrere Räume können mehrere Mitglieder haben.

All diese Informationen wurden im Speicher zugewiesen, es brachte eine Menge unnötiges Gewicht, daher die Idee, redis zu verwenden, um diese Arten von Verbindungen zu verwalten.

In meinem Code Ich tue dies:

den Service wie folgt beginnen:

const io = require ('socket.io'). listen (http); 
const redisSocket = require ('socket.io-redis'); 
const redis = require ("redis"); 

ich die Verbindungen im socket:

io.sockets.on ('connection', (socket) => {my _functions}); 

Und ich bekomme in ein socket.on die Mitglieder, die ich mit

socket.on ('ioUpdateLocation', (data) => { 
    // Send the location to the devices in the room 
    io.sockets.to (data.room) .emit ('ioReceiveLocation', date); 
    addRoom (data.room, socket.id); 

    // Emits the location for line X destination Y 
    io.sockets.to (data.room + data.destiny) .emit ('ioReceiveLocation', data); 
    addRoom (data.room + data.destiny, socket.id); 
}); 
arbeiten muss

Und so plane ich, wie diese, die Buchse in den Raum stellen:

const addRoom = (room, socketId) => { 
    console.log ('room% s socket% s', room, socketId); 

    redisClient.lpush (room, socketId, function (err, reply) { 
     console.log ('err', err); // prints 2 
     console.log ('reply', reply); // prints 2 
    }); 
    } 

Meine Idee ist es wie folgt aus:

ROOMS | MEMBERS 
123 | ['member01', 'member02', 'member03'] 
123A | ['member01'] 

So redis mit Ich hoffe, add und remove Mitglieder aus einem Zimmer und check wenn das Element in einem Raum zum Beispiel X.

Geschäftsregeln

  1. Mitglied kann in mehreren Räumen sein
  2. Das Zimmer nicht gleich 2 Mitglieder

Mit den Versuchen gemacht haben:

erfolgreich
1- client.set(); 
2- client.hmset(); 
3- client.rpush(); 
4- client.sadd(); 

Keine. Zuerst ersetzt er den Wert im Beispiel würde wie folgt aussehen (die gleichen Werte wurden in der folgenden Reihenfolge MEMBER01, member02, member03 eingefügt):

ROOMS | MEMBERS 
123 | 'member04' 
123A | 'member01' 

Bei Versuchen 2,3,4 das Ergebnis eine war Fehler:

{ReplyError: WRONGTYPE Operation against a key holding the wrong kind of value at new Command (/var/www/lb-api-geolocation/node_modules/redis/lib/command.js:12:22) at RedisClient.lpush (/var/www/lb-api-geolocation/node_modules/redis/lib/commands.js:58:47) at addRoom (/var/www/lb-api-geolocation/src/socket/connect.js:144:17) at Socket. (/var/www/lb-api-geolocation/src/socket/connect.js:94:9) at emitOne (events.js: 115: 13) at Socket.emit (events.js: 210: 7) at /var/www/lb-api-geolocation/node_modules/socket.io/lib/socket.js:513:12 at _combinedTickCallback (internal/process/next_tick.js: 131: 7) at process._tickDomainCallback (internal/process/next_tick.js: 218: 9) command: 'RPUSH', args: ['59c54ace9e450c004ad4c90etripA', 'E4NXUZ417M2UwUxDAAAC'], code: 'WRONGTYPE'}

Wie löst man das?

Antwort

1

Sie Fehler kommt direkt von Redis und das Problem ist, dass der Schlüssel, den Sie versuchen, LPUSH bereits existiert und einen anderen Typ hat.

An introduction to Redis data types and abstractions

Beispiel, warum Sie bekam WRONGTYPE Fehler:

> set foo bar 
OK 
> lpush foo 1 2 3 
(error) WRONGTYPE Operation against a key holding the wrong kind of value 
> type foo 
string 

Ich schlage vor, dass Sie eine redis-Shell öffnen und machen einen FLUSHALL Sie zu reinigen Datenbanken