ホームページ >データベース >Redis >Node.js と Redis を使用したオンライン投票アプリケーションの構築: 高い同時実行性を処理する方法

Node.js と Redis を使用したオンライン投票アプリケーションの構築: 高い同時実行性を処理する方法

WBOY
WBOYオリジナル
2023-07-29 21:17:101623ブラウズ

Node.js と Redis を使用したオンライン投票アプリケーションの構築: 高い同時実行性を処理する方法

インターネットの発展に伴い、より多くのアプリケーションが高い同時実行性の状況を処理する必要があります。オンライン投票アプリケーションは典型的な同時実行性の高いシナリオです。ユーザーは短期間に大量の投票リクエストを送信します。アプリケーションはこれらのリクエストを迅速に処理し、データの一貫性を維持できる必要があります。この記事では、Node.js と Redis を使用して同時実行性の高いオンライン投票アプリケーションを構築する方法を紹介します。

  1. Redis の概要

Redis は、高速な読み書きと豊富なデータ構造のサポートで人気のあるメモリベースのキー/値データベースです。この記事では、Redis を使用して投票データを保存し、そのアトミック操作を利用してデータの一貫性を確保します。

  1. アーキテクチャ設計

大量の同時投票リクエストに対処するために、次のアーキテクチャ設計を採用しました:

  • フロントエンド ページ: HTML を使用 CSS でユーザー インターフェイスを構築し、Ajax 経由で Node.js サーバーに投票リクエストを送信します。
  • Node.js サーバー: 各投票リクエストを処理し、Redis を使用して投票データの読み取りと書き込みを行います。
  • Redis データベース: 投票データを保存し、同時実行制御のためのアトミック操作を提供します。
  1. コードの実装

次は、Node.js サーバー側のコード例です。

const express = require('express');
const redis = require('redis');

// 创建Express应用
const app = express();

// 创建Redis客户端
const redisClient = redis.createClient();

// 处理投票请求
app.post('/vote', (req, res) => {
  const { option } = req.body;

  // 增加投票计数
  redisClient.incr(option, (err, result) => {
    if (err) {
      // 投票失败的处理
      res.status(500).json({ error: '投票失败' });
    } else {
      // 投票成功的处理
      res.status(200).json({ success: '投票成功' });
    }
  });
});

// 启动服务监听
app.listen(3000, () => {
  console.log('服务器已启动');
});

上記のコードでは、最初にExpress および Redis モジュールを追加し、Express アプリケーションと Redis クライアントを作成しました。 app.post('/vote', ...) 関数は投票リクエストの処理に使用され、対応するオプションは redisClient.incr(option, ...)# を呼び出すことで実装されます。 ## 投票数が増加します。投票が成功すると 200 ステータス コードが返され、投票が失敗すると 500 ステータス コードが返されます。

    同時実行制御
同時実行性が高い場合、複数のユーザーが同じオプションに同時に投票すると、データの不整合が発生します。この問題を解決するには、同時実行制御のために Redis が提供するアトミック操作を使用できます。

// 获取锁
redisClient.get('vote_lock', (err, result) => {
  if (result) {
    // 已经有其他用户正在投票,处理投票失败的逻辑
    res.status(500).json({ error: '投票失败' });
  } else {
    // 获取锁成功,可以进行投票
    // 设置超时时间,防止异常情况下锁没有被释放
    redisClient.setex('vote_lock', 10, 'locked');

    // 增加投票计数
    redisClient.incr(option, (err, result) => {
      if (err) {
        // 投票失败的处理
        res.status(500).json({ error: '投票失败' });
      } else {
        // 投票成功的处理
        res.status(200).json({ success: '投票成功' });
      }

      // 释放锁
      redisClient.del('vote_lock');
    });
  }
});

上記のコードは、Redis の

get および setex 操作を使用して単純なロック メカニズムを実装し、同時に 1 人のユーザーのみが投票できるようにしています。投票が終了したら、ロックを解除します。

    概要
この記事では、Node.js と Redis を使用して高度な同時オンライン投票アプリケーションを構築する方法を紹介します。 Redis のアトミック操作とシンプルなロック メカニズムを使用することで、多数の同時投票リクエストを処理し、データの一貫性を維持することができます。この記事が、高度な同時実行処理を理解するのに役立つことを願っています。

以上がNode.js と Redis を使用したオンライン投票アプリケーションの構築: 高い同時実行性を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。