synchonized的作用就是让多个线程中只有一个线程可以访问这段代码
单应用情况下可以实现,
集群就不可以使用了,
频繁的访问数据库,
没产品了 ,仍然访问后台。
优化秒杀系统
前端:
CDN加速
服务端:
用特定的地方存数量,节省DB资源,减少耦合度。
第一层:存数量
NoSQL —>redis
redis里面去获取数量信息,原子性的操作,支持事务。
redis里有数据---->推送到队列MQ中(成功用户)--->(秒杀成功)操作数据库
第二层:访问数据库
消息服务里面操作
使用原生的redis
@Autowired
private StringRedisTemplate redisTemplate;
public boolean doMiaoSha(){
vo=redisTemplate.opsForValue();
//设置支持事务
redisTemplate.setEnableTransactionSupport(true);
while(true){
//监听这个数据节点
redisTemplate.watch("majiaxueyuan");
count=Integer.paseInt(vo.get("majiaxueyuan"));
if(count>0){
redisTemplate.multi();
vo.increament("majiaxueyuan",-1);
exec=redisTemplate.exec();
if(exec.size()==0||exec==null){
continue;//秒杀成功
· }
return true;
}else{
return false;//秒杀失败
}
}
}