问题一:商品推荐列表城市动态变化
增加人员与查询城市关系表,存储:主键,用户ID、访问城市ID、访问时间。
用户登录页面时。通过这张表的用户id按照时间顺序查询相应的城市热销产品,同时返回到页面,通过页面显示。
用户查询城市商品信息时,查询此表数据,如果没有这个城市id,新增入此表,如果已存在与表中,刷新这个城市访问时间。
这张表使用定时任务每天随机访问数据,超过两个月没有访问的记录即可删除。
问题二:线上秒杀削峰访问
使用微服务将秒杀部分独立出来,秒杀模块如果宕机不会影响整体系统的使用。
使用redis创建一个对象 key为access_token ,value初始值为1000作为令牌数量。
每次访问秒杀程序时,首先增加正常访问用户验证,比如滑动模块或者文字校验。对正常用户进行分流。通过访问验证的用户,先查询redis中的access_token 的值是否大于0,如果大于零access_token 自减1,代表令牌消耗一个,用户session增加令牌标识,可以继续付款流程。如果access_token 为0代表令牌已消耗完毕,阻止访问,返回信息空。
设置access_token 字段每秒刷新一次,刷新为初始值1000,控制每秒至多只有一千的并发量。秒杀成功的用户信息,将秒杀商品相关的字段存入消息队列,成功入队的返回给用户秒杀成功等待发货中。付款流程和发货流程使用多线程去消费消息队列中的信息。消费完的用户显示付款成功已出货。
问题三:防止刷单和恶意注水
考虑到用户数量较多使用一个新的redis缓存,用户下单或者访问需要防止恶意注水的接口前,在redis中存入key为Mac地址value为list的对象。list存入当前访问时间,访问次数,是否能访问。如果对象已存在使用当前时间与缓存中的时间比对,如果间隔不超过五秒,访问次数加一,超过五秒则不做修改。如果访问次数超过五次将能否访问的标识修改为不能访问,并设置五分钟过期。页面提示请五分钟以后再付款或者评论。下一次该用户登录或者评论时需要进行真人验证,比如图案或者滑动验证。