架构
前后端分离:
补充:
-
setting.xml 文件的作用:settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。
-
maven的作用:借助Maven,可将jar包仅仅保存在“仓库”中,有需要该文件时,就引用该文件接口,不需要复制文件过来占用空间。
注:这个“仓库”应该就是本地安装maven的目录下的Repository的文件夹
Springboot学习视屏推荐:传送门
分布式锁
线程锁:当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效,因为线程锁的实现在根本上是依靠线程之间共享内存实现的。如synchronized
推荐观看:传送门
进程锁:为了控制同一操作系统中多个进程访问某个共享资源。
分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。
分布式锁一般有三种实现方式:
-
数据库乐观锁;
-
基于Redis的分布式锁;
-
基于ZooKeeper的分布式锁。
乐观锁的实现:使用版本标识来确定读到的数据与提交时的数据是否一致。提交后修改版本标识,不一致时可以采取丢弃和再次尝试的策略。
分布式锁基于Redis的实现:(本系统锁才用的)
基本命令:
-
SETNX(SET if Not exist):当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。
-
GETSET:将给定 key 的值设为 value ,并返回 key 的旧值。先根据key获取到旧的value,再set新的value。
-
EXPIRE 为给定 key 设置生存时间,当 key 过期时,它会被自动删除。
加锁方式:
这里的jedis是Java对Redis的集成
jedis.set(String key, String value, String nxxx, String expx, int time)
错误的加锁方式1:
如果程序在执行完setnx()之后突然崩溃,导致锁没有设置过期时间。那么将会发生死锁。
Long result = jedis.setnx(Key, value);
if (result == 1) {
// 若在这里程序突然崩溃,则无法设置过期时间,将发生死锁