一、使用 MongoDB 持久化文档数据
Spring Data MongoDB 提供了三种方式在 Spring 应用中使用 MongiDB:
- 通过注解实现对象-文档映射;
- 使用 MongoTemplate 实现基于模板的数据库访问;
- 自动化的运行 Repository 生成功能。
1、启用 MongoDB
2、为模型添加注解,实现MongoDB持久化
3、使用MongoTemplate 访问MongoDB
4、编写 MongoDB Repository
二、使用 Neo4j 操作图数据
三、使用 Redis 操作 key-value 数据
1、连接到 Redis
Spring data Redis 为四种 Redis 客户端实现提供了连接工厂:
JedisConnectionFactory
JredisConnectionFactory
LettuceConnectionFactory
SrpConnectionFactory
选用一种合适的客户端,将连接工厂配置为 Spring 中的 bean:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
/**
* @author Cedar
* @DESCRIPTION: 配置redis连接工厂
* @params: []
* @return: org.springframework.data.redis.connection.RedisConnectionFactory
* @Date: 2019/2/26 17:02
*/
@Bean
public RedisConnectionFactory redisCF() {
JedisConnectionFactory cf = new JedisConnectionFactory();
cf.setHostName("127.0.0.1");
cf.setPort(6379);
cf.setPassword("password");
return cf;
}
2、使用RedisTemplate
Spring Data Redis 提供了两个模板:
RedisTemplate
StringRedisTemplate
//第一个参数是 key 的类型,第二个是 value 的类型
RedisTemplate<String,User> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(cf);
//如果 key 和 value 都是 String 可以使用 StringRedisTemplate
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(cf);
如果经常使用,可以将其配置为bean,注入到需要的地方,例如:
@Bean
public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, User> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(cf);
return redisTemplate;
}
RedisTemplate很多功能都是以子API的形式提供的,它们区分了单个值和集合值的使用场景
方法 | 子 API 接口 | 描述 |
---|---|---|
opsForValue() | ValueOperations<K, V> | 操作具有简单值的条目 |
opsForList() | ListOperations<K, V> | 操作具有 list 值的条目 |
opsForSet | SetOperations<K, V> | 操作具有 set 值的条目 |
opsForZset | ZSetOperations<K, V> | Zset(排序的set) |
opsForHash | HashOperations<K, HK, HV> | hash |
boundValueOps(K) | BoundValueOperations<K, V> | 以绑定 key 的方式,操作具有简单值的条目 |
boundListOps(K) | BoundListOperations<K, V> | |
boundSetOps(K) | ||
boundZSet(K) | ||
boundHashOps(K) |
使用简单的值
//保存user对象
redisTemplate.opsForValue().set(user.getId(), user);
//通过key获取user,不存在返回 null
User user = redis.opsForValue().get("11111");
使用List类型的值
//在 list 尾部添加一个值,如果 key 不存在列表,则会新建一个。
redis.opsForList().rightPush("cart",product);
//在列表头部添加
redis.opsForList().leftPush("cart",product);
//获取并弹出(移除)头部或尾部的值
Product first = redis.opsForList().leftPop("cart");
Product last = redis.opsForList().leftPop("cart");
//获取索引范围内的list,不会移除元素,获取[2,12)之间的元素,不包含12,超出列表的大小,只会返回索引范围内的元素,该索引范围内没有元素则返回一个空的列表
List<Product> products = redis.opsForList().range("cart",2,12)
在set上执行操作
redis.opsForSet().add("cart",product);
//获取其差异
List<Product> diff = redis.opsForSet().difference("cart1","cart2");
//求交集
List<Product> union = redis.opsFoeSet().union("cart1","cart2");
//求并集
List<Product> isect = redis.opsForSet().isect("cart1","cart2");
//移除元素
redis.opsForSet().remove(product)
//随机获取一个元素
Product random = redis.opsForSet().randomMember("catr");
绑定到某个 key 上
假设将 Product 对象保存到一个list中,并且key 为 cart ,想从list 的右侧弹出一个元素,然后在 list 的尾部新增三个元素,此时可以使用 boundListOps()
方法返回的 BoundListOperations
:
BoundListOperations<String,Product> cart = redis.boundListOps("cart");
Procuct poped = cart.rightPop();
cart.rightPush(product1);
cart.rightPush(product2);
cart.rightPush(product3);
代码只在调用 boundListOps() 的时候使用了条目的 key , 对返回的 BoundListOperations 执行的所有操作都会应用到这个 key 上。
3、使用 key 和 value 的序列化器
当某个条目保存到 Redis key-value 存储的时候,key 和 value 都会使用 Redis 的序列化器(serializer) 进行序列化。Spring Data Redis 提供了多个这样的序列化器:
GenericToStringSerializer
: 使用Spring 转换服务进行序列化;JacksonJsonRedisSerializer
: 使用 Jackson 1,将对象序列化为 JSON;Jackson2JsonRedisSerializer
: 使用 Jackson 2,将对象序列化为 JSON;JdkSerializationRedisSerializer
: 使用 Java 序列化;OxmSerializer
: 使用 Spring O/X 映射的编排器和解排器实现序列化,用于 XML 序列化;StringRedisSerializer
: 序列化 String 类型的 key 和 value。
这些序列化器都实现了 RedisSerializer
接口,如果没有符合需求的序列化器还可以自行创建。
RedisTemplate
会使用 JdkSerializationRedisSerializer
,key 和 value 都会使用 Java 序列化。
StringRedisTemplate
默认使用StringRedisSerializer
,实际上就是实现了 String 与 byte 数组之间的相互转换。
假设当使用 RedisTemplate 得时候,希望将 Product 类型的 value 序列化为 json ,key 为 String类型,可以通过 RedisTemplate 的 setKeySerializer()
和 setValueSerializer()
方法设置:
@Bean
public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, Product> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(cf);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Product>(Product.class));
return redisTemplate;
}