拼单助力Redis技术实现团购梦(拼单redis)

拼单(Groupbuy)是一种新型的消费服务,是多位用户共同购买一件商品,以获得更优惠的折扣价格的一种消费模式,有的团购会有数量单位,只有当达到了指定数量,团购才开证。

因此,拼单助力中必不可少的就是实时计算拼单进度(schedule),以及明确当前是否可以获得优惠。除此之外,如果只用传统的计算机技术,计算拼单进度时还会面临一些性能问题:如数据量大时,访问会比较慢,数据实时性也会有影响。

为了解决上述问题,我们引入了Redis作为拼单助力的技术基础。Redis是一款开源的、基于内存的数据存储,非常适合解决事务性读写访问,特别适合解决实时计算进度、获取优惠的应用场景。

借助Redis,可以将拼单用户信息都存储在Redis中,享受Redis自身卓越的性能优势,实现实时计算进行情况,可以大大减少用户的等待时间,极大提升了客户的体验。

下面,我们就实现一个简单的拼单请求处理助力,借助Redis实现:

// Redis连接

const redis = require(‘redis’);

const client = redis.createClient(6379, ‘127.0.0.1’);

// 拼单数据库

const groupOrderKey = ‘GROUP_ORDER’;

// 团购活动

// TODO: 根据实际情况修改

const groupParams = {

targetNumber: 5, // 目标数量

rewardPrice: 100, // 优惠价格

expireTime: 30 // 拼单有效期(分钟)

}

function handleGroupOrder(userId, callback) {

let now = new Date().getTime(); // 当前时间(毫秒)

// 1. 统计当前拼单人数

client.hlen(groupOrderKey, (err, len) => {

if (err) return callback(err);

// 2. 非主动发起人

if (len > 0) {

// 检查是否超出有效期

let expire;

client.hget(groupOrderKey, ‘expire’, (err, expireStr) => {

expire = parseInt(expireStr); // 有效期(毫秒)

if (err) return callback(err);

if (now > expire) {

// 已超出有效期

client.hclear(groupOrderKey, (err, result) => {

if (err) return callback(err);

// 清空数据,重新计数

addUserToGroupOrder(now, userId, len, callback);

});

} else {

// 未超出有效期

if (parseInt(len) >= groupParams.targetNumber) {

// 已达到拼单目标数量

client.hset(groupOrderKey, ‘price’, groupParams.rewardPrice);

// 填充优惠价

client.hset(groupOrderKey, ‘expire’, now + groupParams.expireTime * 60000);

// 更新有效期

addUserToGroupOrder(now, userId, len, callback);

} else {

// 未达到拼单目标数量

addUserToGroupOrder(now, userId, len, callback);

}

}

});

} else {

// 主动发起人

addUserToGroupOrder(now, userId, len, callback);

}

});

}

// 添加用户至拼单

function addUserToGroupOrder(now, userId, len, callback) {

client.hset(groupOrderKey, userId, now);

// 填充用户信息

if (parseInt(len) === 0) {

// 主动发起人

client.hset(groupOrderKey, ‘expire’, now + groupParams.expireTime * 60000);

// 填充有效期

}

let newLen = len + 1;

client.hset(groupOrderKey, ‘len’, newLen);

// 更新计数

callback(null, newLen);

}

handleGroupOrder(‘uid12345’, (err, info) => {

if (err) {

// 异常处理

} else {

console.log(‘增加新用户,当前拼单进度:’, info);

}

})

如此一来,利用Redis有效的实现了拼单助力的计算及更新,极大的提高了实时的响应速度。但在实际的开发中,我们还需要考虑到Redis机器的负载情况,以及缓存的时效性等等因素,以达到最佳的体验效果。


数据运维技术 » 拼单助力Redis技术实现团购梦(拼单redis)