java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存

需求介绍

为了缩短用户看到首页信息的时间, 我们把首页显示的类目信息, 广告等数据放到Redis缓存中, 这样就不用通过耗时的数据库操作获取数据, 而是直接从Redis缓存中获取.

在开始之前先记录一个坑: 重启虚拟机后nginx服务器关闭了, 导致nginx上的图片无法访问, 当再次启动nginx的时候遇到

7aa2ca1cfe3c28f9b0e2c319a93375b1.png

进入nginx.conf文件把HTTPS SERVER里面的root注释掉后问题就没有了, 能正常启动.

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第1张图片

搭建Redis集群环境

实现Redis 3主3从集群搭建

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第2张图片

Redis3.0 开始支持集群,在每个 Master 上存放着各不相同的数据,即分布式存储的思想。

集群中的每个节点都需要知道集群中自己之外的其它节点。

Redis 集群主(Master(M1,M2,M3))从(Slave(S1,S2,S3))复制、读写分离 。Master 只负责写和

同步数据给 Slave,Slave 负责被读的任务,可以通过 Slave 的扩容提高读的速度。

下面先描述单机版redis的安装

首先要把redis的安装包上传到虚拟机上.

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第3张图片

安装gcc-c++编译器, 输入命令: yum install gcc-c++(我的机器已经安装过了, 第一次安装中途需要输入确定信息)

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第4张图片

解压redis安装包: tar zxvf 压缩包名...

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第5张图片

进入解压后的文件夹, 输入指令make进行编译, 结果如下

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第6张图片

接下来执行安装操作: make PREFIX=/usr/local/redis/ install(PREFIX指定了安装位置)

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第7张图片

进入bin目录后就可以登陆redis了. 但是redis有两种启动方式, 默认是前台启动: ./redis-server

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第8张图片

使用前台启动的话, 命令行就不能用来输入命令了, 可以按Ctrl + C 强行退出.

然后进入到解压目录, 把解压文件中的redis.conf文件拷贝到安装目录下: cp redis.conf /usr/local/redis/bin

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第9张图片

编辑redis.conf: vi redis.conf

397cf9d498f99f2a10bdfdafa975c250.png

重新启动redis: ./redis-server redis.conf(指定配置文件)

查看是否启动: ps -ef | grep -i redis

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第10张图片

在防火墙中配置6379端口为打开.

4fea46c02733dcbf208d59d9cb856122.png

重启防火墙: service iptables restart

测试是否能够连接上redis服务: ./redis-cli

3fde761d4e71775f030c9fd7c84d77df.png

单机安装到这里便告一段落.

下面将进行Redis3主3从集群环境搭建

安装集群需要ruby脚本, 先解压ruby脚本tar zxvf 压缩包名

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第11张图片

进入解压目录, 执行install.sh

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第12张图片

然后创建redis集群相关目录

首先在/opt目录下创建redis目录

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第13张图片

然后进入redis目录, 在这创建3个集群相关目录: mkdir conf, mkdir logs, mkdir data

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第14张图片

其中conf目录用于存放6个redis共用的配置文件

需要将原始的redis.conf配置文件, 拷贝到/opt/redis/conf中, 更名为redis-common

建议如果不熟悉的话在windows下进行配置, 然后在上传到linux中. (该配置文件已经给出, 可以到素材文件夹中获取)

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第15张图片

然后进入/usr/local/redis/bin目录中, 加入各个redis的配置文件.

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第16张图片

关闭防火墙: service iptables stop

然后启动redis的6个服务. (先把之前启动的单机redis进程kill掉)

然后逐个启动6个服务

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第17张图片

接下来要创建集群:(按照自己的ip地址进行修改), 执行目录为redis解压目录下的src目录

./redis-trib.rb create --replicas 1 192.168.117.130:6380 192.168.117.130:6381 192.168.117.130:6382 192.168.117.130:6383 192.168.117.130:6384 192.168.117.130:6385

找到执行这行命令的目录, redis压缩包的解压目录/src: 复制执行上面的命令

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第18张图片

下面连接上集群进行测试, 进入/usr/local/redis/bin

输入指令: ./redis-cli -c -p 6380, -c表示集群

0ebda063232046f94dd3ebac7ea57aca.png

这里记录一下redis集群的重启.

大致步骤是要把/opt/redis/data 目录下的文件清空, 然后重新启动每个redis服务, 最后创建redis集群.

基于SOA架构, 创建门户ashop-portal-web门户项目

在ashop项目下创建war类型子模块ashop-portal-web

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第19张图片

接着配置好pom.xml, src/main/resource下的配置文件和web.xml. 这些文件的配置可在源码中获得.

然后把静态资源复制到项目中

接着创建PageController

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第20张图片

打包部署项目, 显示出网站首页本阶段完成.

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第21张图片

实现门户首页商品类目显示

创建远程服务方法:

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第22张图片

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第23张图片

然后封装回显数据的实体类对象

在ashop-common模块下的beans包中创建CatResult类

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第24张图片

创建CatNode实体类.

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第25张图片

编写web模块的service接口和实现类, 里面涉及到json字符串的封装

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第26张图片

编写controller, 这次响应回去的类型是text/html

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第27张图片

最后实现这样的效果

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第28张图片

实现门户首页大广告轮播

远程服务提供者实现

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第29张图片

编写封装响应信息的实体类.

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第30张图片

编写web模块的service接口及实现类

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第31张图片

编写controller

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第32张图片

最后打包部署, 能在商品的大广告位看到图片

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第33张图片

实现商品类目缓存

考虑到商城首页的并发量很大, 如果每个用户的请求都从数据库中查询商品类目效率将会很低. 我们将会用redis把商品类目缓存到内存中, 加快响应速度.

整个逻辑是很好理解的:

如果redis缓存中没有商品类目数据, 就通过调用ashop-rpc远程服务获得数据, 通过处理后保存到redis中, 再返回给用户进行展示.

如果redis缓存中已经缓存了商品类目数据, 就直接返回给客户, 不需要调用ashop-rpc.

首先在pom文件中添加依赖

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第34张图片

创建applicationContext-redis.xml

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第35张图片

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第36张图片

在src下创建文件cache.properties, 记录redis中保存商品类目的键, 注意要在上面的spring配置文件中添加context头

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第37张图片

接下来修改service实现类中的逻辑

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第38张图片

实现大广告缓存, 缓存同步

缓存的逻辑和上面商品类目的缓存一样.

java电商项目的项目描述_Java电商项目-6.实现门户首页数据展示_Redis数据缓存_第39张图片

缓存同步

使用缓存就肯定要考虑缓存更新的问题. 如果后台更新了数据, 而redis缓存中的数据没有更新, 用户就会获取到非最新数据, 出现脏读.

关于实现缓存与数据库之间的同步, 以下提供两种思路:

设置key的生命周期, 定期同步数据库.

当调用远程服务操作数据库后, 同时清空缓存中的内容, 这样当客户访问时服务器将重新到数据库读取数据.

你可能感兴趣的:(java电商项目的项目描述)