概述
本篇将介绍如下几个方面:
完成运营商后台广告类型管理与广告管理、完成前台工程广告轮播图的展示、使用SpringDataRedis操作字符串、set、List、hash等类型缓存、使用SpringDataRedis实现广告数据的缓存。
广告管理
1.后台管理
1.1搭建广告工程
基于高内聚低耦合的原则,我们需要单独搭建广告服务工程。
具体操作和创建pinyougou-sellergoods服务工程差不多,这里给出几点注意事项:
1、我们目前有两个服务工程,当两个工程同时启动时会发生端口冲突,因为连接dubbox注册中心的端口默认是20880。所以我们需要配置一下pinyougou-content-service工程的dubbox端口
2、由于需要用到上传服务,还需要添加common工具包的依赖
1.2广告图片上传
将pinyougou-shop-web有关服务上传的资源拷贝到pinyougou-manager-web
在pinyougou-manager-web 的springmvc.xml中添加配置
1 | <!-- 配置多媒体解析器 --> |
在contentController.js编写代码(注意引入uploadService)
1 | //上传广告图 |
修改content.html实现上传功能
1 | <tr> |
1.3广告类目选择
在contentController.js中添加代码
1 | //加载广告分类列表 |
在content.html 初始化调用此方法,将广告分类改为下拉列表
1 | <select class="form-control" ng-model="entity.categoryId" ng-options="item.id as item.name for item in contentCategoryList"></select> |
1.4广告状态
修改content.html
1 | <input type="checkbox" ng-model="entity.status" ng-true-value="1" ng-false-value="0"> |
修改contentController.js
1 | $scope.status=["无效","有效"]; |
2.前台展示
修改首页,当其轮播广告图根据后台设置的广告列表动态产生。
2.1搭建门面工程
创建war模块pinyougou-portal-web ,此工程为网站前台的入口,参照其它war模块编写配置文件。不需要添加SpringSecurity框架
pom.xml中配置tomcat启动端口为9103
2.2后端实现
在pinyougou-content-interface工程ContentService接口增加方法定义
1 | /** |
在pinyougou-content-service工程ContentServiceImpl类增加方法
1 |
|
在pinyougou-portal-web创建控制器类 ContentController
1 |
|
2.3前端代码
在pinyougou-portal-web工程创建contentService.js
1 | app.service("contentService",function($http){ |
在pinyougou-portal-web创建contentController.js
1 | //广告控制层(运营商后台) |
在body上添加指令
1 | <body ng-app="pinyougou" ng-controller="contentController" ng-init="findByCategoryId(1)"> |
修改首页轮播图
1 | <div class="yui3-u Center banerArea"> |
这里首个循环需要增加class=”active”,效果是直接显示,否则可能页面会先出现一段空白,极不美观。
效果:
缓存解决方案
首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪。我们通常的做法有两种:一种是数据缓存、一种是网页静态化。我们今天讨论第一种解决方案。
1.SpringDataRedis简介
1.1演变过程
1、redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 、MongoDB等。
2、Jedis是Redis官方推出的一款面向Java的客户端,提供了很多接口供Java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis、SRP等等,推荐使用Jedis。
3、Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。
spring-data-redis针对jedis提供了如下功能:
1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类
2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作
1.2配置
pom.xml需要引入Jedis和SpringDataRedis依赖
1 | <!-- 缓存 --> |
resources下创建properties文件夹,建立redis-config.properties
1 | redis.host=127.0.0.1 |
maxIdle :最大空闲数
maxWaitMillis:连接时的最大等待毫秒数
testOnBorrow:在提取一个jedis实例时,是否提前进行验证操作;如果为true,则得到的jedis实例均是可用的;
resources下创建spring文件夹 ,创建applicationContext-redis.xml
1 | <context:property-placeholder location="classpath*:properties/*.properties" /> |
1.3Value类型操作
1 |
|
1.4Set类型操作
1 |
|
1.5List类型操作
(1)右压栈
1 | /** |
(2)左压栈
1 | /** |
(3)根据索引查询元素
1 | /** |
(4)移除某个元素的值
1 | /** |
1.6Hash类型操作
(1)存入值
1 |
|
(2)提取所有的KEY
1 |
|
运行结果:[a, b, c, d]
(3)提取所有的值
1 |
|
运行结果:[唐僧, 悟空, 八戒, 沙僧]
(4)根据KEY提取值
1 |
|
(5)根据KEY移除值
1 |
|
2.缓存广告数据
现在我们首页的广告每次都是从数据库读取,这样当网站访问量达到高峰时段,对数据库压力很大,并且影响执行效率。我们需要将这部分广告数据缓存起来。
2.1读取缓存
因为缓存对于我们整个的系统来说是通用功能。广告需要用,其它数据可能也会用到,所以我们将配置放在公共组件层(pinyougou-common)中较为合理。
配置可参照上文,配好后让pinyougou-content-service依赖pinyougou-common
修改 pinyougou-content-service的ContentServiceImpl
1 |
|
2.2更新缓存
当广告数据发生变更时,需要将缓存数据清除,这样再次查询才能获取最新的数据
修改pinyougou-content-service工程ContentServiceImpl.java 的add方法
1 | /** |
考虑到用户可能会修改广告的分类,这样需要把原分类的缓存和新分类的缓存都清除掉。
1 | /** |
删除广告后清除缓存
1 | /** |
结语
对比数模学品优购真的是一种享受🤔
👴不想回建模了,拜拜了您嘞