SpringBoot整合redis及mongodb的详细过程

1. SpringBoot整合redis

1.1 引入redis依赖

在pom.xml文件中添加以下依赖:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-pool2</artifactId>

<version>2.3</version>

</dependency>

其中,spring-boot-starter-data-redis为springboot提供的redis启动器,包括redis的依赖。

commons-pool2为common pool连接池,redis启动器默认使用该连接池。

1.2 redis配置文件

在application.properties文件中添加如下配置:

#redis配置

spring.redis.database=0

spring.redis.host=127.0.0.1

spring.redis.port=6379

spring.redis.password=

spring.redis.timeout=30000

其中,database是默认使用的数据库编号;host是redis运行服务器的ip地址;port是redis运行服务器的端口号;password是redis连接密码,如果不加密则为空;timeout是redis连接超时时间。

1.3 编写redis操作类

通过RedisTemplate和ValueOperations实现redis的操作,示例如下:

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.data.redis.core.ValueOperations;

import org.springframework.stereotype.Component;

@Component

public class RedisUtils {

@Autowired

private StringRedisTemplate redisTemplate;

public void set(String key, String value) {

ValueOperations<String, String> operations = redisTemplate.opsForValue();

operations.set(key, value);

}

public String get(String key) {

ValueOperations<String, String> operations = redisTemplate.opsForValue();

return operations.get(key);

}

public void del(String key) {

redisTemplate.delete(key);

}

}

上述代码中,StringRedisTemplate和ValueOperations分别为springboot提供的redis工具类,可以方便地进行redis操作。set方法用于put一个键值对到redis中,get方法用于根据key获取对应的value值,del方法删除指定key的键值对。

2. SpringBoot整合mongodb

2.1 引入mongodb依赖

在pom.xml文件中添加以下依赖:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-mongodb</artifactId>

</dependency>

其中,spring-boot-starter-data-mongodb为springboot提供的mongodb启动器,包括mongodb的依赖。

2.2 mongodb配置文件

在application.properties文件中添加如下配置:

#mongodb

spring.data.mongodb.database=test

spring.data.mongodb.host=127.0.0.1

spring.data.mongodb.port=27017

其中,database为默认使用的数据库名称;host是mongodb运行服务器的ip地址;port是mongodb运行服务器的端口号。

2.3 编写mongodb操作类

通过MongoTemplate实现mongodb的操作,示例如下:

import com.mongodb.client.result.DeleteResult;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.domain.Sort;

import org.springframework.data.mongodb.core.MongoTemplate;

import org.springframework.data.mongodb.core.query.Criteria;

import org.springframework.data.mongodb.core.query.Query;

import org.springframework.data.mongodb.core.query.Update;

import org.springframework.stereotype.Component;

import org.springframework.util.CollectionUtils;

import java.util.List;

@Component

