我遇到了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.
业务规则
尝试了:
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) 在Socket。 (/var/www/lb-api-geolocation/src/socket/connect.js:94:9) 在emitOne(events.js:115:13) 在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) 命令:'RPUSH', args:['59c54ace9e450c004ad4c90etripA','E4NXUZ417M2UwUxDAAAC'], 代码:'WRONGTYPE'}
如何解决这个问题?
答案 0 :(得分:1)
您的错误直接来自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
清理数据库