大数据正式京淘9

大数据正式京淘9

redis集群总结

  • 引入槽道:14384个虚拟槽道,扩展节点,无需修改代码
  • 删除节点
    1. 线路割接
    2. 了扩容比较常见
  • 数据迁移
    • 集群命令,无需代码逻辑

槽道的本质

  • 两部分
    1. 位序列(16384位二进制)
    2. 共享数组(16384个元素)
  • 主节点
    1. 各节点的位序列各不相同
    2. 1管理;0不管理
  • 从节点位序列都为0,数据与主节点相同

前台系统

  • 设计原则
    1. 不能直接访问数据库
    2. 需要后台访问数据
  • 架构
    1. 单通道连接资源
    2. 数据源不能交叉访问
  • 安全
    1. 前台对外网挂接,不适合直接访问数据库,有安全隐患
  • 技术
    1. Jsonp
    2. httpclient(服务技术--引入jar写代码)
    3. RabbitMQ

前台首页

  • 并不和后台商品分类类似
  • 后台:每点一次,传递一个parentId,每点一次发起一个请求
  • 前台:商品分类只发起一次请求,然后封装

前台分类树

  • 图示
  • ItemCatResult
    1. json:只有一个data
    2. 每个data的List进行嵌套封装--ItemCatData【u,n,i】
    3. 其中u和n都是字符串,i是集合,i的元素又是ItemCatData
  • 一级菜单
    • 三个属性
      1. u(url)
      2. n(name)
      3. i(list集合)---下一级菜单
    • 图解
  • 二级菜单--ItemCatData对象
    • 图解
  • 三级菜单--String字符串
    • 图解

