大数据正式京淘9
2018-01-22 20:57
218 查看
大数据正式京淘9
redis集群总结
引入槽道:14384个虚拟槽道,扩展节点,无需修改代码删除节点
线路割接
了扩容比较常见
数据迁移
集群命令,无需代码逻辑
槽道的本质
两部分位序列(16384位二进制)
共享数组(16384个元素)
主节点
各节点的位序列各不相同
1管理;0不管理
从节点位序列都为0,数据与主节点相同
前台系统
设计原则不能直接访问数据库
需要后台访问数据
架构
单通道连接资源
数据源不能交叉访问
安全
前台对外网挂接,不适合直接访问数据库,有安全隐患
技术
Jsonp
httpclient(服务技术--引入jar写代码)
RabbitMQ
前台首页
并不和后台商品分类类似后台:每点一次,传递一个parentId,每点一次发起一个请求
前台:商品分类只发起一次请求,然后封装
前台分类树
图示ItemCatResult
json:只有一个data
每个data的List进行嵌套封装--ItemCatData【u,n,i】
其中u和n都是字符串,i是集合,i的元素又是ItemCatData
一级菜单
三个属性
u(url)
n(name)
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<ItemCatData> itemCats = new ArrayList<ItemCatData>(); public List<ItemCatData> getItemCats() { return itemCats; } public void setItemCats(List<ItemCatData> 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<ItemCat> itemCatsList = itemCatService.queryAll(); // <父id,子ItemCat>的关系列表 Map<Long, List<ItemCat>> map = new HashMap<Long, List<ItemCat>>(); for (ItemCat itemCat : itemCatsList) { if (!map.containsKey(itemCat.getParentId())) { map.put(itemCat.getParentId(), new ArrayList<ItemCat>()); } List<ItemCat> valuesList = map.get(itemCat.getParentId()); valuesList.add(itemCat); } // 一级菜单 List<ItemCat> itemCatList_firstFloor = map.get(0L);// 父id为0的是一级菜单 // 一级菜单下的列表数据 List<ItemCatData> firstFloor_itemCatDataList = new ArrayList<ItemCatData>(); // 通过循环一级菜单,构造一级菜单的列表数据 for (ItemCat itemCat1 : itemCatList_firstFloor) { ItemCatData itemCatData1 = new ItemCatData(); String url = "/products/" + itemCat1.getId() + "html"; itemCatData1.setUrl(url); itemCatData1.setName("<a href='" + url + "'>" + itemCat1.getName() + "</a>"); // 一级菜单下的二级菜单数据 List<ItemCat> itemCatList_SecondFloor = map.get(itemCat1.getId());// 获取一级菜单中下的菜单 // 二级级菜单下的列表数据 List<ItemCatData> SecondFloor_itemCatDataList = new ArrayList<ItemCatData>(); // 通过循环二级菜单,构造二级菜单的列表数据 for (ItemCat itemCat2 : itemCatList_SecondFloor) { ItemCatData itemCatData2 = new ItemCatData(); String url2 = "/products/" + itemCat2.getId() + "html"; itemCatData2.setUrl(url2); itemCatData2.setName("<a href='" + url2 + "'>" + itemCat2.getName() + "</a>"); // 二级菜单下的三级菜单数据 List<ItemCat> itemCatList_ThreadFloor = map.get(itemCat2.getId());// 获取一级菜单中下的菜单 // 三级级菜单下的列表数据 List<String> ThreadFloor_StringDataList = new ArrayList<String>(); // 通过循环三级菜单,构造三级菜单的列表数据 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. <script src="访问地址"></script> 2. <script>对应的方法名(data){具体操作}</script>
前台的请求参数--给json加方法名称变成jsonp
callback:解析jsonp解析数据的方法名称,动态传给后台程序;
后台获取,然后添加到json中,变成jsonp;引入responseBody解析对象成字符串的callBack的方法名加入json中,并返回
配置文件改造
<!-- MVC注解驱动 --> <mvc:annotation-driven> <mvc:message-converters> <!-- 补充原有的文本转化器 --> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg index="0" value="UTF-8"></constructor-arg> </bean> <!-- 添加自定义的转化器 --> <bean class="com.peng.spring.exetend.jackson.CallbackMappingJackson2HttpMessageConverter"> <property name="callbackName" value="callback"></property> </bean> </mvc:message-converters> </mvc:annotation-driven>
补充:域名
域名:jt.com主域名(一级域名):www.jt.com
二级域名:manager.jt.com
三级域名:xx.manager.jt.com
商品详情【普通信息+商品描述】
前台访问后台数据,后台接收请求数据,进行查找,然后返回数据给前台商品加缓存
数据查找之前,先进行缓存判断有,直接返回
无,将数据添加到缓存,并把数据返回
这里代码相似,自己琢磨~~
相关文章推荐
- DataUml Design 课程6-DataUML Design 1.1版本号正式宣布(支持PD数据模型)
- App Analytics 苹果全新应用数据分析功能正式向开发者开放
- 呵呵 随着阿里云的开通要正式搞搞大数据了
- 最具投资价值的大数据与AI医疗领域区块链项目—元链DHC正式开启!
- 大数据正式6
- 淘宝开放平台正式环境获取数据(一)
- 全球云端数据仓库领导者 MaxCompute 将于本月10日正式开服美东节点
- 大数据正式9
- 大数据正式11
- 数据科学虚拟机镜像正式上线
- 阿里巴巴解决数据拆分的伪分布式数据库 中间件Cobar正式开源
- 大数据正式19
- 大数据正式京淘12
- 大数据正式38
- 打正式包混淆时遇到的坑,不要把依赖包里的model给混淆了,否则json解析的时候会找不到model,导致加载不出数据,都是null
- 大数据正式Zebra1
- 中国政法大学数据安全与应用规范研究基地正式成立
- DataUml Design 教程6-DataUML Design 1.1版本正式发布(支持PD数据模型)
- 大数据正式京淘11
- 大数据正式1