您的位置:首页 > 大数据

大数据正式京淘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

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

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

商品加缓存

数据查找之前,先进行缓存判断

有,直接返回

无,将数据添加到缓存,并把数据返回

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: