質問

MemcachedとペアになったNOSQL(MongoDB)を使用してセッションをWebAppに使用することを考えています。アイデアは、各ページのロードで、ユーザーデータはMemcacheのデータと比較され、何かが変更された場合、データはMemcachedとMySQLの両方に書き込まれるということです。このようにして、読み取りは大幅に削減され、Memcachedはそれが最善を尽くすことを行います。

ただし、特にMemcachedレイヤーを使用して、セッションストレージに非酸素データベースを使用することに少し心配しています。セッションをDBに更新する際に何かがうまくいかないとしましょう。ユーザーは、カートに入れた製品が表示されない理由を考えて、即座に頭痛を感じました...

これに対する適切なアプローチは何ですか? MySQLセッションストレージに行く必要がありますか、それともセッションのために酸性以外の支持データベースを保持することは問題ありませんか?

ありがとう!

役に立ちましたか?

解決

データを失いたくない場合は、酸性テスト済みのデータベースに固執してください。

あなたが探している見返りは何ですか?

安全なシステムが必要な場合は、ユーザーから何も信用できず、おそらく選択された整数を節約できないため、情報を保存することは通常、本当に悪い考えです。

MySQLデータベースの外にセッションを保存するための見返りは見当たりません。それがあなたの懸念である場合、あなたはテーブルでクリーンアップすることができますが、なぜわざわざなのですか?一部のユーザーはサイトで買い物をしてから、しばらく気を散らします。その後、1日か2日後に戻ってきました。

Cookieや、セッション情報を保存するために本当に一時的なものを使用している場合、彼らの買い物の時間が無駄になった可能性が本当にあります。ユーザーは本当に時間を大切にしています...したがって、データベースにセッション情報を保存した場合、そのデータを管理するためにセクシーなものを書くことができます。

さらに、これの素晴らしい副作用は、あなたのウェブサイトで人々が好きなものについて多くの残りの情報を生成することです。その一部は、人々がカートに追加しているアイテムがビジネスの管理、在庫の注文、マーケティングの焦点に影響を与える可能性があるという投票や何かのようなものであると考えることさえできるように。

あなたが本当に一時的な何かを持って行くならば、あなたは残りの利益を得ることに負けます。

他のヒント

現在、MongoDBをセッションストレージとして使用しています。 Pilifが言及した人種の状態を避けることができます。 Mongodbのセッションハンドラーを実装するクラスを見つけました(http://www.jqueryin.com/projects/mongo-session/)そして、私のニーズに合わせてgithubでそれをフォークしました(http://github.com/halfdan/mongosession).

セッションにロックすることなく、あなたが保存しているものに本当に、本当に注意してください。特に複数のリクエストが一度に出ることができるAjaxの場合、あなたが読んだり執筆の間にデータが変わる可能性があるため、以前に読んだものに依存しているものを決して保存しないでください。

ロックされていないセッションに保存してはならない例は、製品を追加するには、読み取り、安全ではなく、製品を追加してから、再度シリアル化する必要があるため、ショッピングカートです。他の要求が最初のリクエストの読み取りと書き込みの間に同じことをする場合、2番目のリクエストのデータが失われます。

詳細については、この記事をご覧ください。 http://thwartedefforts.org/2006/11/11/race-conditions-with-ajax-and-php-sessions/

ファイルシステム(PHPがロックされる場所)、データベース(手動ロックを実行する必要がある場合)にセッションを保持するか、以前の読み取りからその値が派生した場合、セッションに価値のあるものを書きません。

データベースのキャッシュとしてMemcachedを使用している間、データベースとキャッシュ間のデータの一貫性を確保する必要があるのはユーザーです。スケールアップしてサーバーを追加したい場合は、すべてが問題ないと思われる場合でも、データベースと同期しない可能性があります。

代わりに考慮することができます ヘーゼルキャスト. 。 1.9の時点で、Memcacheプロトコルもサポートしています。 Memcached Hazelcastと比較して、マップを実装することを望んでいます 説教 更新されたエントリのデータベースを更新します。これにより、データがデータベースの更新を変更した場合、「キャッシュを確認する」種類のものを処理する必要はありません。

ユーザーがすべてのセッション情報クライアント側を保存するようにアプリを作成する場合、必要に応じてその情報を確認するだけで、サーバー側のセッションを心配する必要はありません。これは、レストスタイルのアーキテクチャの原則の1つです。たとえば、ユーザーがショッピングカートにアイテムの追加を要求している場合は、ItemIDリストを保存してクライアント側に頼ります。カートページを押すと、カートにいると言っているItemIDのリストからアイテム情報を簡単に調べることができます。

チェックアウト中に、トランザクションを使用してデータベースに直接移動して、レースの条件を取得していないことを確認し、ライブインベントリを確認してください。在庫がチェックアウトしたときに在庫がない場合は、「ごめんなさい、売り切れただけだ」と言ってください。もちろん、その時点で、あなたが持っている人に在庫があると言っているキャッシュを更新する必要があります。

ユーザーが取得するのにどれだけの費用がかかるかを見てから、本当に良いシステムを実装するためのコストは何ですか。ユーザーは生物学的再試行方法であることに注意してください。 「私は退屈しています...再びプレスリロード...」が、これは最も完璧なソリューションではありませんが、「何も失わない」のコスト融合と容認できることもあります。

追加のセキュリティが必要な場合は、セッションをMemcacheサーバーの個別のセットにキャッシュすることができ、偶発的なフラッシュがありません。 :)

他の多くのシステムMembase.org、およびディスクにストレージを持続する他の永続的なMemcacheソリューション(Java実装)があります。クライアントを多少変更したい場合、またはMemcacheにアクセスする方法を変更する場合は、Memcacheセッションオブジェクトの独自の複製を実行できます。

- ダニエル

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top