写在前面:该文章的很多思路来自于张国栋同学,在此首先先他致谢;
1 活动名额递减的问题:()
通过将商品的数量模拟成redis list的size的方法来控制名额的递减:
比如说活动商品有100个,那么就往redis list中存放100个元素,比如“1”,“2”。。。。“100”
每买一个抢一个商品就去redis list中取一个元素出来,这样list的size就减少1,代表名额减少1,当获取不到元素时说明 活动名额已经没有了,或者判断list的size来判断名额,或者获取的元素的值来判断。
这样即便是高并发的情况下也不会出现,多个用户抢最后一个商品的并发问题和减少活动名额数据安全问题。
数据库名额和redis数据库名额的同步问题:
数据库中改名额属于耗时并且涉及并发减少库存的安全问题,所以要异步去减少数据库的名额,并且要串行化。这边可以 使用单线程池来解决这个问题,Executors.newSingleThreadPool() 获取单线程线程池s。调用s.execute(Runalbe run),把数据 库减少库存的方法放进来(可以搞个内部类),因为时s是单线程的所以能够实现数据库减少活动名额的串行化。
2 乐观锁和悲观锁的问题。