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.
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.
Untuk menampung permintaan pengundian serentak yang tinggi, kami menggunakan reka bentuk seni bina berikut:
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, ...)</code > Kiraan undi untuk pilihan yang sepadan dinaikkan. Kod status 200 akan dikembalikan jika undian berjaya, dan kod status 500 akan dikembalikan jika undian gagal. <code>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
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.
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!