大数据正式京淘9 心已赠人 2022-06-01 06:23 234阅读 0赞 # 大数据正式京淘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,每点一次发起一个请求 * 前台:商品分类只发起一次请求,然后封装 ### 前台分类树 ### * 图示 * ![p7XxhwM.png][] * 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集合)---下一级菜单 * 图解 * ![6YjkOUL.png][] * 二级菜单--ItemCatData对象 * 图解 * ![wHBmpFy.png][] * 三级菜单--String字符串 * 图解 * ![TWEnvu8.png][] ### 数据的封装位置 ### * 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 # 商品详情【普通信息+商品描述】 # * 前台访问后台数据,后台接收请求数据,进行查找,然后返回数据给前台 # 商品加缓存 # * 数据查找之前,先进行缓存判断 * 有,直接返回 * 无,将数据添加到缓存,并把数据返回 ### 这里代码相似,自己琢磨~~ ### [p7XxhwM.png]: https://i.imgur.com/p7XxhwM.png [6YjkOUL.png]: https://i.imgur.com/6YjkOUL.png [wHBmpFy.png]: https://i.imgur.com/wHBmpFy.png [TWEnvu8.png]: https://i.imgur.com/TWEnvu8.png
相关 大数据正式京淘3 大数据正式京淘3 EasyUI简介 文档 每个组件的easyui有属性、方法和事件。用户可以方便地扩展。 属性 Dear 丶/ 2022年06月02日 12:51/ 0 赞/ 221 阅读
相关 大数据正式京淘2 大数据正式京淘2 项目统一 编码:UTF-8 环境:JDK1.8 Maven:3.5 数据库:5.5 项目支撑系统搭建 新建w 末蓝、/ 2022年06月02日 12:27/ 0 赞/ 201 阅读
相关 大数据正式京淘正式14 大数据正式京淘正式14 传统的检索方式 1.文本检索/windows检索 全文检索、全文遍历 加载到内存中 缺点:数据一多,无法高效查询 蔚落/ 2022年06月01日 13:54/ 0 赞/ 172 阅读
相关 大数据正式京淘13 大数据正式13 定时任务 防止恶意订单 在订单提交之后,没有支付,但是订单没有生成效益,却减少了库存,如果大量生成这种订单,库存到0, 青旅半醒/ 2022年06月01日 12:43/ 0 赞/ 55 阅读
相关 大数据正式京淘10 大数据正式京淘10 数据库的读写分离 电商项目京淘项目的瓶颈有哪些 1. 数据库瓶颈 2. IO【图片(文件)的上传】 我就是我/ 2022年06月01日 07:19/ 0 赞/ 216 阅读
相关 大数据正式京淘9 大数据正式京淘9 redis集群总结 引入槽道:14384个虚拟槽道,扩展节点,无需修改代码 删除节点 1. 线路割接 2. 心已赠人/ 2022年06月01日 06:23/ 0 赞/ 235 阅读
相关 大数据正式京淘7 大数据正式京淘7 解决入口流量--NGINX的集群分配问题 解决:配置多台DNS域名解析器 图解 ![lzglcWQ.png][ ╰半橙微兮°/ 2022年06月01日 04:37/ 0 赞/ 174 阅读
相关 大数据正式京淘6 大数据正式京淘6 Redis基础命令 set key value【修改值】 incr key【自增】 decr key【自减】 incrby 秒速五厘米/ 2022年06月01日 02:30/ 0 赞/ 191 阅读
相关 大数据正式京淘4 大数据正式京淘4 数据库性能 数据库需要维护外键的内部关联(if语句,用代码关联) 涉及外键的操作增删改查,判断外键消耗资源 外键存在导致数据库的 冷不防/ 2022年06月01日 00:23/ 0 赞/ 73 阅读
还没有评论,来说两句吧...