2

私はこれらの技術に不慣れです。

サイトの各製品のリアルタイムの訪問者を取得したい。「X ユーザーがこの製品を見ています」のような通知を意味します。

ユーザーが製品に接続するたびに、この製品のカウンターが増加し、切断されると、この製品だけのカウンターが減少します。

たくさんのドキュメントを検索しようとしましたが、混乱しました。

PHP用のPredisライブラリを使用しています。

私がしたことは完全に間違っているかもしれません。createClient をどこに配置するか、いつ購読するか、いつ購読を解除するかがわかりません。

私がまだやったこと:

商品詳細ページ:

$key = "product_views_".$product_id;
$counter = $redis->incr($key);


$redis->publish("productCounter", json_encode(array("product_id"=> "1000", "counter"=> $counter )));

app.js 内

var app = require('express')()
, server = require('http').createServer(app)
, socket = require('socket.io').listen(server,{ log: false })
, url = require('url')
, http= require('http')
, qs = require('querystring')
,redis   = require("redis");

var connected_socket = 0;

server.listen(8080);

var productCounter  = redis.createClient();     
productCounter.subscribe("productCounter");

productCounter.on("message", function(channel, message){
    console.log("%s, the message : %s", channel, message);
    io.sockets.emit(channel,message);
}

productCounter.on("unsubscribe", function(){
    //I think to decrease counter here, Shold I? and How?
}

io.sockets.on('connection', function (socket) {
    connected_socket++;
    socket_id = socket.id;
    console.log("["+socket_id+"] connected");

    socket.on('disconnect', function (socket) {
           connected_socket--;
           console.log("Client disconnected");
           productCounter.unsubscribe("productCounter");
    });

})

ご回答ありがとうございます。

4

1 に答える 1

1

訪問者があなたの Web サイトを Socket.IO なしの通常の Web サイトとして使用する場合、追跡のアプローチ全体を再考する必要があります。パフォーマンスの問題につながる可能性のあるフロントエンドでの作業なしで効率的に行うには、次のアプローチを考えてください。

私はMongoDBを選択します(同様のアプローチでredisを自由に使用してください)スマート期限切れインデックス作成(これにより、現在の場合に期限切れドキュメントが作成されます-タイムスタンプが10秒より長くなります)
db.views.ensureIndex({ timestamp: 1 }, { expireAfterSeconds: 10 })

そして、迅速なカウントのために製品のインデックスを作成します
db.views.ensureIndex({ product: 1 })

次の構造でドキュメントを作成できます。
_id: '(int)userId'
product: '(int)productId'
timestamp: new Date() (have expire index on this one.)

ユーザーが製品を表示すると、PHP は userId (_id)、productId (製品)、および現在の日時 (タイムスタンプ) を記録します。ドキュメントが見つからない場合に挿入するために、upsert フラグを指定して update を使用します。これにより、1 人のユーザーがその時点で 1 つの製品のみを表示できるようになり、レコードが効率的に期限切れになり、ユーザーが移動した場合は別の製品に切り替えることができます。
db.views.count({ product: 42 })- 製品 42 を表示しているユーザーの現在の数を出力します。

于 2013-06-26T10:18:00.083 に答える