public class MongoUtils {

@Autowired

private MongoTemplate mongoTemplate;

public <T> void save(T entity) {

mongoTemplate.save(entity);

}

public <T> void delete(T entity) {

mongoTemplate.remove(entity);

}

public <T> List<T> findAll(Class<T> clazz) {

return mongoTemplate.findAll(clazz);

}

public <T> List<T> find(Query query, Class<T> clazz) {

return mongoTemplate.find(query, clazz);

}

public <T> T findOne(Query query, Class<T> clazz) {

return mongoTemplate.findOne(query, clazz);

}

public <T> T findById(Object id, Class<T> clazz) {

return mongoTemplate.findById(id, clazz);

}

public <T> long count(Class<T> clazz) {

return mongoTemplate.count(new Query(), clazz);

}

public <T> long count(Query query, Class<T> clazz) {

return mongoTemplate.count(query, clazz);

}

public <T> void update(Query query, Update update, Class<T> clazz) {

mongoTemplate.updateMulti(query, update, clazz);

}

public <T> void upsert(Query query, Update update, Class<T> clazz) {

mongoTemplate.upsert(query, update, clazz);

}

public <T> void delete(Query query, Class<T> clazz) {

mongoTemplate.remove(query, clazz);

}

public <T> void deleteById(Object id, Class<T> clazz) {

mongoTemplate.remove(Query.query(Criteria.where("_id").is(id)), clazz);

}

public <T> void deleteAll(Class<T> clazz) {

mongoTemplate.remove(new Query(), clazz);

}

public <T> void deleteAll(List<T> list) {

if (CollectionUtils.isEmpty(list)) {

return;

}

list.forEach(entity -> mongoTemplate.remove(entity));

}

public <T> List<T> find(Query query, int skip, int limit, Class<T> clazz) {

query.skip(skip).limit(limit);

return mongoTemplate.find(query, clazz);

}

public <T> List<T> find(Query query, int skip, int limit, Sort sort, Class<T> clazz) {

query.skip(skip).limit(limit).with(sort);

return mongoTemplate.find(query, clazz);

}

public <T> List<T> find(Query query, int skip, int limit, String collectionName, Class<T> clazz) {

query.skip(skip).limit(limit);

return mongoTemplate.find(query, clazz, collectionName);

}

public <T> List<T> find(Query query, int skip, int limit, String collectionName, Sort sort, Class<T> clazz) {

query.skip(skip).limit(limit).with(sort);

return mongoTemplate.find(query, clazz, collectionName);

}

public <T> boolean exists(Query query, Class<T> clazz) {

return mongoTemplate.exists(query, clazz);

}

public <T> DeleteResult remove(Query query, Class<T> clazz) {

return mongoTemplate.remove(query, clazz);

}

}

其中,save方法用于插入/更新一个文档,delete方法用于删除一个文档,findAll方法用于查询所有文档,find方法支持按条件查询文档,findOne方法支持查询单个文档,findById方法支持根据id查询文档,count方法支持查询总数和按条件查询总数,update方法用于更新符合条件的所有文档,upsert方法用于更新符合条件的文档,如果不存在则新建一个文档,deleteById方法用于根据id删除相应的文档,deleteAll方法支持批量删除文档,find方法支持分页查询,并且可以指定排序规则。

3. 整合redis及mongodb实现数据缓存

在实际项目开发中,可能需要将一些数据存入redis中进行缓存,在缓存失效时再从mongodb中查询数据返回,这样可以大大减少mongodb的访问量,缩短响应时间。

示例代码如下:

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component

public class CacheUtils {

@Autowired

private RedisUtils redisUtils;

@Autowired

private MongoUtils mongoUtils;

public <T> T get(String key, Class<T> clazz) {

T result = null;

String value = redisUtils.get(key);

if (value != null) {

result = JSON.parseObject(value, clazz);

} else {

result = mongoUtils.findOne(Query.query(Criteria.where("_id").is(key)), clazz);

if (result != null) {

redisUtils.set(key, JSON.toJSONString(result), 10, TimeUnit.MINUTES);

}

}

return result;

}

public <T> void set(String key, T value, long timeout, TimeUnit unit) {

redisUtils.set(key, JSON.toJSONString(value), timeout, unit);

}

public void del(String key) {

redisUtils.del(key);

}

public <T> boolean exists(String key, Class<T> clazz) {

boolean exists = false;

String value = redisUtils.get(key);

if (value != null) {

exists = true;

} else {

T result = mongoUtils.findOne(Query.query(Criteria.where("_id").is(key)), clazz);

if (result != null) {

exists = true;

redisUtils.set(key, JSON.toJSONString(result), 10, TimeUnit.MINUTES);

}

}

return exists;

}

}

其中,get方法用于获取缓存数据,如果redis中存在,直接返回;否则从mongodb中查询数据,如果存在则将数据保存到redis中并返回;否则返回null。

set方法用于将数据存入redis中,timeout为超时时间,unit为时间单位。

del方法用于删除redis中的缓存数据。

exists方法用于判断缓存数据是否存在,如果redis中存在直接返回true;否则从mongodb中查询数据,如果存在则将数据保存到redis中并返回true;否则返回false。

通过以上代码实现了redis与mongodb的可用。通过redis的缓存,可以更快地获取数据,从而提高系统的响应速度;通过mongodb的存储,可以高效地进行数据存储,从而提高系统的存储能力。

数据库标签