使用 NoSQL 数据库

一、使用 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 值的条目
opsForSetSetOperations<K, V>操作具有 set 值的条目
opsForZsetZSetOperations<K, V>Zset(排序的set)
opsForHashHashOperations<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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值