学习主题:门户数据展示_Redis缓存数据
一、Redis_3主3从集群环境搭建
谈单你对读写分离和主从同步的理解
读写分离:Master负责写数据的操作,salve负责读数据的操作
主从同步:salve是对master的备份,将数据写入到master中,会被同步到salve中
谈谈redis集群进行数据和slot映射的思想
整个redis集群将集群存储空间分为16384(0—16383)个slot(槽),
将16384个slot分散到集群中的每个服务器节点。
在集群存储数据的时候,首先进行CRC16算法,根据运算结果将key对应的执行保存到对应的slot。
二、创建门户ego-portal-web项目
描述ego-portal-web项目中需要的依赖
<dependencies>
<dependency>
<groupId>com.bjsxt.ego</groupId>
<artifactId>ego-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.bjsxt.ego</groupId>
<artifactId>ego-rpc-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<!-- zookeeper客户端依赖 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- json到java对象的序列化和反序列化 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<path>/</path>
<port>8081</port>
</configuration>
</plugin>
</plugins>
</build>
描述ego-portal-web项目中web.xml配置内容
<?xml version= "1.0" encoding= "UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>ego-portal-web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- <servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/favicon.ico</url-pattern>
</servlet-mapping> -->
<!-- 以监听器的方式启动spring容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<!-- POST请求的乱码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 指定编码方式 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!-- 映射filter -->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- springmvc的servlet -->
<servlet>
<servlet-name>ego-portal-web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定springmvc的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<!-- 让springmvc随系统启动而启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ego-portal-web</servlet-name>
<!-- 伪静态化,接收.html结尾的请求 -->
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
三、加载门户首页商品类目
描述加载首页商品类目的实现思路
把鼠标放到商品的类目分类时,后台会发送一个ajax请求,
查询数据库,将数据库中的数据响应回来为json字符串,
将字符串解析为json对象并将其响应到前端页面,
前端页面接收到数据后将商品类目加载出来
描述需要响应到前端的商品类的数据结构和规范
后台得到的是list集合,需要遍历list集合,
将其转换为符合前端规范的数据格式(json格式的字符串),
前台接收到json格式的字符串后,将其转换为json格式对象响应到浏览器端。
@Service
public class PortalItemCatServiceImpl implements PortalItemCatService {
@Autowired
private ItemCatService itemCatServiceProxy;
//加载前台首页的商品类目
@Override
public String loadItemCatService() {
List<TbItemCat> list = itemCatServiceProxy.loadItemCatListService();
//创建CatResult对象
CatResult result = new CatResult();
//将list集合转换为符合前端规范数据格式,递归遍历list
List<?> data = getChildren(0L, list);
result.setData(data);
//将result对象转换为json字符串
String str = JsonUtils.objectToJson(result);
return str;
}
private List<?> getChildren(Long parentId, List<TbItemCat> itemCats) {
// 盛放指定分类下的所有子分类信息
List resultList = new ArrayList();
for (TbItemCat itemCat : itemCats) {
if (itemCat.getParentId().equals(parentId)) {
if (itemCat.getIsParent()) {
// 如果itemCat代表一级分类或者二级分类
CatNode catNode = new CatNode();
if (itemCat.getParentId().longValue() == 0) {
// 如果是一级分类 "<a href='/products/1.html'>图书、音像、电子书刊</a>",
catNode.setName(
"<a href='/products/" + itemCat.getId() + ".html'>" + itemCat.getName() + "</a>");
} else {
// 如果是二级分类 "电子书刊",
catNode.setName(itemCat.getName());
}
// "/products/2.html",
catNode.setUrl("/products/" + itemCat.getId() + ".html");
catNode.setList(getChildren(itemCat.getId(), itemCats));
// 将节点添加到list集合中
resultList.add(catNode);
} else {
// 如果itemCat表示三级分类 "/products/3.html|电子书",
resultList.add("/products/" + itemCat.getId() + ".html|" + itemCat.getName());
}
}
}
return resultList;
}
}
前端的数据格式规范
![71a0ca2e3e69759488ee19e6aa2b0894.png](https://i-blog.csdnimg.cn/blog_migrate/418db3959db14aaec9969e3dda8c3ea7.png)
四、加载门户首页大广告
描述实现加载首页大广告的实现思路
根据内容类目的id到数据库中查询内容数据,
在提供端将查询到的数据封装到list集合中,在消费端调用远程服务,
将list集合中的数据转换成json格式的字符串发送到前台,
前台接收到字符串之后,将字符串转换成json格式的对象,
然后将json格式对象推送到浏览器端。
描述后端响应到前端的大广告数据格式
后端将list集合中的数据转换成json格式的字符串响应到前端,
前端将字符串转换成json格式的对象推送到浏览器。
![a9181a50f6f63c42232ea7061f3456ca.png](https://i-blog.csdnimg.cn/blog_migrate/329ff75433b02af47e313cc9fbc501e4.jpeg)
五、实现商品类目_大广告缓存_缓存同步
描述实现缓存同步的思路
(1)如果redis缓存中没有数据,通过调用ego-rpc服务,查询数据库获得商品类目数据,
将ego-rpc返回的数据进行处理,保存到redis缓存,在返回到ego-portal-web进行展示
(1)如果redis缓存中有数据,直接将缓存中的数据返回给ego-rpc-web,不用调用ego-rpc服务查询数据库。
描述实现数据缓存的实现思路和缓存,数据库查询顺序
1.可以设置 key 的生命周期,定期的和数据库同步
2.当 ego-rpc 对数据库数据完成增删改的时候,清空 redis 中缓存的数据,
ego-portal-web,重新调用远程服务查询数据库获得数据,再次放入缓存中。