拼单助力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机器的负载情况,以及缓存的时效性等等因素,以达到最佳的体验效果。