目录
前述
前面的文章已经对关系型数据库进行了集成,那么本篇针对非关系型数据库进行一个集成。Redis和MongoDB是目前来说比较流行的非关系型数据库,在一般的系统中普遍承担日志记录、登录KEY记录、事务锁、缓存数据等的处理,在大型的WEB2系统中应用的会更加广泛也更加的深入,在本次的系统集成中,只针对基础的集成、存储和取值进行一个集成。
依赖引入
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- mongoDB -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Redis集成
配置文件
依赖引入之后,需要在yml文件中进行配置,配置数据如下:
spring:
redis:
host: 127.0.0.1 # Redis服务器地址
port: 6379 # Redis 服务器连接端口
password: # 连接密码,有设置密码则必填,未设置则不填
database: 6 # 使用的数据库索引
jedis:
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 0 # 连接池中的最小空闲连接
timeout: 2000 # 连接超时时间(毫秒)
Redis配置类
创建Redis配置类,RedisConfiguration.class,此配置类创建对象RedisTemplate 来对Redis进行各种操作,它支持所有的Redis的原生API。还有一种StringRedisTemplate也输入Redis的工具方法,但是StringRedisTemplate的局限性很大,作为RedisTemplate的子类,它仅支持Key和Value都是String的操作。
package com.dgh.micro.common.config.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @className RedisConfiguration
* @Description TODO
* @Date 2021/11/1 4:07 下午
* @Author DGH DEMO
* @Version 1.0
**/
@Configuration
@EnableCaching
public class RedisConfiguration {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
测试Redis
创建TestController.java用于web访问测试。通过@Resource注解自动注入RedisTemplate,在方法中直接使用 redisTemplate.opsForValue().set("key", "value"); 进行数据的存储,使用 redisTemplate.opsForValue().get("key"); 进行数据的查询。
@PostMapping("testRedisTemplate")
@ApiOperation("测试redis")
public void testRedisTemplate() {
redisTemplate.opsForValue().set("key", "value>>1");
Object redisValue = redisTemplate.opsForValue().get("key");
log.info("redisTemplate取出的值为:{}", redisValue);
}
启动项目,通过PostMan或者swagger直接调用,接口,查看控制台的日志输出:
通过控制台日志可以看到,存入的数据已经能够正常的读取了。
MongoDB 集成
配置文件
在yml中进行MongoDB的基础配置【地址、端口、数据库、密码等】
spring:
data:
mongodb:
host: 127.0.0.1 # MongoDB服务器地址
port: 27017 # MongoDB服务器端口
database: micro-demo # 数据库名称
password: # 连接密码
测试MongoDB
MongoDB在使用时不需要创建另外的配置类,直接使用注入MongoTemplate即可使用。
创建测试类SysLog.java ,注意在创建MongoDB的实体类时需要使用注解 @Document("sys_log"); 注明其是一个MongoDB的集合文件,在存储和查询时MongoDB也是通过此注解来定位具体存储到哪个集合下面。同时通过 @Id 注解来表示其数据主键也可以不创建主键字段,通过MongoDB自己生成;通过@Field(value = "") 注解标识字段别名。
package com.dgh.micro.model.vo.mongo;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
/**
* 日志记录
*
* @author DGH DEMO
* @date 2021-11-01
*/
@Data
@Document("sys_log")
public class SysLog {
/**
* 日志的名称,一般为业务名称
*/
@Field(value = "logName")
private String logName;
/**
* 日志记录的内容
*/
@Field(value = "logContent")
private String logContent;
/**
* 服务名称,一般为spring.application.name
*/
@Field(value = "appName")
private String appName;
/**
* 当前用户请求的url
*/
@Field(value = "requestUrl")
private String requestUrl;
/**
* http或方法的请求参数体
*/
@Field(value = "requestParams")
private String requestParams;
/**
* http或方法的请求结果
*/
@Field(value = "requestResult")
private String requestResult;
/**
* 当前服务器的ip
*/
@Field(value = "serverIp")
private String serverIp;
/**
* 客户端的ip
*/
@Field(value = "clientIp")
private String clientIp;
/**
* 用户id
*/
@Field(value = "userId")
private Long userId;
/**
* 请求http方法
*/
@Field(value = "httpMethod")
private String httpMethod;
/**
* 客户浏览器标识
*/
@Field(value = "clientBrowser")
private String clientBrowser;
/**
* 客户操作系统
*/
@Field(value = "clientOs")
private String clientOs;
}
在TestController.java中编写方法 testMongoDBTemplate() 通 mongoTemplate.insert(T); 进行数据的插入,通过 mongoTemplate.findOne(Query query, Class<T> entityClass); 进行查询。
@Resource
MongoTemplate mongoTemplate;
@PostMapping("testMongoDBTemplate")
@ApiOperation("测试mongo")
public void testMongoDBTemplate() {
String uuid = UUID.randomUUID().toString();
SysLog sysLog = new SysLog();
sysLog.setClientIp(uuid);
mongoTemplate.insert(sysLog);
log.info("生成的uuid为:{}", uuid);
Query query = new Query();
query.addCriteria(Criteria.where("clientIp").is(uuid));
SysLog one = mongoTemplate.findOne(query, SysLog.class);
log.info("mongoTemplate取出的值为:{}", JSONUtil.toJsonStr(one));
}
启动后通过PostMan或者swagger调试,会发现在控制台日志中会输出当前存入的数据。
至此,Redis与MongoDB的简单集成结束,后续在实例会具体用到。下一章将集成RocketMq