用 nets 和 nodejs 堆叠字符串

Stacking strings with nets and nodejs

我在使用 Redis 时遇到了问题,文档对我来说不是很清楚,我试图制作一个简单堆栈的所有努力都出了问题。

我使用 nodejs 作为服务器并且 redissocket 我需要列出特定类型的用户他们和房间之间的关系很多很多,像这样:

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 我希望 addremove 来自一个房间的成员,并且 check 如果那个成员在一个房间里,例如 X.

商业规则

  1. MEMBER 可以在多个房间
  2. 该房间不能有 2 名平等成员

进行了以下尝试:

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

None成功。起初它替换了示例中的值,看起来像这样(相同的值按以下顺序插入 member01、member02、member03):

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

在尝试 2、3、4 中,结果是错误的:

{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'}

如何解决?

您的错误直接来自 Redis,问题是您尝试执行的密钥 LPUSH 已经存在并且类型不同。

An introduction to Redis data types and abstractions

出现 WRONGTYPE 错误的示例:

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

我建议你打开一个 redis-shell 并做一个 FLUSHALL 来清理你的数据库