Créer des applications de vote en ligne à l'aide de Node.js et Redis : comment gérer une concurrence élevée
Avec le développement d'Internet, de plus en plus d'applications doivent gérer des situations de forte concurrence. Les applications de vote en ligne constituent un scénario typique à forte concurrence. Les utilisateurs soumettent un grand nombre de demandes de vote sur une courte période de temps. L'application doit être capable de traiter ces demandes rapidement et de maintenir la cohérence des données. Cet article explique comment utiliser Node.js et Redis pour créer une application de vote en ligne hautement concurrente.
Redis est une base de données clé-valeur basée sur la mémoire qui est populaire pour sa lecture et son écriture rapides et sa prise en charge riche de la structure de données. Dans cet article, nous utiliserons Redis pour stocker les données de vote et exploiter ses opérations atomiques pour garantir la cohérence des données.
Afin de faire face aux demandes de vote simultanées élevées, nous avons adopté la conception architecturale suivante :
Ce qui suit est un exemple de code côté serveur 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('服务器已启动'); });
Le code ci-dessus présente d'abord les modules express et redis, et crée une application Express et un client Redis. La fonction app.post('/vote', ...)
est utilisée pour traiter les demandes de vote et est implémentée en appelant redisClient.incr(option, ...)</code > Le nombre de votes pour l'option correspondante est augmenté. Un code d'état 200 sera renvoyé si le vote est réussi, et un code d'état 500 sera renvoyé si le vote échoue. <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
Le code ci-dessus implémente un mécanisme de verrouillage simple en utilisant les opérations get
et setex
de Redis pour garantir qu'un seul utilisateur peut voter en même temps et le libérer après le vote. se termine.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!