1.设计一个网站,需求:设计一个网页游戏,水中有5只鸭子,给5支箭;射中5只鸭子得一等奖,射中4只鸭子得二等奖,依次类推到射中1只鸭子得五等奖;
条件:每天只能出现1个一等奖,3个二等奖,50个三等奖,200个四等奖,五等奖不限。
请问如何实现客户的需求?从哪些方面考虑?
要求,用户体验不能差,实时地显示结果。
提示:高并发可能产生奖项限制超出
其实就是一个加锁保证数据安全的问题。这种场景和秒杀类似,但是比秒杀简单,因为不用考虑抗下秒杀在瞬时产生的压力。所以只要关注于如何保证数据安全就行了。
方案:
维护内存标志变量,标识是否有发奖
中奖时更新数据要加锁,这个加锁可以用缓存(redis、memcached),也可以直接用数据库加锁。即一次只能有一个请求在更新数据,并且需要保证其他请求看到的都是最新的数据。
2.ORACLE查询问题,如一张表5千万条数,查询每页显示80,查询第9000页的数据时,SQL语句怎么写?
我列出的select * from table where num<=80*90000 and id not in (select id from table where num<=(80-1)*90000) 效率低,有没有效率高点的SQL语句?引申问题——在没有id的情况下呢?
ORACLE接触不多,mysql里是用limit,oracle里好像有个rowid?忘了。
这种大页数分页的场景,没有太多可优化的余地。一般来说会在业务上屏蔽这种可能:谁那么无聊要一页一页翻到第9000页?
因为数据库实现原理的限制,翻页都是查询出所有数据之后再把之前的数据丢掉,所以在性能上损耗很多,一般都会从业务上来屏蔽掉这种无聊的操作。
条件:每天只能出现1个一等奖,3个二等奖,50个三等奖,200个四等奖,五等奖不限。
请问如何实现客户的需求?从哪些方面考虑?
要求,用户体验不能差,实时地显示结果。
提示:高并发可能产生奖项限制超出
其实就是一个加锁保证数据安全的问题。这种场景和秒杀类似,但是比秒杀简单,因为不用考虑抗下秒杀在瞬时产生的压力。所以只要关注于如何保证数据安全就行了。
方案:
维护内存标志变量,标识是否有发奖
中奖时更新数据要加锁,这个加锁可以用缓存(redis、memcached),也可以直接用数据库加锁。即一次只能有一个请求在更新数据,并且需要保证其他请求看到的都是最新的数据。
2.ORACLE查询问题,如一张表5千万条数,查询每页显示80,查询第9000页的数据时,SQL语句怎么写?
我列出的select * from table where num<=80*90000 and id not in (select id from table where num<=(80-1)*90000) 效率低,有没有效率高点的SQL语句?引申问题——在没有id的情况下呢?
ORACLE接触不多,mysql里是用limit,oracle里好像有个rowid?忘了。
这种大页数分页的场景,没有太多可优化的余地。一般来说会在业务上屏蔽这种可能:谁那么无聊要一页一页翻到第9000页?
因为数据库实现原理的限制,翻页都是查询出所有数据之后再把之前的数据丢掉,所以在性能上损耗很多,一般都会从业务上来屏蔽掉这种无聊的操作。