随着实时互联网的发展,实时竞争应用在金融、电商、即时通讯等行业越来越普及,比如抢单应用就是一种实时竞争应用,传统的架构一般采用MySQL+Laravel实现,但是无法很好的支持实时的竞争关系,使用Redis可以能更好的支持实时反馈,提高应用的运行效率。
关于实时竞争的介绍,可以简单的理解为用户在系统做某一个动作,如果用户在系统设定的时限内不作出响应,那么另一个用户就可以占据这个位置继续处理,比如抢单应用,用户在抢单时会去占据一定的时间,如果用户超时不抢,那么这个位置就会被其他用户占据,如果系统不作前端处理,数据库中会出现重复抢单现象,大大降低了系统效率。
Redis 可以很好的支持实时竞争应用,比如抢单应用就可以使用Redis中的“watch-check-set”原子操作,实现如下的功能:
“`js
// 一个完整的抢单流程
let redis = require(‘redis’);
let redisClient = redis.createClient();
// 监视抢单人数
redisClient.watch(‘num’);
// 确认抢单人数
redisClient.get(‘num’,function(err,num){
if(num>0){
// 设置多个线程下,防止多次设置
redisClient.multi();
// 更新抢单人数
redisClient.set(‘num’,num-1);
redisClient.exec(function(err,res){
if(err){
// 抢单失败,重试
redisClient.unwatch();
}else{
// 抢单成功
console.log(‘抢单成功’);
}
});
}
});
Redis可以在高并发的情况下大大减少对数据库的操作,提高应用的稳定性和效率,但是需要注意的是,Redis不能替代传统的SQL存储数据,仅仅是把Redis当作缓存来使用,将数据持久化存储到数据库中,这样可以帮助系统实现完整的竞争应用,而且还可以实现数据的持久化和定期备份。