用 nets 和 nodejs 堆叠字符串
Stacking strings with nets and nodejs
我在使用 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 ();
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
来清理你的数据库
我在使用 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 ();
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
来清理你的数据库