秒杀用不用 Redis 加速你的体验(秒杀功能用不用redis)
秒杀是网络高并发时代最常见的场景,是当下的重点。比如在双11期间或大型活动中,用户可能在一秒内发起上万次请求购买同一款商品,而应用服务器会受到极度大的压力。
Redis作为非常常用的高性能内存数据库,多用于缓存、消息队列等高性能的需求。事实上,也可以利用它来加速商城秒杀的体验。
一,使用 Redis 的计数器,可以对秒杀进行适当抑制。
例如,可以在应用上设置一个计数器,让 Redis 过滤掉超标请求,限定每个用户每小时只能提交一定数量的请求。
这样可以避免服务器压力过大。具体代码如下:
String key=userId+'_limit';
Long time=System.currentTimeMillis();Long expireTime=time+3600*1000;
if(!jedis.exists(key)){ //如果未存在该key,则设置key,初始值为1
jedis.setex(key, 3600, "1"); //抢购成功逻辑
}else{ //否者增加key的值
Long count=jedis.incr(key); if(count>1){
//限流达到上限,抢购失败 }else{
//抢购成功逻辑 jedis.expireAt(key, expireTime);
}}
二,可以将商品信息存放在 Redis 中,并使用 Lua 脚本进行高效商品扣减,如下:
String key = 'goods_stock';
String luaExprees = "local num = redis.call('get',KEYS[1]); if (tonumber(num)
return 0 end;
redis.call('decr',KEYS[1]);return 1";
DefaultJedis jedis = new Jedis(); Object object = jedis.eval(luaExprees, CollecitonUtils.arrayToList(key), Collections.emptyList());
if(object instanceof Long){ //如果返回的是Long型,表示扣减成功
if((Long)object==1){ //扣减成功,可以进行下一步业务处理
//....... }
}
本文给出了利用Redis加速商城秒杀体验的两种方法,它们仅供参考。实际上,每种情况都给出了不同的优化方法,比如可以利用Redis建立非关系型数据库或者将某类商品信息权重加入到索引类数据库中等,希望可以给出你的实践经验和思考,来打造出更完美的秒杀体验。
相关文章