У меня проблемы с Redis, документация мне непонятна, и все мои попытки создать простой стек пошли наперекосяк.
Я использую nodejs
как сервер и redis
вместе с socket
мне нужно составить список определенного типа пользователей отношение между ними и комнатами многие ко многим, вот так:
MEMBERS <-----> ROOMS
Несколько членов могут находиться в нескольких комнатах, а в нескольких комнатах может быть несколько членов.
Вся эта информация размещалась в памяти, приносила много лишнего веса, отсюда и идея использовать redis для управления этими типами соединений.
В моем коде я делаю это:
Запустите службу следующим образом:
const io = require ('socket.io'). listen (http);
const redisSocket = require ('socket.io-redis');
const redis = require ("redis");
Я получаю соединения в socket
:
io.sockets.on ('connection', (socket) => {my _functions});
И я получаю socket.on
участников, с которыми мне нужно работать
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);
});
И поэтому я планирую поставить эту розетку в комнате вот так:
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
});
}
Моя идея такова:
ROOMS | MEMBERS
123 | ['member01', 'member02', 'member03']
123A | ['member01']
Таким образом, используя redis
, я надеюсь add
и remove
участников из комнаты и check
, если этот участник находится в комнате, например, X.
БИЗНЕС-ПРАВИЛА
- MEMBER может находиться в нескольких комнатах
- В комнате не может быть 2 равных участников
С попытками было сделано:
1- client.set ();
2- client.hmset ();
3- client.rpush ();
4- client.sadd ();
Ни один успешно. Сначала замененное значение в примере выглядело бы так (те же значения были вставлены в следующем порядке member01, member02, member03):
ROOMS | MEMBERS
123 | 'member04'
123A | 'member01'
В попытках 2,3,4 результатом была ошибка:
{ReplyError: WRONGTYPE Операция с ключом, содержащим неверное значение в новой команде (/var/www/lb-api-geolocation/node_modules/redis/lib/command.js:12:22) в RedisClient.lpush (/var /www/lb-api-geolocation/node_modules/redis/lib/commands.js:58:47) в addRoom (/var/www/lb-api-geolocation/src/socket/connect.js:144:17) в Разъем. (/var/www/lb-api-geolocation/src/socket/connect.js:94:9) в emitOne (events.js: 115: 13) в Socket.emit (events.js: 210: 7) в / var/www/lb-api-geolocation/node_modules/socket.io/lib/socket.js:513:12 at _combinedTickCallback (внутренний/process/next_tick.js:131:7) at process._tickDomainCallback (внутренний/process/next_tick .js: 218: 9) команда: 'RPUSH', аргументы: ['59c54ace9e450c004ad4c90etripA', 'E4NXUZ417M2UwUxDAAAC'], код: 'WRONGTYPE'}
Как это решить?