数据的封装位置

  • jt_manager项目中:因为jt_web项目访问的地址是http://manager.jt.com...来访问的
  • js直接发起请求,访问后台管理的数据,所以pojo在manager所在的项目中写
  • 为什么这么写
    • 引入Jsonp技术
  • pojo

    • ItemCatResult

      public class ItemCatResult {
      
          @JsonProperty("data")   //json序列化时指定字段名称
          private List itemCats = new ArrayList();
      
          public List getItemCats() {
              return itemCats;
          }
      
          public void setItemCats(List itemCats) {
              this.itemCats = itemCats;
          }
      
      }
      
    • ItemCatData

      public class ItemCatData {
      
          @JsonProperty("u")  // 序列化成json数据时为 u
          private String url;
      
          @JsonProperty("n")
          private String name;
      
          @JsonProperty("i")
          private List items;
      
          public String getUrl() {
              return url;
          }
      
          public void setUrl(String url) {
              this.url = url;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public List getItems() {
              return items;
          }
      
          public void setItems(List items) {
              this.items = items;
          }
      
      }
      
  • WebItemCatController

    package com.peng.controller.web;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.peng.pojo.ItemCat;
    import com.peng.service.ItemCatService;
    import com.peng.vo.ItemCatData;
    import com.peng.vo.ItemCatResult;
    
    @Controller("webController")
    public class WebItemCatController {
        @Autowired
        @Qualifier("itemCatService")
        private ItemCatService itemCatService;
    
        // 处理前台首页三层分类树
        @RequestMapping("/web/item/all")
        @ResponseBody
        public ItemCatResult queryItemsCats() {
            // 创建一个返回对象
            ItemCatResult result = new ItemCatResult();
            // 先获取所有信息
            List itemCatsList = itemCatService.queryAll();
            // <父id,子ItemCat>的关系列表
            Map> map = new HashMap>();
            for (ItemCat itemCat : itemCatsList) {
                if (!map.containsKey(itemCat.getParentId())) {
                    map.put(itemCat.getParentId(), new ArrayList());
                }
                List valuesList = map.get(itemCat.getParentId());
                valuesList.add(itemCat);
            }
    
            // 一级菜单
            List itemCatList_firstFloor = map.get(0L);// 父id为0的是一级菜单
            // 一级菜单下的列表数据
            List firstFloor_itemCatDataList = new ArrayList();
    
            // 通过循环一级菜单,构造一级菜单的列表数据
            for (ItemCat itemCat1 : itemCatList_firstFloor) {
                ItemCatData itemCatData1 = new ItemCatData();
                String url = "/products/" + itemCat1.getId() + "html";
                itemCatData1.setUrl(url);
                itemCatData1.setName("" + itemCat1.getName() + "");
                // 一级菜单下的二级菜单数据
                List itemCatList_SecondFloor = map.get(itemCat1.getId());// 获取一级菜单中下的菜单
                // 二级级菜单下的列表数据
                List SecondFloor_itemCatDataList = new ArrayList();
                // 通过循环二级菜单,构造二级菜单的列表数据
                for (ItemCat itemCat2 : itemCatList_SecondFloor) {
                    ItemCatData itemCatData2 = new ItemCatData();
                    String url2 = "/products/" + itemCat2.getId() + "html";
                    itemCatData2.setUrl(url2);
                    itemCatData2.setName("" + itemCat2.getName() + "");
                    // 二级菜单下的三级菜单数据
                    List itemCatList_ThreadFloor = map.get(itemCat2.getId());// 获取一级菜单中下的菜单
                    // 三级级菜单下的列表数据
                    List ThreadFloor_StringDataList = new ArrayList();
                    // 通过循环三级菜单,构造三级菜单的列表数据
                    for (ItemCat itemCat3 : itemCatList_ThreadFloor) {
                        String url3 = "/products/" + itemCat3.getId() + "html";
                        String name3 = itemCat3.getName();
                        // 将三级列表数据添加到三级列表
                        ThreadFloor_StringDataList.add(url3 + "|" + name3);
                    }
                    // 添加三级菜单
                    itemCatData2.setItems(ThreadFloor_StringDataList);
                    // 将二级列表数据添加到二级列表
                    SecondFloor_itemCatDataList.add(itemCatData2);
                }
                // 添加二级菜单
                itemCatData1.setItems(SecondFloor_itemCatDataList);
                // 将一级列表数据添加到一级列表
                firstFloor_itemCatDataList.add(itemCatData1);
            }
    
            // 将所有数据加入返回的结果中
            result.setItemCats(firstFloor_itemCatDataList);
            // 将菜单加入返回数据中
            return result;
        }
    
    }
    

注意

  • 这里的数据前台不能直接使用,得需要转化为js对象,json格式数据,需要jsonp
  • 前台的jquery调用方法

    $.getJsonp(url,category.getDataService){}
    
  • jsonp
    • json流行是因为他可以被js直接转化为js对象
    • 同源策略
      • 同一域名下--允许
      • 同一域名下的不同文件夹--允许
      • 不同域名--不允许
      • 主域名相同,子域名不同
    • 策略
      • 解决同源策略跨系统访问数据需要使用jsonp格式的数据
      • 在json字符串外包装一个方法名称,
      • 前台js获取

        1. 
        2. 
        
  • 前台的请求参数--给json加方法名称变成jsonp
    • callback:解析jsonp解析数据的方法名称,动态传给后台程序;
    • 后台获取,然后添加到json中,变成jsonp;引入responseBody解析对象成字符串的callBack的方法名加入json中,并返回
    • 配置文件改造

      
      
          
              
              
                  
              
              
              
                  
              
          
      
      

补充:域名

  • 域名:jt.com
  • 主域名(一级域名):www.jt.com
  • 二级域名:manager.jt.com
  • 三级域名:xx.manager.jt.com

商品详情【普通信息+商品描述】

  • 前台访问后台数据,后台接收请求数据,进行查找,然后返回数据给前台

商品加缓存

  • 数据查找之前,先进行缓存判断
    • 有,直接返回
    • 无,将数据添加到缓存,并把数据返回

这里代码相似,自己琢磨~~


你可能感兴趣的:(达内实训,大数据学习痕迹)