SpringCloud + MongoDB 实现订单缓存

此篇梳理了一下SpringCloud 整合 MongoDB 的简易流程。

版本

  • Spring Cloud : Greenwich.RC2
  • openfeign : 2.0.1.RELEASE
  • MongoDB :4.08
  • 可视化工具 : adminMongo ( 或者使用 TreeDMS 都不错 )
  • 假设MongoDB 已经安装完成 ,且已添加User
    ( 快速安装 参考以下链接 易百教程)

数据结构:
在这里插入图片描述

1 Maven 依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

属性配置

//application 中加入配置 
spring.data.mongodb.uri=mongodb://admin:123456@localhost:27017/antcache

//账户 : admin 
//密码 : 123456 
2 工具类
package com.antsystem.servercache.servercache.utils;

import com.alibaba.fastjson.JSONObject;
import com.mongodb.DBObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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 java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author 10169
 * @Description TODO
 * @Date 2019/4/6 14:02
 * @Version 1.0
 **/
@Component
public class MongodbUtil {

    Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    MongoTemplate mongoTemplate;

    /**
     * 插入JSON字符串
     *
     * @param json
     */
    public void InsertJSON(String table, String json) {
        logger.info("table is :{}--json is :{}", table, json);
        mongoTemplate.insert(json, table);
    }

    /**
     * 删除指定表的JSON字符串
     */
    public void deleteJSON(String table, String key) {
        mongoTemplate.remove(new Query(Criteria.where("id").is(key)), table);
    }

    /**
     * <p>修改指定表的JSON字符串</p>
     * <p>这里进行更细微化的操作</>
     *
     * @param table
     */
    public void deleteJSON(String table, String key, String c) {
        Query query = new Query(Criteria.where("id").is(key));
        Update update = new Update().addToSet(key, mongoTemplate);
        mongoTemplate.updateFirst(query, update, table);
    }

    /**
     * 查询指定表的字符串
     */
    public List<JSONObject> getJSONById(String table, String key) {
        return mongoTemplate.find(new Query(Criteria.where("id").is(key)), JSONObject.class, table);
    }

    /**
     * 查询指定表的所有数据
     */
    public List<JSONObject> getJSONList(String table) {
        return mongoTemplate.find(new Query(), JSONObject.class, table);
    }


    /**
     * 查询指定表的所有数据
     *
     * @Return List<JSONObject>
     */
    public List<JSONObject> getJSONListByFilter(String table, Map<String, Object> filterMap) {
        List<Criteria> list = new ArrayList<Criteria>();
        filterMap.keySet().forEach(key -> {
            logger.info("key is :{}--value is:{}", key, filterMap.get(key));
            list.add(Criteria.where(key).is(filterMap.get(key)));
        });
        // 查看源码可知 andOperator 可接受一个不限长度的
        return mongoTemplate.find(new Query(new Criteria().andOperator(list.toArray(new Criteria[0]))), JSONObject.class, table);
    }


    /**
     * 查询指定表的字符串
     *
     * @Return List<DBObject>
     */
    public List<DBObject> getJSONByIdDBO(String table, String key) {
        return mongoTemplate.find(new Query(Criteria.where("id").is(key)), DBObject.class, table);
    }

    /**
     * 查询指定表的所有数据
     *
     * @Return List<DBObject>
     */
    public List<DBObject> getJSONListDBO(String table) {
        return mongoTemplate.find(new Query(), DBObject.class, table);
    }

    /**
     * 查询指定表的所有数据
     *
     * @Return List<DBObject>
     */
    public List<DBObject> getJSONListByFilterDBO(String table, Map<String, Object> filterMap) {
        List<Criteria> list = new ArrayList<Criteria>();
        filterMap.keySet().forEach(key -> {
            logger.info("key is :{}--value is:{}", key, filterMap.get(key));
            list.add(Criteria.where(key).is(filterMap.get(key)));
        });
        // 查看源码可知 andOperator 可接受一个不限长度的
        return mongoTemplate.find(new Query(new Criteria().andOperator(list.toArray(new Criteria[0]))), DBObject.class, table);
    }

    /**
     * DBObject To JSONObject
     */
//    public List<JSONObject> dbToJson(String table) {
//        return mongoTemplate.find(new Query(), DBObject.class, table);
//    }
}

3 装换器

转换器在结构上可有可无 ,目的在于MongoDB 作为一个微服务应用的时候 ,对于返回的数据以何种方式返回

Utils 中有两种方式 ,一种查询出来为JOSNObject , 一种为DBObject , JOSNObject 在某种程度上和框架耦合 ,使用其他的JSON 框架时可能会比较麻烦 。 所以 在这里加入了转换器的概念 ,用于装换为统一的数据 。

public abstract class CacheResponse {

    Logger logger = LoggerFactory.getLogger(getClass());

    public List<Object> cacheBack(List<DBObject> list) {
        List<Object> backList = new LinkedList<>();
        for (Object db : list) {
            logger.info("db is :{}", JSONObject.toJSONString(db));
            backList.add(JSONObject.toJSON(db));
        }
        return backList;
    }
}

// controller 继承 public class OrderController extends CacheResponse
4 接收

feign 接收数据 , 这里直接是使用String 类型接收 ,没有问题

@FeignClient(value = "server-cache",fallback = ServerCacheFailBack.class)
public interface ServerCacheMapper {

    @GetMapping("getOrderList")
    public List<String> getOrderList(@RequestParam("type") String type);
}

我这边是直接使用JSONObject 将其转换为VO对象

    public List<LogisticsOrderVO> findAllByCache() {
        logger.info("查询订单 cache 缓存:>>>>>>");
        List<String> wrapper = cacheMapper.getOrderList("ALL");
        logger.info("查询订单 cache 缓存结果:{}", wrapper);
        List<LogisticsOrderVO> list = new LinkedList<>();
        for (String sjosn : wrapper) {
            list.add(JSONObject.parseObject(sjosn).toJavaObject(LogisticsOrderVO.class));
        }
        return list;
    }
5 展示效果

在这里插入图片描述

6 小结

MongoDB 是基于文档形式的存储数据库 , 不同于Redis ,我们可以将JSON 数据进行非常直观的存储 ,而又拥有高效的性能,可用于 查看订单信息等这类无需对订单进行操作的场景 。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值