下面介绍使用Spring Data集成MongoDB、Redis实现Spring Boot应用与NoSQL数据库的集成和开发。
Spring Boot集成MongoDB
● 方式一:使用MongoDB Repository使用Spring Data MongoDB Repository可以让你不用写相关的查询组合语句,只要按规定定义好接口名就可以。Repository接口是Spring Data的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法。
Repository提供了最基本的数据访问功能,其子接口扩展了一些功能,具体关系如下。
○ Repository:仅仅是一个标识,表明任何继承它的均为仓库接口类。
○ CrudRepository:继承Repository,实现了一组CRUD相关的方法。
○ PagingAndSortingRepository:继承CrudRepository,实现了分页排序相关的方法。
○ MongoRepository:继承 PagingAndSortingRepository,实现了一组MongoDB规范相关的方法。
○ 自定义的XxxxRepository:需要继承MongoRepository,这样XxxxRepository接口就具备了通用的数据访问控制层的能力(CURD的操作功能)。
● 方式二:使用MongoTemplate
MongoRepository的缺点是不够灵活,而MongoTemplate正好可以弥补MongoRepository的不足,下面是MongoTemplate的主要功能。
○ MongoTemplate实现了MongoOperations Interface。
○ MongoDB documents和domain classes之间的映射关系是通过实现MongoConverter这个interface的类来实现的。
○ MongoTemplate提供了很多操作MongoDB的API方法,都是线程安全的,可以在多线程的情况下使用。
○ MongoTemplate实现了MongoOperations接口,此接口定义了众多的操作方法,如find、findAndModify、findOne、insert、remove、save、update和updateMulti等。
○ MongoTemplate将domain object转换为DBObject,默认转换 类 为 MongoMappingConverter , 并 提 供 了 Query 、Criteria、Update等流式API。
MongoTemplate核心操作类包括Criteria和Query。Criteria类封装所有的语句,以方法的形式查询。Query类将语句进行封装或者添加排序之类的操作。
● MongoTemplate示例
首先,添加Maven依赖。
其次,配置文件如下。
然后,定义实体类,@Document注解中的参数Person代表MongDB中维护的文档对象。@Field注解代表一个字段,可以不加,默认以参数名为列名,如果加上@Field,可以给映射存储到MongDB的字段取别名。如下面实例中的age属性在MongDB中的列名为“Age”。
最后,使用MongoTemplate实现文档访问,代码如下。
Spring Boot集成Redis
Redis作为一种NoSQL数据库,提供了一种高效的缓存方案,Redis提供单点、主从、哨兵和集群等不同的配置和部署方式。
● 单点模式:又称单节点模式,是最简单的Redis模式,只有一个Redis实例。如果只是自己测试缓存或者小程序,数据量很小,仅仅做一个小型的Key/Value型数据库,完全足够。
● 主从模式:就是N个Redis实例,可以是1主N从,也可以是N主N从。(N主N从则不是严格意义上的主从模式了,后续的集群模式会说到,N主N从就是N+N个Redis实例。)
● 哨兵模式:又称Sentinel模式,Sentinel的中文含义是哨兵、守卫。也就是说,既然在主从模式中,Master节点挂了以后,Slave节点不能主动选举一个Master节点出来,那么我们就安排一个或多个Sentinel来做这件事;当Sentinel发现Master节点挂了时,Sentinel就会从Slave节点中重新选举一个Master节点。
● 集群模式:只需要将每个数据库节点的Cluster-Enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行。
Redis不同的模式配置
首先,引入Maven依赖。
其次,添加配置如下。
然后,根据redis.type配置RedisConnectionFactory。
单点模式配置如下:
哨兵模式配置如下:
集群模式配置如下:
Redis序列化方案
下面使用封装好的RedisUtils操作Redis工具类。这个RedisUtils交给Spring容器实例化,使用时直接注解注入即可。
spring-data-redis的序列化类有下面几种。
● GenericToStringSerializer:可以将任何对象泛化为字符串并序列化。
● Jackson2JsonRedisSerializer:跟JacksonJsonRedisSerializer实际上是一样的。
● JacksonJsonRedisSerializer:序列化object对象为JSON字符串。
● JdkSerializationRedisSerializer:序列化Java对象(被序列化的对象必须实现Serializable接口),无法转义成对象。
● StringRedisSerializer:简单的字符串序列化。
● GenericToStringSerializer:类似StringRedisSerializer的字符串序列化。
● GenericJackson2JsonRedisSerializer:类似Jackson2JsonRedisSerializer,但使用时构造函数不使用特定的类,参考以上序列化,自定义序列化类。