一、能够说出Redison框架的作用?

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务 image.png

二、能够说出Redison对象桶有哪些? 什么是对象桶?

对象桶: 常见的有string hash set zset list RBucket对象桶是一种通用对象桶可以用来存放任类型的对象

三、原子性对象有哪些?

RAtomicLong 原子整长形 RAtomicDouble 原子双精度浮点

四、redisson-分布式集合数据结构是什么? 主key和辅key有什么作用?

基于Redis的Redisson的分布式映射结构的==RMap==对象实现了java.util.concurrent.ConcurrentMap接口和java.util.Map接口。与HashMap不同的是,RMap保持了元素的插入顺序。该对象的最大容量受Redis限制,最大元素数量是 2^32^ - 1个(4 294 967 295 ) image.png 主key: 为了找到数据 辅key: 为了排序

五、redisson-分布式锁原理是什么?怎么用?WatchDog自动延期机制是什么?

image.png

  • 加锁机制线程去获取锁,获取成功: 执行lua脚本,保存数据到redis数据库。线程去获取锁,获取失败: 一直通过while循环尝试获取锁,获取成功后,执行lua脚本,保存数据到redis
  • WatchDog自动延期看门狗机制第一种情况:在一个分布式环境下,假如一个线程获得锁后,突然服务器宕机了,那么这个时候在一定时间后这个锁会自动释放,你也可以设置锁的有效时间(不设置默认30秒),这样的目的主要是防止死锁的发生第二种情况:线程A业务还没有执行完,时间就过了,线程A 还想持有锁的话,就会启动一个watch dog后台线程,不断的延长锁key的生存时间
  • lua脚本-保证原子性操作主要是如果你的业务逻辑复杂的话,通过封装在lua脚本中发送给redis,而且redis是单线程的,这样就保证这段复杂业务逻辑执行的原子性
  • 使用方法:
  1. lock()
    • 此方法为加锁,但是锁的有效期采用默认30秒
    • 如果主线程未释放,且当前锁未调用unlock方法,则进入到watchDog机制
    • 如果主线程未释放,且当前锁调用unlock方法,则直接释放锁
  2. lock(long leaseTime, TimeUnit unit):
    • 手动设置锁的有效时间
    • 如果主线程未释放,且当前锁未调用unlock方法,则锁到期后会自动释放
    • 如果主线程未释放,且当前锁调用unlock方法,则直接释放锁
  3. tryLock():
    • 用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,
    • 如果主线程未释放,且当前锁未调用unlock方法,则进入到watchDog机制,
    • 如果主线程未释放,且当前锁调用unlock方法,则直接释放锁
  4. tryLock(long time, TimeUnit unit):
    • tryLock(long time, TimeUnit unit)方法和tryLock()方法是类似
    • 区别在于这个方法在拿不到锁时会等待一定的时间, 在时间期限之内如果还拿不到锁,就返回false。
    • 如果如果一开始拿到锁或者在等待期间内拿到了锁,则返回true
    • 如果主线程未释放,且当前锁未调用unlock方法,则进入到watchDog机制
    • 如果主线程未释放,且当前锁调用unlock方法,则直接释放锁
  5. tryLock(long waitTime, long leaseTime, TimeUnit unit):
    • 比上面多一个参数,多添加一个锁的有效时间

六、桌台是否开台的前提条件是什么?

桌台处于空闲状态并且无订单才能开桌

七、查询相关主体时需要统一查询哪些数据? 核心的字段是什么?

image.png

  • 需要统一查询牌、门店、区域、桌台、菜品分类、菜品等相关的信息,这里包装了一个服务接口把它们的信息全部拿到
  • 核心字段是table_id

八、开桌主要完成哪些操作?

调用开桌接口后,我们要把那个桌台创建一个待支付订单,并且把桌台的状态改为开桌状态

九、开桌的实现流程是什么?

1、定义异常 2、开台状态定义 3、锁定桌台,防止并发重复创建订单 — 分布式锁 4、==幂等性==:再次查询桌台订单情况 5、未开台,为桌台创建订单 5.1、查询桌台信息 5.2、构建订单 6、修改桌台状态为使用中 7、订单处理:处理可核算订单项和购物车订单项,可调用桌台订单显示接口

十、开桌为什么需要加分布式锁? 如果不加分布式锁是否可以? sys同步锁和分布式锁区别?

  • 因为开桌服务是分布式的,所以要加分布式锁
  • 如果不加分布式锁会出现数据不一致的问题,比如订单重复创建
  • 同步锁和分布式锁区别:

    • 1、实现层面

      synchronized 是 Java 关键字,JVM层面 实现加锁和释放锁;Lock 是一个接口,在代码层面实现加锁和释放锁 2、用法层面 synchronized 可以用在代码块上,方法上。lock只能写在代码里,不能直接修改方法。 3、是否自动释放锁 synchronized 在线程代码执行完或出现异常时自动释放锁;Lock 不会自动释放锁,需要再 finally {} 代码块显式地中释放锁 4、获取锁成功是否可知 synchronized 无法得知是否获取锁成功;Lock 可以通过 tryLock 获得加锁是否成功 5、是否可中断和是否公平 synchronized 加锁可重入、不可中断、非公平;Lock 可重入、可中断、可公平和不公平、细分读写锁提高效率

十一、什么是幂等性? 开桌时为什么需要考虑冪等操作?

  • 幂等性:是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。
  • 考虑幂等性操作是为了保证用户在网络堵塞中多次点击提交订单按钮,但是最终只会创建一个订单

十二、订单创建时机是什么?

开桌成功后就会创建订单

十三、什么是可核算订单项? 什么是购物车订单项? 分别存到哪里?

  • 可核算订单项【已下单可结算】:MySQL
  • 购物车订单项【已加入购物车未下单】:Redis