【二三方】_小知识积累

小知识积累

1.幂等性解决方案

  • 场景描述:在多线程情况下,在已知订单号的情况下,要根据订单号生产一个订单,保存到数据库中,并保证幂等性。如果不采取幂等性措施,则有可能两个线程同时查询该订单是否存在,然后都执行订单插入操作,使得数据库中保存两条订单号相同的订单数据。
  • 方案一:在数据库中对订单号字段创建唯一索引;
  • 方案二:如果使用了Redis做缓存,可以对Redis进行加锁。

2.OAuth2.0原理与应用

OAuth就是指一个应用向第三方授权,使得第三方在不使用用户密码登录的情况下获得应用的访问权限,核心就是向第三方颁发令牌。

OAuth2.0规定了四种获得令牌的流程:授权码、隐藏式、密码式、客户端凭证。不管哪一种授权方式,第三方应用申请令牌之前,都必须先到被申请系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端ID和客户端密钥。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。

喜马拉雅三方业务使用的是密码式,qq音乐三方业务使用的是隐藏式。

3.java序列化

  • 如果需要将某个对象保存到磁盘上或者通过网络传输,那么这个类应该实现Serializable接口或Externalizable接口之一,该类的对象才可以实现java序列化和反序列化

4.SpringBoot中的starter

  • starter是为了更方便地装配spring bean,就是在SpringBoot项目启动时将一些bean加载到Spring容器中。

5.Docker的本质与使用

  • 容器的本质是进程,该进程在Linux系统内存空间中重建一个完整的文件系统,比如Centos7的所有目录和文件。这样在容器中运行的应用程序就感觉自己在一个Linux系统下运行,其实并不是真的系统,而是一个与外界隔离的虚拟系统。
  • Docker的使用

6.h5与移动端的区别

  • 对于app开发,每一种移动操作系统都要重新开发一个app,比如安卓操作系统就需要基于Java开发app,而苹果操作系统就需要基于Objective-C开发app;h5页面是运行再浏览器端的应用,所以无论是什么操作系统只要可以打开浏览器就可以运行h5页面。
  • 移动端app需要下载安装到本地才可以运行,需要占用手机本地内存,且运行过程中会产生大量的临时数据或缓存数据占用存储空间;h5页面由于运行在浏览器端,所以它消耗的是服务器端的内存,只需要占用本地有限的内存空间,但是缺点是对网络要求较高。

7.Mybatis返回自增主键

在创建DO对象时,我们往往不会对自增主键对应属性进行赋值,对象属性数据插入数据库时,会由数据库自动生产唯一主键存入数据库中。Mybatis为我们提供了方法,使得执行完insert语句之后,会将数据库自动生成的主键值返回并赋值给DO对象的对应属性。

代码示例:

1
2
3
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (username,password,nickname,token,reg_time,login_time) VALUES (#{username},#{password},#{nickname},#{token},#{regTime},#{loginTime})
</insert>
  • useGeneratedKeys属性设置为true会令MyBatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键,该属性仅对insert和update语句有用;
  • keyProperty属性用于标记主键对应的属性,MyBatis会将getGeneratedKeys方法的返回值赋值给该属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表,该属性仅对insert和update语句有用。

8.数据库中订单表的status状态字段设计思路

  • 数据库中表一般通过添加一个status状态字段来表示一条记录或者一个订单处于哪个阶段:比如在进行售卖操作之前,先新建一条处于新建状态的记录;然后再执行售卖逻辑,售卖成功则更新该条记录的状态为成功,或者直接新建一条状态为成功的记录,售卖失败则记录状态为失败;相应的售卖逻辑越复杂,也可以设置越多的状态,每次执行完一定的逻辑操作就更新一次状态或新建一条记录;
  • 如果是以日志记录为主要目的的Record表,一般不通过update操作来更改记录的状态字段,而是不断地insert插入不同的新状态记录,这样每次状态变化都会清晰地记录在数据库表中;
  • 如果是以订单记录为主要目的的信息表,一般通过update操作更改同一条记录来记录状态变化。

代码实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//视频彩铃设置状态枚举
public enum RingVideoOpEnum {

//新建记录
NEW,

//设置成功
SET,

//闲置成功
FREE,

//删除成功
DELETE,

//操作失败
FAIL;
}

9.try/catch设置层级

  • 当某个方法没有设置try/catch语句块抓取异常,而该方法中发生异常时,该异常会被抛到调用该方法的上层去。所以在一套后端三层逻辑中,只要在最外层controller层设置了try/catch语句块,就可以把整个三层逻辑中发生的异常都抓到。当然一般不会这样去设置,具体在哪些地方设置异常抓取块做到尽量合理即可。

10.Idea中的Maven配置

  • Idea中内置了Maven,并不需要另外下载;
  • 如果要修改Idea中Maven的远程仓库,直接新建一个settings.xml文件即可,该文件中配置内容如下:
    • 通过mirrors属性和profiles属性配置远程仓库地址;
    • 通过servers属性配置远程仓库服务器的服务器id和连接服务器所需的认证信息;
    • 通过localRepository属性配置本地仓库文件夹地址;
  • 在idea的maven配置界面替换原settings.xml配置文件为以上刚创建的文件;本地仓库地址不用再手动配置,会自动配置为localRepository属性中的地址。