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
- Mitglied kann in mehreren Räumen sein
- Das Zimmer nicht gleich 2 Mitglieder
Mit den Versuchen gemacht haben:
erfolgreich1- 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?