项目场景:
提示:这里简述项目相关背景:
需求:
spring boot框架搭建 web api项目:eastmoney.demo.api
1、实现基于oracle库emdata用户表的查询接口,或者自建mongodb的user库
select * from emtxz.t_user_info
2、实现基于mongodb库,userInfo的增删改查接口,数据字段可移植2~3个t_user_info 表的关键字段即可。包括userInfo建表脚本。
3、实现基于redis缓存,userInfo的查询接口,缓存击穿后数据取mongo库的userInfo表。有缓存策略。
实现步骤
1、搭建spring boot +grandle + mongoDB框架,在build.grandle中添加相关依赖()
2、本地安装mongoDB(https://blog.csdn.net/weixin_41466575/article/details/105326230)
3、mongoDB进行相关配置,启动mongoDB(在windows资源管理器中shift+右键打开powershell ,然后执行mongod -dbpath C:\MongoDB\data\db 命令)
4、项目中补充相关mongoDB配置文件
5、写个单测康康项目和mongoDB的连接有没有问题(用studio 3T图形化mongoDB以查看是否已完成写入):
@Autowired
private MongoTemplate mongoTemplate;
//添加操作
@Test
public void contextLoads() {
User user = new User();
user.setAge(20);
user.setName("test");
user.setEmail("123@qq.com");
User user1 = mongoTemplate.insert(user);
System.out.println(user1);
}
6、用mongotemplate实现CRUD接口
7、本地安装redis()
8、项目连接redis
9、选择缓存策略
Cache Aside Pattern(旁路缓存模式)
读写步骤
写:
先更新DB。
然后直接删除cache。
(用@CacheEvict实现
读:
从cache中读取数据,读取到就直接返回。
cache中读取不到的话,就从DB读取返回。
再把数据写到cache中。
(用 @Cacheable实现
10、按照缓存策略写代码
11、测试结果
-
给适合做缓存的查询方法添加@Cacheable注解
DEGUB过程中发现,如果缓存不命中,则执行查询方法内的逻辑;如果命中缓存则直接返回缓存结果
2)给update方法添加@CacheEvict注解
DEBUG过程中发现,如果原本缓存中存在数据,在调用update方法后缓存中对应数据将被删除
遇到的问题
1、MongoTemplate注入失败
问题:
required a bean of type ‘org.springframework.data.mongodb.core.MongoTemplate’ that could not be found
原因:
SpringBoot的版本较高,不支持直接注入MongoTemplate,即仅使用下述内容会出现上述错误:
@Autowired
private MongoTemplate mongoTemplate;
由mongodb官方文档可知,与之前大不相同,需要手动创建MongoDB配置类:
@Configuration
public class MongoDBConfig {
@Bean
public MongoClient mongoClient() {
return MongoClients.create("mongodb://localhost:27017");
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoClient(), "mydatabase");
}
}
2、
错误描述:
java.lang.NoSuchMethodError: com.mongodb.client.MongoCollection.insertOne(Ljava/lang/Object;)Lcom/mongodb/client/result/InsertOneResult;
错误原因: build.grandle 文件存在两个不同版本的依赖,版本低的可能无法正常操作MongoDB数据库
解决方法:注释低版本依赖
//mongodb
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
//implementation 'org.mongodb:mongodb-driver:3.3.0'
3、mongodb 在cmd中设置为系统服务时出错
使用命令:
mongod.exe --logpath D:\MongoDB_Data\log\mongodb.log --logappend --dbpath D:\MongoDB_Data\data --directoryperdb --serviceName MongoDB --install
4、@Cacheable配置序列化方式?
可以重写RedisCacheConfiguration:
/设置@Cacheable序列化方式
@Bean
public RedisCacheConfiguration redisCacheConfiguration(){
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofDays(30));
return configuration;
}
5、配置Mongotemplate去掉库表中的_class字段?
这个字段主要是为了在将Mongo的数据还原到Java的时候能找到对应的类,要去掉的方法简单:DefaultMongoTypeMapper类的构造函数的第一个参数是Type在MongoDB中名字. 设置为null的话就不会在保存时自动添加_class属性.所以需要覆写
一阶段问题
架构方面:
1、测试类创建路径应该对应每个SERVICE层
2、CONTROLLER层不应该写过多业务逻辑,业务逻辑放到SERVICE层
3、前端传入数据应该用单独结构体获取(如xxInfo)再写转换逻辑转换为数据库结构体
4、像传统的springMVC架构
细节方面:
1、关键步骤添加多一些注释
2、尽量用post写http接口(因为post可接收的数据量更大,且通过解析json格式数据完成接口调用的通用性更强)
3、对于外部数据应当编写规则校验的逻辑
4、对于特殊情况(空值等)进行兜底处理
5、使用sl4j搭配try-catch进行日志输出
6、mongoDB要去除_class字段