我的目标是构建一个聊天应用程序 - 类似于 whatsapp
据我了解,socket.io 是一个用 javascript 编写的实时通信库,使用起来非常简单
例如
// Serverside
io.on('connection', function(socket) {
socket.on('chat', function(msg) {
io.emit('chat', msg);
});
});
// ClientSide (Using jquery)
var socket = io();
$('form').submit(function(){
socket.emit('chat', $('#m').val());
$('#m').val('');
return false;
});
socket.on('chat', function(msg){
$('#messages').append($('<li>').text(msg));
});
Run Code Online (Sandbox Code Playgroud)
1)我是否总是需要启动一个io.on('connection')来使用实时功能,或者我可以开始使用socket.on对象来代替?例如我有一条路线
app.post('/postSomething', function(req, res) {
// Do i need to start an io.on or socket.on here?
});
Run Code Online (Sandbox Code Playgroud)
因为我希望实时功能仅在特定路线上收听。
2)Redis是一个处理pub/sub的数据结构库,为什么需要使用pub/sub机制?我阅读了很多文章,但无法掌握其中的概念。文章示例http://ejosh.co/de/2015/01/node-js-socket-io-and-redis-intermediate-tutorial-server-side/
例如下面的代码
// Do i need redis for this, if so why? is it for caching purposes? …Run Code Online (Sandbox Code Playgroud) 我正在使用 Redis 和 Node JS 做一个小项目 - Redis 客户端“ node_redis ”。问题是,要获取键的值,有不同的 get 函数,例如对于字符串和整数类型有 client.get,对于数组类型有 client.lrange() 等。那么如何确定使用哪个函数来获取value 如果所需的值类型未知,是否有办法识别值类型。
我有一个express服务器,我正在使用connect-rediswithexpress-session将会话存储到我的 elasticache 实例。但是应用程序仅尝试连接到本地主机。这是错误:-
config.redisServer.host dev-xxx-site-cache.xxxxx.0001.use1.cache.amazonaws.com
listening on {"address":"::","family":"IPv6","port":8080}...
events.js:141
throw er; // Unhandled 'error' event
^
Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
at Object.exports._errnoException (util.js:856:11)
at exports._exceptionWithHostPort (util.js:879:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1062:14)
Run Code Online (Sandbox Code Playgroud)
在代码中,我提供了正确的主机:-
const RedisStore = require('connect-redis')(expressSession);
const redisClient = redis.createClient({ host: config.redisServer.host, port: config.redisServer.port });
redisClient.on('error', err => console.error(err));
Run Code Online (Sandbox Code Playgroud) 如何在 redis-node 中使用 Redis 流。
XADD 的 Redis 文档是:
XADD mystream * key1 "Value1" key2 "Value2"
Run Code Online (Sandbox Code Playgroud)
这将添加具有给定键值对的单个条目。* 指定 id 应自动生成。
我尝试在 Node 中执行它:
redisClient.xadd("myStream", "*", "name", "anant");
Run Code Online (Sandbox Code Playgroud)
但我刚刚收到一条错误消息,指出 XADD 未定义。
INCR mykey初始化为 0 并将值增加到 1。我将如何mykey在同一个命令中将过期时间设置为 ,就像它可以完成的那样SETEX?
我正在使用jest并尝试使用redis-mock来模拟node-redis。
// redis.js
const redis = require("redis");
const client = redis.createClient({ host: '127.0.0.1', port: 6379 });
// redis.test.js
const redisMock = require("redis-mock");
describe("redis", () => {
jest.doMock("redis", () => jest.fn(() => redisMock));
const redis = require("./redis");
});
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,出现错误
类型错误:redis.createClient 不是函数
我觉得我在使用时做错了什么jest.doMock()。
感谢您的帮助。
我正在使用 Redis 在 TypeOrm 中缓存查询。
但问题是,TypeOrm 和 Redis 包正在打开单独的连接,我只想为两者重用相同的连接。
这是 typeorm 配置:
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { Constants } from '../utils/Constants';
export const typeOrmConfig: TypeOrmModuleOptions = {
type: Constants.DB_TYPE,
host: Constants.DB_HOST,
port: Constants.DB_PORT,
username: Constants.DB_USER_NAME,
password: Constants.DB_PASSWORD,
database: Constants.DB_NAME,
entities: [ __dirname + '/../**/*.entity.{js,ts}' ],
synchronize: true,
logging: true,
cache: {
type: 'ioredis',
duration: 60000,
options: {
host: 'localhost',
password: 'swapnil',
port: 6379
}
},
extra: {
max: 10,
connectionTimeoutMillis: 2000
}
};
Run Code Online (Sandbox Code Playgroud)
我正在为 redis使用@svtslv/nestjs-ioredis包:
import …Run Code Online (Sandbox Code Playgroud) 首先,先来说说细节:
节点版本:v16
使用redislabs云(v6.2.3)
npm 包 redis 版本 4.0.3
这是代码...
const redis = require("redis");
require("dotenv").config();
const client = redis.createClient({
host: process.env.REDIS_URI,
port: process.env.REDIS_PORT,
password: process.env.REDIS_PASSWORD
});
client.on("connect", () => {
console.log("Connected to our redis instance!");
client.set("iAmAKey", "Value");
});
Run Code Online (Sandbox Code Playgroud)
运行时它不会输出任何内容:(并且只是在一段时间后退出。
任何帮助将不胜感激。谢谢!
我正在使用Redis的发布/订阅功能.因此,服务器发布10个项目,然后客户端获取这10个项目.
然而,现在,新客户订阅了订阅源.我希望他们能够获得前10个项目以及任何新项目.
Redis是否有办法使用发布和订阅功能?源记录是否存储在数据库中的任何位置?有这么简单的方法吗?是将邮件存储在列表中并让客户端LRANGE my_list 0 10在列表中执行操作的最佳方法吗?
Redis Sorted Sets 主要基于 Score 进行排序;但是,在多个成员共享相同 Score 词典(Alpha)排序的情况下。在Redis的zadd文件表示该功能的复杂性:
"O(log(N)) 其中 N 是排序集中的元素数"
无论成员大小/长度如何,我都必须假设这仍然是正确的;但是,我有一个案例,只有 4 个分数导致成员在 Score 之后按字典顺序排序。
我想为每个成员添加一个时基键,以使二级排序基于时间,并为成员添加一些唯一性。就像是:
"time-based-key:member-string"
Run Code Online (Sandbox Code Playgroud)
我的成员字符串可以是更大的 JavaScript 对象文字,如下所示:
JSON.stringify( {/* object literal */} )
Run Code Online (Sandbox Code Playgroud)
排序集 zadd 和其他功能的性能会保持不变吗?
如果没有,性能会受到多大程度的影响?
我node redis用来连接Redis。
zscanRedis提供的功能不会按顺序返回元素。我想知道是否有javascript图书馆可以帮助我做到这一点。
我有一个原子操作,我需要使用一个锁来防止其他客户端读取不稳定的值。
根据官方文档,解决方案是与WATCH一起使用MULTI:
现在,MULTI已记录了的用法,我对如何使用它有了一个大致的了解。
var redis = require( "redis" );
var bluebird = require( "bluebird" );
var client = redis.createClient();
var multi = client.multi();
multi.hsetAsync( "test", "array", "[1, 2]" );
multi.hgetAsync( "test", "array" );
multi.execAsync( ).then( console.log ); // [ 0, "[1, 2]" ]
Run Code Online (Sandbox Code Playgroud)
我了解这是multi的正确实现。首先,我需要创建一个客户端,然后创建一个多查询。
我理解这multi并client共享相同的接口,但是也不清楚我使用hgetAsync而不是hget在multi查询中有什么好处(因为有的话),因为我假设multi所做的全部工作就是将所述请求同步添加到队列中(因此我不需要Aart vartiant)。
调用multi.execAsync( )后,查询的执行将自动进行。 …
假设我有一个 JavaScript 对象,其结构如下:
{
id: "someUniqueId",
foo: "otherData",
bar: 30
}
Run Code Online (Sandbox Code Playgroud)
我想在RedisJSON中存储数百个。我目前正在使用node-redis 客户端将密钥初始化'json-objects'为空对象:
await client.json.set('json-objects', `$`, {});
Run Code Online (Sandbox Code Playgroud)
然后,我将对象添加到该键的根对象,例如:
const dataToStore = {
id: "someUniqueId",
foo: "otherData",
bar: 30
}
await client.json.set('json-objects', `$.${dataToStore.id}`, dataToStore as any);
Run Code Online (Sandbox Code Playgroud)
这会导致键下出现一个大对象,'json-objects'如下所示:
{
"someUniqueId-1": {
id: "someUniqueId-1",
foo: "otherData",
bar: 30
},
"someUniqueId-2": {
id: "someUniqueId-2",
foo: "otherData2",
bar: 31
},
"someUniqueId-3": {
id: "someUniqueId-3",
foo: "otherData3",
bar: 32
},
and so on...
}
Run Code Online (Sandbox Code Playgroud)
然后我可以使用路径查询和更新:
await client.json.set('json-objects', `$.${id}.foo`, "someUpdatedData"); …Run Code Online (Sandbox Code Playgroud) node-redis ×13
redis ×10
node.js ×8
javascript ×5
jestjs ×1
nestjs ×1
nginx ×1
node-modules ×1
redis-cli ×1
redisjson ×1
socket.io ×1
sorting ×1
typeorm ×1
typescript ×1