秒杀
1: 描述一下秒杀的实现过程 以及技术难点
1.1 redis 预热 把每一场的秒杀商品预热到redis中
1.2 xxl-job 预热 分布式任务
1.3 cdn 静态资源加速
1.4 redis 分布式锁 防止一货多卖
1.5 mq 延时队列 延时反查 订单的状态
1.6 mq 削锋
1.7 限流 限流组件
1.8 jvm 优化
2:锁解决什么样问题的,描述一下线程锁 悲观锁 乐观锁 分布式锁
ava中的锁能够解决以下实际问题:
数据竞争:在多线程环境中,如果多个线程同时访问共享数据,就会产生数据竞争问题。使用锁可以确保同一时间只有一个线程可以访问共享资源,避免数据竞争和数据不一致的问题。 线程安全:Java中的锁可以确保线程安全,避免多个线程之间的干扰和竞争,从而保证代码的正确性和可靠性。 性能优化:Java中的锁可以用于优化程序的性能,比如使用读写锁来实现对数据的读写分离,从而提高程序的并发性能。 死锁问题:Java中的锁可以用于避免死锁问题,比如使用一致性的加锁顺序,避免出现循环依赖的情况。
悲观锁(synchronize) Java 中的重量级锁 synchronize----对代码上锁 数据库行锁-----对数据上锁
乐观锁 Java 中的轻量级锁 volatile 和 CAS-----对代码上锁 数据库版本号------对数据上锁
分布式锁 基于数据库实现分布式锁; 基于缓存(Redis等)实现分布式锁; 基于Zookeeper实现分布式锁;
2.1 什么是可重入锁 不可重入锁 自旋锁 可中断锁 公平锁 独享锁/共享锁 互斥锁/读写锁 分段锁
可重入锁
广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。
不可重入锁
不可重入锁,与可重入锁相反,不可递归调用,递归调用就发生死锁。看到一个经典的讲解,使用自旋锁来模拟一个不可重入锁,
自旋锁
自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环
公平锁
公平锁是指多个线程按照申请锁的顺序来获取锁。
非公平锁
非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。
独享锁:该锁每一次只能被一个线程所持有。
共享锁:该锁可被多个线程共有,典型的就是ReentrantReadWriteLock里的读锁,它的读锁是可以被共享的,但是它的写锁却每次只能被独占。
另外读锁的共享可保证并发读是非常高效的,但是读写和写写,写读都是互斥的。
独享锁:该锁每一次只能被一个线程所持有。
共享锁:该锁可被多个线程共有,典型的就是ReentrantReadWriteLock里的读锁,它的读锁是可以被共享的,但是它的写锁却每次只能被独占。
另外读锁的共享可保证并发读是非常高效的,但是读写和写写,写读都是互斥的。
3:死锁怎样产生的, 怎样解决死锁问题
死锁就是两个或两个以上线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

①互斥条件:一个资源只能被一个线程占有,当这个资源被占用后其他线程就只能等待。
②不可剥夺条件:当一个线程不主动释放资源时,此资源一直被拥有线程占有。
③请求并持有条件:线程已经拥有一个资源后仍然不满足,又尝试请求新的资源。
④环路等待条件:产生死锁一定是发生了线程资源环路链。 解决:
修改请求并持有条件:获得了一把锁之后不再去请求获取另一把锁

4:Arralist和LinkedList哪个是线程安全的?那线程安全的是什么?如果没有vertor 怎么保证ArrayList和LinkedList线程安全?用什么插件

5:并发测试使用什么工具
Apache JMeter
6: redis 做分布式锁 和 zookeeper 做分布式锁的区别和各自的优势
zk是非可重入锁,借助Apache curator框架,可以实现重入锁功能
redis可重入性及锁续期没有实现,通过redisson解决(类似AQS的实现,看门狗监听机制)
7: rabbitmq 延时队列怎样实现的 一般用在什么场景
1、RabbitMQ 中的 TTL TTL 是 RabbitMQ 中一个消息或者队列的属性,表明一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒。 目前有两种方法可以设置消息的 TTL: 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间; 第二种方法是对消息本身进行单独设置,每条消息的 TTL 可以不同。 如果两种方法一起使用,则消息的 TTL 以两者之间较小的那个数值为准。
2、死信(Dead Letter)队列 “死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况:
1)消息被否定确认,使用 channel.basicNack 或 channel.basicReject ,并且此时requeue 属性被设置为false。 2)消息在队列的存活时间超过设置的TTL时间。 3)消息队列的消息数量已经超过最大队列长度。
8:怎样保证 两个人不能用同一个账户同时登录系统
使用SSO单点登录;登录后使用服务端的session保存登录的session;登录时检查session是否存在,如果存在,表示已经有人登录,做登录拒绝;如果登录时,session不存在,保存session;退出时,删除session;将session的ID信息保存到cookie中,登录时,携带上来
9:怎样保证两个人不能在 同一时间 用同一个账户登录
10: redssion的原理
1:aop的异常增强 如果发现锁不住抛出异常 会重试
2: 底层有线程 只要购物线程没结束 就会把锁的时间 一直填满
3: 底层使用lua脚本 让加锁和设置时间是一个原子操作

11:redis怎么实现的秒杀方案,什么时候手动删除设置的锁资源
抢购完成,订单生成,删除锁资源

浙公网安备 33010602011771号