簡體   English   中英

在node.js中,如何使用socket.io和express設置redis?特別是使用RedisStore()

[英]In node.js, how do I setup redis with socket.io and express? Specifically using RedisStore()

第一個問題
我正在試圖找出會話,商店,授權和redis。 如果這很重要,我使用的是Express@3.0.0rc4 我知道我有兩個選項來放置我的RedisStore() 我用哪一個? 我同時使用兩者嗎?

express.session({secret: 'secret', key: 'key', store: new RedisStore()});
io.set('store', new RedisStore());

我已經運行了node.jsexpresssocket.io . 所以現在我正在嘗試實現redis但我不知道如何使用會話/存儲實現授權,我不知道如何寫入redis數據庫。 我還沒有找到任何相關文檔。 我找到了一個使用socket.io和express但沒有redis討論會話和商店的網站,另一個討論使用所有三個會話和商店的網站,但它沒有使用io.set('store', ...)

我也不知道我是否應該使用兩個不同的商店,一個用於express ,一個用於socket.io ,或者我應該只使用一個。 請查看示例以獲得澄清:

//Redis Variables
var redis = require('socket.io/node_modules/redis');
var RedisStore = require('socket.io/lib/stores/redis');
var pub = redis.createClient();
var sub = redis.createClient();
var client = redis.createClient();
var redis_store = new RedisStore({
                        redisPub: pub,
                        redisSub: sub,
                        redisClient: client
                      });

app.configure(function(){
  //...code goes here...
  app.use(express.session({
                    secret: 'secret',
                    key: 'key',
                    store: redis_store  //Notice I'm using redis_store
                  }));
  //...more code...
});

io.configure(function(){
  io.set('store', redis_store);  //Notice it's the same RedisStore() being used
});

我是否每個都使用相同的RedisStore() 我是否為每個創建單獨的? 我只使用expresssocket.io嗎? 我真正想要的是能夠驗證客戶端(我假設通過會話完成)並讓他們在連接時更新redis數據庫 - 記錄人們訪問我的網站的時間。 這導致了我的第二個問題。


第二個問題
所以我不知道如何從這一點訪問和編輯redis數據庫。 由於我的第一個問題,我無法測試這個,但我認為它會是這樣的:

 io.sockets.on('connection', function(socket){ var session = socket.handshake.session; redis.put(session); }); 

我還沒有看到任何關於如何從node.js中更新redis數據庫的文檔,所以我非常懷疑 redis.put()是正確的術語哈哈。 我訪問過redis的網站,但我找不到node.js的命令。 只是命令從命令行使用常規redis。 無論如何,如果有人能夠至少指出我正確的方向,那將是偉大的。 謝謝。 :)

正如您所見,Express和Socket.IO有自己的集成Redis進行會話管理。 它被設計為黑盒集成,其理念是會話存儲實現獨立於其他代碼。 由於它是獨立的,這意味着您無法進入並使用express或socket.io直接訪問Redis。 您需要添加一個常規的redis客戶端,如node_redis。 好處是您不必擔心自己進行所有redis調用,而是要與express或socket.io的會話存儲接口進行交互。

所以在你的#1情況下,你可以傳遞一個新的RedisStore實例,而不是你已經完成的兩個新實例。 或者你可以按照你的第二個鏈接,讓socket.io通過快遞聽。 在這種情況下,它將與快速會話管理集成。 這就是為什么在這個例子中你沒有看到額外的io.set('store')調用的原因。

這對你來說似乎是多余的,但試着將RedisStore視為專為會話管理而設計的特殊客戶端。 即使認為RedisStore可能依賴於node_redis之類的東西,也不應該嘗試訪問它。 您必須包含另一個庫才能直接訪問您的redis數據庫,假設您希望首先將其他非會話項存儲在redis中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM