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的存储,可以高效地进行数据存储,从而提高系统的存储能力。