Rumah  >  Artikel  >  pangkalan data  >  Membina aplikasi pengundian dalam talian menggunakan Node.js dan Redis: Cara mengendalikan konkurensi tinggi

Membina aplikasi pengundian dalam talian menggunakan Node.js dan Redis: Cara mengendalikan konkurensi tinggi

WBOY
WBOYasal
2023-07-29 21:17:101588semak imbas

Membina aplikasi pengundian dalam talian menggunakan Node.js dan Redis: Cara mengendalikan konkurensi tinggi

Dengan pembangunan Internet, semakin banyak aplikasi perlu mengendalikan situasi konkurensi tinggi. Permohonan undian dalam talian ialah senario keselarasan tinggi yang biasa. Pengguna menyerahkan sejumlah besar permintaan undian dalam tempoh masa yang singkat. Aplikasi perlu dapat memproses permintaan ini dengan cepat dan mengekalkan konsistensi data. Artikel ini akan memperkenalkan cara menggunakan Node.js dan Redis untuk membina aplikasi undian dalam talian yang sangat serentak.

  1. Pengenalan kepada Redis

Redis ialah pangkalan data nilai kunci berasaskan memori yang popular untuk membaca dan menulis berkelajuan tinggi serta sokongan struktur data yang kaya. Dalam artikel ini, kami akan menggunakan Redis untuk menyimpan data pengundian dan memanfaatkan operasi atomnya untuk memastikan ketekalan data.

  1. Reka bentuk seni bina

Untuk menampung permintaan pengundian serentak yang tinggi, kami menggunakan reka bentuk seni bina berikut:

  • Halaman hadapan: Gunakan HTML dan CSS untuk membina antara muka pengguna dan menghantar permintaan undian ke Nod pelayan .js melalui Ajax.
  • Pelayan Node.js: mengendalikan setiap permintaan pengundian dan menggunakan Redis untuk membaca dan menulis data pengundian.
  • Pangkalan data Redis: menyimpan data pengundian dan menyediakan operasi atom untuk kawalan serentak.
  1. Pelaksanaan kod

Berikut ialah contoh kod pada bahagian pelayan 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('服务器已启动');
});

Kod di atas mula-mula memperkenalkan modul ekspres dan redis, dan mencipta aplikasi Express dan klien Redis. Fungsi app.post('/vote', ...) digunakan untuk memproses permintaan undian dan dilaksanakan dengan memanggil redisClient.incr(option, ...) Kiraan undi untuk pilihan yang sepadan dinaikkan. Kod status 200 akan dikembalikan jika undian berjaya, dan kod status 500 akan dikembalikan jika undian gagal. app.post('/vote', ...)函数用于处理投票请求,通过调用redisClient.incr(option, ...)实现对相应选项的投票计数增加。投票成功后返回200状态码,投票失败则返回500状态码。

  1. 并发控制

在高并发的情况下,多个用户同时对同一个选项进行投票会导致数据不一致。为了解决该问题,我们可以使用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的getsetex

    Concurrency control
    1. Dalam kes concurrency tinggi, berbilang pengguna mengundi pada pilihan yang sama pada masa yang sama akan membawa kepada ketidakkonsistenan data. Untuk menyelesaikan masalah ini, kita boleh menggunakan operasi atom yang disediakan oleh Redis untuk kawalan serentak.
    rrreee

    Kod di atas melaksanakan mekanisme kunci mudah dengan menggunakan operasi get dan setex Redis untuk memastikan hanya seorang pengguna boleh mengundi pada masa yang sama dan melepaskannya selepas undian berakhir.

    🎜🎜Ringkasan🎜🎜🎜Artikel ini memperkenalkan cara membina aplikasi undian dalam talian yang sangat serentak menggunakan Node.js dan Redis. Dengan menggunakan operasi atom Redis dan mekanisme penguncian mudah, kami dapat mengendalikan sejumlah besar permintaan pengundian serentak dan mengekalkan konsistensi data. Saya harap artikel ini dapat membantu anda memahami pemprosesan konkurensi tinggi. 🎜

Atas ialah kandungan terperinci Membina aplikasi pengundian dalam talian menggunakan Node.js dan Redis: Cara mengendalikan konkurensi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn