1.Redis实现分布式锁的缺陷
当我们的程序执行时间超过redis锁的时间时,会出现bug
如何解决该问题?可以使用第三方插件Redisson,它是基于Redis实现的,提供了一个看门狗的机制。
这个看门狗机制会每隔10秒看一次锁有没有过期,如果有锁则表示该方法还未结束,会给这个锁延长生存时间。
如何使用Redisson?
1.1引入依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.23.4</version>
</dependency>
1.2创建对象
由于该插件没有被Spring容器进行管理,所以需要先将该对象交给Spring容器来管理。
@Configuration
public class RedisConfig {
@Bean
public RedissonClient redissonClient(){
Config config = new Config();
//配置单机Redis
config.useSingleServer().setAddress("redis://192.168.145.136:6381");
//配置集群版Redis
//config.useClusterServers().addNodeAddress("redis://192.168.145.136:6380", "redis://192.168.145.137:6381");
return Redisson.create(config);
}
}
1.3修改源代码
@Autowired
private RedissonClient redissonClient;
public String decrement(Integer productid) {
//获取指定锁对象
RLock lock = redissonClient.getLock("product::" + productid);
//加锁
lock.lock(30, TimeUnit.SECONDS);
try {
int num = stockDao.findById(productid);
if (num > 0) {
stockDao.update(productid);
System.out.println("商品编号为:" + productid + "的商品库存剩余:" + (num - 1) + "个");
return "商品编号为:" + productid + "的商品库存剩余:" + (num - 1) + "个";
} else {
System.out.println("商品编号为:" + productid + "的商品库存不足。");
return "商品编号为:" + productid + "的商品库存不足。";
}
} finally {
//释放锁资源
lock.unlock();
}
}
2.Redis常见面试题
2.1Redis在工作中常用场景
1.可以作为热点缓存数据库
2.可以解决分布式锁
3.做限时任务的操作
4.热门商品的排行等问题
2.2Redis支持的数据类型
redis支持很多数据类型,而我们再工作中使用最多的是String,Hash,List,Set,SortedSet
2.3Redis持久化方式
RDB:快照模式,每隔一段时间会对Redis内存中的数据进行快照保存
AOF:日志追加模式,当执行写操作会通过write函数记录到日志文件中
2.4Redis缓存穿透以及如何解决
什么是缓存穿透:
Mysql数据库和Redis缓存中都没有该数据,这时有人恶意访问这种数据,会导致因为缓存中没有该数据,就会前往数据库查询,最终导致数据库宕机。
解决方案:
1.在控制层对一些不合法的数据进行校验
2.使用布隆过滤器,把数据库中存在的id放入一个大的bitmap数组中,当查询一个不存在的id时就会被该过滤器过滤掉。
3.把数据中查询出来的空对象也存入缓存中,但这个对象的存储时间不能太长,一般不超过5分钟。
2.5Redis缓存雪崩以及如何解决
什么时缓存雪崩:
就是缓存中出现大量数据过期的现象,而就在这时就有大量的请求访问这些数据,压力直接给到了数据库,从而造成数据库压力过大。
解决方案:
1.项目上线前,预先把数据存放在缓存中。
2.缓存中的数据在某个时间内出现大量过期就设置散列的过期时间,取消统一过期时间
3.Redis宕机就搭建Redis集群
2.6如何保证缓存数据和数据库数据一致
1.合理设置缓存的过期时间
2.当执行CUD操作时,同步修改缓存数据
2.7Redis内存淘汰策略
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
allkeys-random:从数据集中任意选择数据淘汰
no-enviction:禁止驱逐数据
3.Jenkins
3.1什么是Jenkins
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。
3.2为什么使用Jenk
开发人员将代码提交到git远程仓库后,需要拉取--编译--打包--部署。每次提交到git仓库都需要重复这些操作。所以使用Jenk来帮助开发人员自动完成这些事情。
3.3安装Jenkins
环境:JDK11或17或21
操作系统:虚拟机或服务器
下载地址:https://www.jenkins.io/download/
yum install fontconfig #安装字体配置
安装完成之后,启动Jenkins
nohup java -jar /usr/local/soft/jenkins.war --httpPort=8777 > /usr/local/soft/jenkins.log 2>&1 &
nohup:表示 服务器休眠时,Jenkins依然运行
java -jar:运行java文件
--httpPort:端口号
/usr/local/soft/jenkins.war:Jenkins下载位置
/usr/local/soft/jenkins.log 2>&1 :启动Jenkins生成的日志存放位置
&:表示后台运行
在window访问Jenkins
修改密码,完成后重新登陆。
3.4Jenkins集成jdk
由于Jenkins需要从git拉取代码--需要进行编译。所以必须使用jdk--在Jenkins所在的服务器安装jdk并配置jdk环境,这里使用jdk17.
解压完成后,进行环境变量配置
vi /etc/profile #进入文件编辑
##########################配置jdk环境变量##############################
export JAVA_HOME=/usr/local/soft/jdk17
export PATH=$PATH:$JAVA_HOME/bin
刷新配置文件
source /etc/profile
然后使用java -version查看java版本是不是17
如果不是17是其他版本,说明还之前配置了其他版本的jdk,删除其他版本的即可。
让Jenkins继承jdk
JAVA_HOME是你jdk安装的目录。别名就随便起。
3.5Jenkins集成Git
由于jenkins需要从git远程仓库拉取项目代码,所以需要集成git
在Jenkins所在服务器安装Git
yum install git -y # 安装
git --version # 查看版本
默认的即可。然后在gitee创建一个远程仓库。
然后在Jenkins中创建任务。
随意填写一个任务名称,建议和仓库名称一致。
在这里第三行可以看到你的git仓库保存在了哪里。
3.6Jenkins集成Maven
因为我们现在的项目都是maven项目,---打包--需要对拉取的项目进行打包。
在Jenkins所在服务器安装Maven
https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gzhttps://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz 下载完成进行解压进行重命名,然后配置环境变量
mv apache-maven-3.9.4/ maven3.9.4 #重命名
vi /etc/profile #编辑环境配置文件
export MAVEN_HOME=/usr/local/soft/maven3.9.4
export PATH=$PATH:$MAVEN_HOME/bin
配置Maven本地仓库和镜像
在maven安装目录conf目录下的setting.xml
找到大约150行的镜像配置
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
进行替换即可
Jenkins集成maven
创建一个gitee远程仓库,并上传一个maven项目
安装maven完成,新建一个任务
这样就配置好了maven,执行并查看控制台输出,查看打包位置,运行打包好的jar包
第一次会安装一些maven的依赖。